fhist-1.18/README 644 0 0 2306611265752627 127170ustar PeterMiller 0 0ReadMe(FHist) ReadMe(FHist) NAME fhist - file history and comparison tools Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009 Peter Miller; Portions of this program are Copyright (C) 1990 David I. Bell. The fhist package is distributed under the terms of the GNU General Public License, see the LICENSE section, below, for more information. DESCRIPTION The FHist package contains 3 utilities, a file history tool "fhist", a file comparison tool "fcomp", and a file merging tool "fmerge". All three are bundled together, because they all use the same minimal- difference algorithm. fhist Keeps track of versions of a file. It works correctly when given binary files as input. See fhist(1) for more information. fcomp Compares two versions of a file, usually line-for-line textual comparison. It is capable of comparing two binary files byte- for-byte. See fcomp(1) for more information. fmerge Merges together edits from two descendants of a file. See fmerge(1) for more information. The history tool presented here, fhist, is a minimal history tool. It provides no locking or branching. This can be useful in contexts where the configuration management or change control be being provided by some other tool. REFERENCES This program is based on the algorithm in An O(ND) Difference Algorithm and Its Variations, Eugene W. Myers, TR 85-6, 10-April-1985, Department of Computer Science, The University of Arizona, Tuscon, Arizona 85721. See also: A File Comparison Program, Webb Miller and Eugene W. Myers, Software Practice and Experience, Volume 15, No. 11, November 1985. BUILDING For complete instructions for host to build these programs, see the BUILDING file included in this distribution. ARCHIVE SITE The latest version of fhist is available on the Web from: URL: http://fhist.sourceforge.net/ File: index.html # The FHist page. File: fhist-1.18.README # Description, from the tar file File: fhist-1.18.lsm # Description, in LSM format File: fhist-1.18.spec # RedHat package spec File: fhist-1.18.tar.Z # The complete source. FHist is also carried by sunsite.unc.edu in its Linux archives. You will be able to find FHist on any of its mirrors. URL: ftp://sunsite.unc.edu/pub/Linux/devel/vc/ File: fhist-1.18.README # Description, from the tar file File: fhist-1.18.lsm # Description, in LSM format File: fhist-1.18.spec # RedHat package spec File: fhist-1.18.tar.Z # The complete source. This site is extensively mirrored around the world, so look for a copy near you (you will get much better response). COPYRIGHT fhist version 1.18.D001 Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009 Peter Miller; This program is derived from a work Copyright (C) 1990 David I. Bell. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . AUTHORS Peter Miller Web: http://miller.emu.id.au/pmiller/ /\/\* E-Mail: pmiller@opensource.org.au David I. Bell Web: http://www.canb.auug.org.au/~dbell E-Mail: dbell@canb.auug.org.au RELEASE NOTES For excruciating detail, and also acknowledgements of those who generously sent me feedback, please see the etc/CHANGES.1.18 file included in this distribution. A number of features and bug fixes have been added to fhist with this release. A few of them are detailed here: Version 1.18 (16-Oct-2009) * The .XX macro usage has been made conditional in the man pages, to silence Debian lintian warnings. * The use of naked "-" have been replaced with "\-" for option introducers, "\[hy]" for hyphens, and "\[mi]" for minus signs, to silence Debian lintian warnings. * The author's email address has been updated. Version 1.17 (17-Jun-2008) * The licenseis now GPLv3. * The fhist(1) command now accepts a remark string on the command line. Version 1.16 (20-Dec-2005) * There is a new fmerge -ignore-identical-conflicts option which may be used to suppress logical conflicts in which the same thing is done by both variants. This is often a better match for users' expectations for merging source code. Version 1.15 (8-Nov-2005) * There is a new fcomp -no-binary option, which may be used to prevent the comparison of binary files, instead it treats them both as empty. * A small build problem on MacOS X has been fixed. Version 1.14 (8-Jun-2004) * The ./configure script now understands the --with-nlsdir option, so that you can place the .mo files. * The fhist(1) program is now able to cope with numeric modules names. * The occasional false negative from test 26 has been fixed. It was failing for some users because of message translation (internationalization) issues. Version 1.13 (13-Mar-2003) * A bug has been fixed in some of the tests. They were susceptible to false negatives if the display width changed. * All references to the cuserid function have been replaced. It isn't sufficiently portable to be used in real programs. Version 1.12 (28-Nov-2002) * Some build problems have been fixed. Version 1.11 (26-Nov-2002) * Some build problems, relating to modern ANSI C compilers choking on K&R function definitions with variable arguments, have been fixed. * Two bugs relating to the handling of binary files by fhist(1) have been fixed. * A bug which left garbage files behind when a create failed has been fixed. Version 1.10 (9-Jul-2002) * Interrupt handling has been improved. * There is a new fhist -No_Keywords option, used to completely disable keyword substitution. * Several build problems have been fixed. Version 1.9 (23-Oct-2001) No public release. Version 1.8 (16-Oct-2001) * There is a new -BINary option for the fcomp(1) program, which compares binary files a byte at time, printing the results in hexadecimal. * The fcomp(1) program now silently copes with CRLF line terminations. Version 1.7 (11-Apr-2000) * The fhist(1) command now has a -binary option, which may be used to store the history of binary files. * The fhist(1) command has a new -make-path option, which requests that the history directory be created if necessary. * A bug in fhist(1) wich caused a SEGFAULT when you used the -t option (extract to terminal) has been fixed. Version 1.6 (25-Oct-1999) * An RPM spec file has been added to the distribution. * The code is now more robust about what various UNIX systems return from pathconf(). * A bug with the "fcomp -blank" option has been fixed. Version 1.5 (1-Jun-1999) * Binary files are now detected on input, and the utilities file gracefully with a warning or error message, as appropriate. * Some buffer over-run bugs have been fixed. * Several improvements have been made to the portability. Version 1.4 (16-Sep-1998) * The install and build procedures have been made more robust, and they take note of more of the information provided by GNU Autoconf. * The error messages have been internationalized, so it is now possible to obtain error messages in your native language. (If you would like to contribute with error message translations, please contact the author.) * An LSM description has been added, along with a HTML page to present it all nicely at the archive site. * A RedHat Package Manager spec file has been added, so that a RedHat package can be created. The spec file is in the standard distribution. Version 1.3 (29-Mar-1998) This version was not distributed at all. Version 1.2 This version was not distributed very widely. * The non-standard isblank function is no longer used, it cause too many portability problems. * The use of pathconf is not more robust for more operating systems. Version 1.1 * The fhist package now uses a shell script called configure to configure itself. This script is generated using the GNU Autoconf utility. This should make fhist significantly easier to configure, and significantly more portable. * A bug has been fixed in the conflict reporting of the fmerge program. It now correctly opens the conflicts file. * The fhist program now uses pathconf(2) to determine file name length limits. Reference Manual FHist ReadMe(FHist) fhist-1.18/BUILDING 644 0 0 3053511265752627 131560ustar PeterMiller 0 0Building(FHist) Building(FHist) NAME fhist - file history and comparison tools Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009 Peter Miller Portions of this program are Copyright (C) 1990 David I. Bell. The fhist package is distrributed under the terms of the GNU General Public License, see the LICENSE section, below, for more information. SPACE REQUIREMENTS You will need about 600K to unpack and build the fhist package. (This is the worst case seen so far, most systems have binaries about 60% as big as this, 400K is more typical.) Your mileage may vary. BEFORE YOU START There are a few pieces of software you may want to fetch and install before you proceed with your installation of cook. GNU Gettext The fhist package has been internationalized. It can now print error messages in any of the supported languages. In order to do this, the GNU Gettext package must be installed before you run the configure script as detailed in the next section. This is because the configure script looks for it. On systems which use the GNU C library, version 2.0 or later, there is no need to explictly do this as GNU Gettext is included. Remember to use the GNU Gettext configure --with-gnu-gettext option if your system has native gettext tools. GNU Groff The documentation for the fhist package was prepared using the GNU Groff package. This distribution includes full documentation, which may be processed into PostScript or DVI files at install time - if GNU Groff has been installed. Bison If your operating system does not have a native yacc(1) you will need to fetch and install GNU Bison in order to build the fhist package. An ANSI C compiler. You must have an ANSI C compiler to compile this program. You may also want to consider fetching and installing the GNU C Compiler if you have not done so already. The GNU FTP archives may be found at prep.ai.mit.edu, and are mirrored around the world. SITE CONFIGURATION The fhist package is configured using the configure shell script included in this distribution. The configure shell script attempts to guess correct values for various system-dependent variables used during compilation, and creates the Makefile and common/config.h files. It also creates a shell script config.status that you can run in the future to recreate the current configuration. Normally, you just cd to the directory containing fhist's source code and type % ./configure ...lots of output... % If you're using csh on an old version of System V, you might need to type % sh configure ...lots of output... % instead to prevent csh from trying to execute configure itself. Running configure takes a minute or two. While it is running, it prints some messages that tell what it is doing. If you don't want to see the messages, run configure with its standard output redirected to /dev/null; for example, % ./configure > /dev/null % By default, configure will arrange for the make install command to install the fhist package's files in /usr/local/bin and /usr/local/man. There are a number of options which control the placement of these files. --prefix=PATH You can specify an installation prefix other than /usr/local by giving configure the option --prefix=PATH. --exec-prefix=PATH You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give configure the option --exec-prefix=PATH the fhist package will use PATH as the prefix for installing programs and libraries. Data files and documentation will still use the regular prefix. Normally, all files are installed using the same prefix. --bindir=PATH This directory contains executable programs. On a network, this directory may be shared between machines with identical hardware and operating systems; it may be mounted read-only. Defaults to ${exec_prefix}/bin unless otherwise specified. --datadir=PATH This directory contains installed data, such as the documentation, reports and shell scripts distributed with Aegis. On a network, this directory may be shared between all machines; it may be mounted read-only. Defaults to ${prefix}/share/aegis unless otherwise specified. An "aegis" directory will be appended if there is none in the specified path. --libdir=PATH This directory contains installed data, such as the error message catalogues. On a network, this directory may be shared between machines with identical hardware and operating systems; it may be mounted read-only. Defaults to ${exec_prefix}/lib/aegis unless otherwise specified. An "aegis" directory will be appended if there is none in the specified path. --mandir=PATH This directory contains the on-line manual entries. On a network, this directory may be shared between all machines; it may be mounted read-only. Defaults to ${prefix}/man unless otherwise specified. --with-nlsdir=PATH This directory contains machine specific message catalogues. Defaults to --libdir if not set. configure ignores any other arguments that you give it. On systems that require unusual options for compilation or linking that the fhist package's configure script does not know about, you can give configure initial values for variables by setting them in the environment. In Bourne-compatible shells, you can do that on the command line like this: $ CC='gcc -traditional' LIBS=-lposix ./configure ...lots of output... $ Here are the make variables that you might want to override with environment variables when running configure. Variable: CC C compiler program. The default is cc. Variable: INSTALL Program to use to install files. The default is install if you have it, cp otherwise. Variable: LIBS Libraries to link with, in the form -lfoo -lbar. The configure script will append to this, rather than replace it. Variable: NLSDIR This works the same way as the --with-nlsdir option. If you need to do unusual things to compile the package, the author encourages you to figure out how configure could check whether to do them, and mail diffs or instructions to the author so that they can be included in the next release. BUILDING FHIST All you should need to do is use the % make ...lots of output... % command and wait. When this finishes you should see a directory called bin containing four files: fcomp, fhist, fmerge and txt2c. fcomp The fcomp program is user to compare two text files. fhist The fhist program is used to maintain and edit history of a text file. fmerge The fmerge program is used to merge together edits from two descendants of a file. txt2c The txt2c program is a utility used to build the fhist package; it is not intended for general use and should not be installed. You can remove the program binaries and object files from the source directory by using the % make clean ...lots of output... % command. To remove all of the above files, and also remove the Makefile and common/config.h and config.status files, use the % make distclean ...lots of output... % command. The file etc/configure.in is used to create configure by a GNU program called autoconf. You only need to know this if you want to regenerate configure using a newer version of autoconf. TESTING FHIST The fhist package is accompanied by a test suite. To run this test suite, use the following command: % make sure ...lots of output... % This is successful if the last line of the test output reads "Passed All Tests". Please let the author know if any of the tests fail, and why if you can work that out. INSTALLING FHIST As explained in the SITE CONFIGURATION section, above, the fhist package is installed under the /usr/local tree by default. Use the --prefix=PATH option to configure if you want some other path. All that is required to install the fhist package is to use the % make install ...lots of output... % command. Control of the directories used may be found in the first few lines of the Makefile file if you want to bypass the configure script. The above procedure assumes that the soelim(1) command is somewhere in the command search PATH. The soelim(1) command is available as part of the GNU Roff package, mentioned previously in the PRINTED MANUALS section. If you don't have it, but you do have the cook package, then a link from roffpp to soelim will also work. The above procedure also assumes that the $(prefix)/man/man1 and $(prefix)/man/man5 directories already exist. If they do not, you will need to mkdir them manually. PRINTED MANUALS The easiest way to get copies of the manuals is to get the fhist.1.18.pdf file from the archive site. This is an Adobe AcroRead file containing the Reference Manual, which contains the README file, the BUILDING file and internationalization notes, as well as all of the manual pages for all of the commands. This distribution contains the sources to all of the documentation for fhist. The author used the GNU groff package and a postscript printer to prepare the documentation. If you do not have this software, you will need to substitute commands appropriate to your site. If you have the GNU Groff package installed before you run the configure script, the Makefile will contain instructions for constructing the documentation. If you already used the make command, above, this has already been done. The following command % make doc ...lots of output... % can be used to do this explicitly, if you managed to get to this point without doing it. Please note that there may be some warnings from groff, particularly about missing fonts, particularly for the .txt files; this is normal. Once the documents have been formatted, you only need to print them. The following command % lpr lib/en/reference.ps % will print the English PostScript version of the Reference Manual. Watch the make output to see what other versions are available. COPYRIGHT version 1.18.D001 Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009 Peter Miller; This program is derived from a work Copyright (C) 1990 David I. Bell. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . AUTHORS Peter Miller Web: http://miller.emu.id.au/pmiller/ /\/\* E-Mail: pmiller@opensource.org.au David I. Bell Web: http://www.canb.auug.org.au/~dbell E-Mail: dbell@canb.auug.org.au Reference Manual FHist Building(FHist) fhist-1.18/LICENSE 644 0 0 11453011265752627 130610ustar PeterMiller 0 0GPL(GNU) Free Software Foundation GPL(GNU) GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program - to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free pro- grams, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modi- fied versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protect- ing users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future ver- sions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modifi- cation follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recip- ients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without per- mission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not convey- ing. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible fea- ture that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a promi- nent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Compo- nent, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implemen- tation is available to the public in source code form. A "Major Compo- nent", in this context, means a major essential component (kernel, win- dow system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to con- trol those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free pro- grams which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copy- right on the Program, and are irrevocable provided the stated condi- tions are met. This License explicitly affirms your unlimited permis- sion to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facil- ities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological mea- sure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumven- tion is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appro- priately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permis- sion if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Cor- responding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a writ- ten offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customar- ily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alterna- tive is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corre- sponding Source in the same way through the same place at no fur- ther charge. You need not require recipients to copy the Corre- sponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corre- sponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorpora- tion into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the partic- ular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, proce- dures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modifi- cation has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipi- ent, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly docu- mented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Addi- tional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional per- missions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in rea- sonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restric- tion, you may remove that term. If a license document contains a fur- ther restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly pro- vided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third para- graph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occur- ring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so avail- able, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consis- tent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrange- ment, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the busi- ness of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permis- sion to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single com- bined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permis- sions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later ver- sion. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLI- CABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLD- ERS 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 PARTIC- ULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CON- VEYS 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 OPER- ATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Pro- gram, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. < one line to give the program's name and a brief idea of what it does. > Copyright (C) < year > < name of author > This program is free software: you can redistribute it and/or mod- ify it under the terms of the GNU General Public License as pub- lished by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MER- CHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Gen- eral Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type "show w". This is free software, and you are welcome to redis- tribute it under certain conditions; type "show c" for details. The hypothetical commands "show w" and "show c" should show the appro- priate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your pro- gram into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . GNU GPL GPL(GNU) fhist-1.18/Makefile.in 644 0 0 14113111265752627 141160ustar PeterMiller 0 0# # fhist - file history and comparison tools # Copyright (C) 1990-1994, 1998, 1999, 2002, 2004, 2008 Peter Miller # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see # . # # # directory containing the source # srcdir = @srcdir@ VPATH = @srcdir@ # # the name of the install program to use # INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ # # the name of the compiler to use # CC = @CC@ # # The compiler flags to use # CFLAGS = @CFLAGS@ # # The linker flags to use # LDFLAGS = @LDFLAGS@ # # prefix for installation path # prefix = @prefix@ exec_prefix = @exec_prefix@ # # where to put the library directory # (contains architecture-specific data, don't use exec_prefix) # libdir = $(RPM_BUILD_ROOT)@libdir@ # # where to put the locale files # (contains architecture-specific data, don't use exec_prefix) # NLSDIR = $(RPM_BUILD_ROOT)@NLSDIR@ # # where to put the shared directory # (contains architecture-neutral data, don't use exec_prefix) # datadir = $(RPM_BUILD_ROOT)@datadir@ # # where to put the executables # bindir = $(RPM_BUILD_ROOT)@bindir@ # # where to put the manuals # mandir = $(RPM_BUILD_ROOT)@mandir@ # # Which yacc to use # YACC = @YACC@ # # extra libraries required for your system # LIBS = @LIBS@ # # shell to use to run tests and commands # SH = @SH@ # # command used to construct libraries # AR = ar # # program used to place index within libraries # RANLIB = @RANLIB@ # # The program used to compile the message catalogues. Ideally, you # should use the msgfmt in the GNU Gettext package. (The SunOS one is # brain-dead, and the Solaris one is hardly better.) # MSGFMT = @MSGFMT@ MSGCAT = @MSGCAT@ # # The program used to format the documentation. # GROFF = @GROFF@ # # where to find the soelim command # SOELIM = @SOELIM@ # # Set MANLANG to English, to select the man pages to be installed into # $(mandir). If you want your manual pages in some other (supported) # language, set it here. # # The man pages for all supported languages are also installed into # $(libdir)/$(MANLANG)/manX/Y.X, so that it is only necessary to append # $(libdir) to $MANPATH, if your man understands $LANG. # MANLANG = en # # Set HAVE_I18N to ``yes'' if your system has the gettext() system call # and the msgfmt utility, or ``no'' if it does not. # HAVE_I18N = @internationalization@ # # Set HAVE_GROFF to ``yes'' if your system has GNU Groff installed, # or ``no'' if it does not. # HAVE_GROFF = @have_groff@ # # Mess with the names of installed executables. # # The prefix is added to the front, the suffix is added to the back. # Both are usually empty. (The suffix does not include the executable # file extension.) # PROGRAM_PREFIX = @PROGRAM_PREFIX@ PROGRAM_SUFFIX = @PROGRAM_SUFFIX@ # # This is the file extension of executable files. # It is empty for UNIX, and .EXE for the unmentionable one. # EXEEXT = @EXEEXT@ # # This is the file extension of object files. # It is .o for UNIX, and .O or .OBJ for the unmentionable one. # OBJEXT = @OBJEXT@ # # This is the file extension of library files. NO DOT. # LIBEXT = a # # You should not need to alter anything below this point. #------------------------------------------------------------ default: all common/ac/libintl.$(OBJEXT): common/ac/libintl.c common/ac/libintl.h \ common/config.h common/config.messy.h common/main.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/ac/libintl.c mv libintl.$(OBJEXT) $@ common/ac/string.$(OBJEXT): common/ac/string.c common/ac/stddef.h \ common/config.h common/config.messy.h common/ac/stdlib.h \ common/ac/string.h common/ac/stdio.h common/main.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/ac/string.c mv string.$(OBJEXT) $@ common/ac/unistd.$(OBJEXT): common/ac/unistd.c common/ac/unistd.h \ common/config.h common/config.messy.h \ common/ac/sys/types.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/ac/unistd.c mv unistd.$(OBJEXT) $@ common/ac/wchar.$(OBJEXT): common/ac/wchar.c common/ac/wchar.h \ common/ac/stddef.h common/config.h common/config.messy.h \ common/ac/time.h common/main.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/ac/wchar.c mv wchar.$(OBJEXT) $@ common/ac/wctype.$(OBJEXT): common/ac/wctype.c common/ac/ctype.h \ common/config.h common/config.messy.h common/ac/wctype.h \ common/ac/stddef.h common/main.h common/ac/limits.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/ac/wctype.c mv wctype.$(OBJEXT) $@ common/arglex.$(OBJEXT): common/arglex.c common/ac/stddef.h \ common/config.h common/config.messy.h common/ac/stdlib.h \ common/ac/string.h common/ac/ctype.h common/arglex.h \ common/main.h common/cmalloc.h common/error_intl.h \ common/sub.h common/attrib_forma.h common/language.h \ common/progname.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/arglex.c mv arglex.$(OBJEXT) $@ common/cmalloc.$(OBJEXT): common/cmalloc.c common/ac/errno.h \ common/config.h common/config.messy.h common/ac/stdlib.h \ common/ac/stddef.h common/cmalloc.h common/main.h \ common/error.h common/attrib_forma.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/cmalloc.c mv cmalloc.$(OBJEXT) $@ common/compare.$(OBJEXT): common/compare.c common/ac/ctype.h \ common/config.h common/config.messy.h common/ac/stddef.h \ common/ac/stdio.h common/main.h common/ac/string.h \ common/ac/libintl.h common/compare.h common/cmalloc.h \ common/error.h common/attrib_forma.h common/error_intl.h \ common/sub.h common/fcheck.h common/input.h \ common/input/file.h common/ac/sys/stat.h \ common/ac/sys/types.h common/input/file_text.h \ common/input/quotprinenco.h common/input/hexify.h \ common/str.h common/ac/stdarg.h common/trace.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/compare.c mv compare.$(OBJEXT) $@ common/env.$(OBJEXT): common/env.c common/ac/stddef.h common/config.h \ common/config.messy.h common/ac/stdlib.h \ common/ac/string.h common/env.h common/main.h \ common/mem.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/env.c mv env.$(OBJEXT) $@ common/error.$(OBJEXT): common/error.c common/ac/ctype.h common/config.h \ common/config.messy.h common/ac/errno.h \ common/ac/stdarg.h common/ac/stddef.h common/ac/stdio.h \ common/main.h common/ac/stdlib.h common/ac/string.h \ common/error.h common/attrib_forma.h common/mprintf.h \ common/progname.h common/quit.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/error.c mv error.$(OBJEXT) $@ common/error_intl.$(OBJEXT): common/error_intl.c common/ac/stdio.h \ common/config.h common/config.messy.h common/main.h \ common/ac/limits.h common/ac/string.h common/ac/wchar.h \ common/ac/stddef.h common/ac/time.h common/ac/wctype.h \ common/ac/ctype.h common/error.h common/attrib_forma.h \ common/error_intl.h common/sub.h common/language.h \ common/page.h common/progname.h common/quit.h \ common/wstr.h common/ac/stdlib.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/error_intl.c mv error_intl.$(OBJEXT) $@ common/fcheck.$(OBJEXT): common/fcheck.c common/ac/string.h \ common/config.h common/config.messy.h \ common/error_intl.h common/sub.h common/attrib_forma.h \ common/main.h common/fcheck.h common/ac/stdio.h \ common/str.h common/ac/stddef.h common/ac/stdarg.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/fcheck.c mv fcheck.$(OBJEXT) $@ common/fileio.$(OBJEXT): common/fileio.c common/ac/errno.h \ common/config.h common/config.messy.h \ common/ac/libintl.h common/main.h common/ac/stdarg.h \ common/ac/stdio.h common/ac/string.h common/ac/unistd.h \ common/ac/sys/types.h common/error_intl.h common/sub.h \ common/attrib_forma.h common/fcheck.h common/fileio.h \ common/cmalloc.h common/ac/stddef.h common/str.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/fileio.c mv fileio.$(OBJEXT) $@ common/help.$(OBJEXT): common/help.c common/ac/stdlib.h common/config.h \ common/config.messy.h common/ac/unistd.h \ common/ac/sys/types.h common/arglex.h common/main.h \ common/env.h common/error.h common/attrib_forma.h \ common/error_intl.h common/sub.h common/help.h \ common/libdir.h common/progname.h common/quit.h \ common/str_list.h common/str.h common/ac/stddef.h \ common/ac/stdarg.h common/trace.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/help.c mv help.$(OBJEXT) $@ common/input.$(OBJEXT): common/input.c common/ac/ctype.h common/config.h \ common/config.messy.h common/ac/string.h common/fcheck.h \ common/ac/stdio.h common/main.h common/input/private.h \ common/input.h common/mem.h common/ac/stddef.h \ common/trace.h common/attrib_forma.h common/cmalloc.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/input.c mv input.$(OBJEXT) $@ common/input/crlf.$(OBJEXT): common/input/crlf.c common/error.h \ common/attrib_forma.h common/main.h common/input/crlf.h \ common/input.h common/input/private.h common/trace.h \ common/ac/stddef.h common/config.h common/config.messy.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/input/crlf.c mv crlf.$(OBJEXT) $@ common/input/file.$(OBJEXT): common/input/file.c common/ac/unistd.h \ common/config.h common/config.messy.h \ common/ac/sys/types.h common/error.h \ common/attrib_forma.h common/main.h common/fcheck.h \ common/ac/stdio.h common/input/file.h common/ac/stddef.h \ common/ac/sys/stat.h common/input.h \ common/input/private.h common/input/stdin.h common/mem.h \ common/str.h common/ac/stdarg.h common/error_intl.h \ common/sub.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/input/file.c mv file.$(OBJEXT) $@ common/input/file_text.$(OBJEXT): common/input/file_text.c \ common/input/crlf.h common/input.h common/main.h \ common/input/file.h common/ac/stddef.h common/config.h \ common/config.messy.h common/ac/sys/stat.h \ common/ac/sys/types.h common/input/file_text.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/input/file_text.c mv file_text.$(OBJEXT) $@ common/input/hexify.$(OBJEXT): common/input/hexify.c common/ac/ctype.h \ common/config.h common/config.messy.h common/ac/stdio.h \ common/main.h common/error.h common/attrib_forma.h \ common/input/hexify.h common/input.h \ common/input/private.h common/trace.h common/ac/stddef.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/input/hexify.c mv hexify.$(OBJEXT) $@ common/input/private.$(OBJEXT): common/input/private.c \ common/input/private.h common/input.h common/main.h \ common/mem.h common/ac/stddef.h common/config.h \ common/config.messy.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/input/private.c mv private.$(OBJEXT) $@ common/input/pushba_trans.$(OBJEXT): common/input/pushba_trans.c \ common/input/private.h common/input.h common/main.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/input/pushba_trans.c mv pushba_trans.$(OBJEXT) $@ common/input/quotprinenco.$(OBJEXT): common/input/quotprinenco.c \ common/error.h common/attrib_forma.h common/main.h \ common/input/quotprinenco.h common/input.h \ common/input/private.h common/trace.h common/ac/stddef.h \ common/config.h common/config.messy.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/input/quotprinenco.c mv quotprinenco.$(OBJEXT) $@ common/input/stdin.$(OBJEXT): common/input/stdin.c common/ac/stdio.h \ common/config.h common/config.messy.h common/main.h \ common/ac/sys/stat.h common/ac/sys/types.h \ common/error_intl.h common/sub.h common/attrib_forma.h \ common/input/private.h common/input.h \ common/input/stdin.h common/str.h common/ac/stddef.h \ common/ac/stdarg.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/input/stdin.c mv stdin.$(OBJEXT) $@ common/isdir.$(OBJEXT): common/isdir.c common/ac/sys/stat.h \ common/ac/sys/types.h common/config.h \ common/config.messy.h common/isdir.h common/main.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/isdir.c mv isdir.$(OBJEXT) $@ common/language.$(OBJEXT): common/language.c common/ac/locale.h \ common/config.h common/config.messy.h \ common/ac/libintl.h common/main.h common/ac/stdlib.h \ common/env.h common/error.h common/attrib_forma.h \ common/language.h common/libdir.h common/progname.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/language.c mv language.$(OBJEXT) $@ common/libdir.$(OBJEXT): common/libdir.c etc/libdir-h common/libdir.h \ common/main.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/libdir.c mv libdir.$(OBJEXT) $@ common/mem.$(OBJEXT): common/mem.c common/ac/errno.h common/config.h \ common/config.messy.h common/ac/stddef.h \ common/ac/stdlib.h common/ac/string.h common/error.h \ common/attrib_forma.h common/main.h common/mem.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/mem.c mv mem.$(OBJEXT) $@ common/mprintf.$(OBJEXT): common/mprintf.c common/ac/errno.h \ common/config.h common/config.messy.h common/ac/stdio.h \ common/main.h common/ac/stdlib.h common/ac/string.h \ common/error.h common/attrib_forma.h common/mprintf.h \ common/ac/stdarg.h common/str.h common/ac/stddef.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/mprintf.c mv mprintf.$(OBJEXT) $@ common/output.$(OBJEXT): common/output.c common/error.h \ common/attrib_forma.h common/main.h common/mem.h \ common/ac/stddef.h common/config.h common/config.messy.h \ common/mprintf.h common/ac/stdarg.h \ common/output/private.h common/output.h common/str.h \ common/trace.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/output.c mv output.$(OBJEXT) $@ common/output/file.$(OBJEXT): common/output/file.c common/ac/errno.h \ common/config.h common/config.messy.h common/ac/stdio.h \ common/main.h common/fcheck.h common/mem.h \ common/ac/stddef.h common/output/file.h common/output.h \ common/ac/stdarg.h common/attrib_forma.h \ common/output/private.h common/output/stdout.h \ common/error_intl.h common/sub.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/output/file.c mv file.$(OBJEXT) $@ common/output/private.$(OBJEXT): common/output/private.c \ common/ac/string.h common/config.h common/config.messy.h \ common/error.h common/attrib_forma.h common/main.h \ common/mem.h common/ac/stddef.h common/output/private.h \ common/output.h common/ac/stdarg.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/output/private.c mv private.$(OBJEXT) $@ common/output/quotprindeco.$(OBJEXT): common/output/quotprindeco.c \ common/output/private.h common/output.h \ common/ac/stdarg.h common/config.h common/config.messy.h \ common/ac/stddef.h common/attrib_forma.h common/main.h \ common/output/quotprindeco.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/output/quotprindeco.c mv quotprindeco.$(OBJEXT) $@ common/output/stdout.$(OBJEXT): common/output/stdout.c \ common/ac/stddef.h common/config.h common/config.messy.h \ common/ac/stdio.h common/main.h common/ac/sys/stat.h \ common/ac/sys/types.h common/fcheck.h \ common/output/private.h common/output.h \ common/ac/stdarg.h common/attrib_forma.h \ common/output/stdout.h common/str.h common/error_intl.h \ common/sub.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/output/stdout.c mv stdout.$(OBJEXT) $@ common/page.$(OBJEXT): common/page.c common/ac/stdlib.h common/config.h \ common/config.messy.h common/ac/termios.h \ common/arglex.h common/main.h common/error_intl.h \ common/sub.h common/attrib_forma.h common/page.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/page.c mv page.$(OBJEXT) $@ common/pager.$(OBJEXT): common/pager.c common/ac/stdio.h common/config.h \ common/config.messy.h common/main.h common/ac/signal.h \ common/ac/stdlib.h common/ac/unistd.h \ common/ac/sys/types.h common/ac/libintl.h \ common/error_intl.h common/sub.h common/attrib_forma.h \ common/pager.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/pager.c mv pager.$(OBJEXT) $@ common/progname.$(OBJEXT): common/progname.c common/ac/string.h \ common/config.h common/config.messy.h common/progname.h \ common/main.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/progname.c mv progname.$(OBJEXT) $@ common/quit.$(OBJEXT): common/quit.c common/ac/stdlib.h common/config.h \ common/config.messy.h common/quit.h common/main.h \ common/undo.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/quit.c mv quit.$(OBJEXT) $@ common/str.$(OBJEXT): common/str.c common/ac/stddef.h common/config.h \ common/config.messy.h common/ac/stdio.h common/main.h \ common/ac/stdlib.h common/ac/string.h common/ac/ctype.h \ common/ac/stdarg.h common/error.h common/attrib_forma.h \ common/mem.h common/mprintf.h common/str.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/str.c mv str.$(OBJEXT) $@ common/str_list.$(OBJEXT): common/str_list.c common/ac/ctype.h \ common/config.h common/config.messy.h common/ac/stddef.h \ common/ac/string.h common/ac/stdlib.h common/ac/time.h \ common/mem.h common/main.h common/str.h \ common/ac/stdarg.h common/attrib_forma.h \ common/str_list.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/str_list.c mv str_list.$(OBJEXT) $@ common/sub.$(OBJEXT): common/sub.c common/ac/errno.h common/config.h \ common/config.messy.h common/ac/libintl.h common/main.h \ common/ac/limits.h common/ac/string.h common/ac/wctype.h \ common/ac/ctype.h common/ac/stddef.h common/arglex.h \ common/error.h common/attrib_forma.h common/error_intl.h \ common/sub.h common/language.h common/mem.h common/str.h \ common/ac/stdarg.h common/sub/basename.h \ common/sub/date.h common/sub/dirname.h \ common/sub/downcase.h common/sub/errno.h \ common/sub/expr.h common/sub/ident.h common/sub/length.h \ common/sub/left.h common/sub/plural.h \ common/sub/private.h common/sub/progname.h \ common/sub/right.h common/sub/upcase.h \ common/sub/zero_pad.h common/trace.h common/wstr_list.h \ common/wstr.h common/ac/stdlib.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/sub.c mv sub.$(OBJEXT) $@ common/sub/basename.$(OBJEXT): common/sub/basename.c common/ac/string.h \ common/config.h common/config.messy.h \ common/sub/basename.h common/main.h common/sub/private.h \ common/sub.h common/attrib_forma.h common/trace.h \ common/ac/stddef.h common/wstr_list.h common/wstr.h \ common/ac/stdlib.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/sub/basename.c mv basename.$(OBJEXT) $@ common/sub/date.$(OBJEXT): common/sub/date.c common/ac/time.h \ common/config.h common/config.messy.h common/language.h \ common/main.h common/str.h common/ac/stddef.h \ common/ac/stdarg.h common/attrib_forma.h \ common/sub/date.h common/sub/private.h common/sub.h \ common/trace.h common/wstr_list.h common/wstr.h \ common/ac/stdlib.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/sub/date.c mv date.$(OBJEXT) $@ common/sub/dirname.$(OBJEXT): common/sub/dirname.c common/sub/dirname.h \ common/main.h common/sub/private.h common/sub.h \ common/attrib_forma.h common/trace.h common/ac/stddef.h \ common/config.h common/config.messy.h common/wstr_list.h \ common/wstr.h common/ac/stdlib.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/sub/dirname.c mv dirname.$(OBJEXT) $@ common/sub/downcase.$(OBJEXT): common/sub/downcase.c \ common/sub/downcase.h common/main.h common/sub/private.h \ common/sub.h common/attrib_forma.h common/trace.h \ common/ac/stddef.h common/config.h common/config.messy.h \ common/wstr_list.h common/wstr.h common/ac/stdlib.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/sub/downcase.c mv downcase.$(OBJEXT) $@ common/sub/errno.$(OBJEXT): common/sub/errno.c common/ac/errno.h \ common/config.h common/config.messy.h common/ac/grp.h \ common/ac/sys/types.h common/ac/pwd.h common/ac/string.h \ common/ac/unistd.h common/str.h common/ac/stddef.h \ common/ac/stdarg.h common/attrib_forma.h common/main.h \ common/sub/errno.h common/sub/private.h common/sub.h \ common/trace.h common/wstr_list.h common/wstr.h \ common/ac/stdlib.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/sub/errno.c mv errno.$(OBJEXT) $@ common/sub/expr.$(OBJEXT): common/sub/expr.c common/sub/expr.h \ common/main.h common/sub/expr_gram.h \ common/sub/private.h common/sub.h common/attrib_forma.h \ common/str.h common/ac/stddef.h common/config.h \ common/config.messy.h common/ac/stdarg.h common/trace.h \ common/wstr_list.h common/wstr.h common/ac/stdlib.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/sub/expr.c mv expr.$(OBJEXT) $@ common/sub/expr_gram.gen.c common/sub/expr_gram.gen.h: \ common/sub/expr_gram.y @echo Expect no conflicts: $(YACC) -d common/sub/expr_gram.y sed -e 's/[yY][yY]/sub_expr_gram_/g' -e '/#include./d' \ -e '/#include./d' -e '/#include./d' \ -e '/#include./d' y.tab.c > \ common/sub/expr_gram.gen.c sed -e 's/[yY][yY]/sub_expr_gram_/g' y.tab.h > \ common/sub/expr_gram.gen.h rm y.tab.c y.tab.h common/sub/expr_gram.gen.$(OBJEXT): common/sub/expr_gram.gen.c \ common/ac/stdarg.h common/config.h common/config.messy.h \ common/ac/stdio.h common/main.h common/ac/stdlib.h \ common/ac/libintl.h common/str.h common/ac/stddef.h \ common/attrib_forma.h common/sub/expr_gram.h \ common/sub/expr_lex.h common/sub/private.h common/sub.h \ common/trace.h $(CC) $(CPPFLAGS) $(CFLAGS) -Icommon -Icommon -c \ common/sub/expr_gram.gen.c mv expr_gram.gen.$(OBJEXT) $@ common/sub/expr_lex.$(OBJEXT): common/sub/expr_lex.c common/str.h \ common/ac/stddef.h common/config.h common/config.messy.h \ common/ac/stdarg.h common/attrib_forma.h common/main.h \ common/sub/expr_lex.h common/sub/expr_gram.gen.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/sub/expr_lex.c mv expr_lex.$(OBJEXT) $@ common/sub/ident.$(OBJEXT): common/sub/ident.c common/sub/ident.h \ common/main.h common/sub/private.h common/sub.h \ common/attrib_forma.h common/trace.h common/ac/stddef.h \ common/config.h common/config.messy.h common/wstr_list.h \ common/wstr.h common/ac/stdlib.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/sub/ident.c mv ident.$(OBJEXT) $@ common/sub/left.$(OBJEXT): common/sub/left.c common/ac/stdlib.h \ common/config.h common/config.messy.h common/str.h \ common/ac/stddef.h common/ac/stdarg.h \ common/attrib_forma.h common/main.h common/sub/left.h \ common/sub/private.h common/sub.h common/trace.h \ common/wstr_list.h common/wstr.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/sub/left.c mv left.$(OBJEXT) $@ common/sub/length.$(OBJEXT): common/sub/length.c common/str.h \ common/ac/stddef.h common/config.h common/config.messy.h \ common/ac/stdarg.h common/attrib_forma.h common/main.h \ common/sub/length.h common/sub/private.h common/sub.h \ common/trace.h common/wstr_list.h common/wstr.h \ common/ac/stdlib.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/sub/length.c mv length.$(OBJEXT) $@ common/sub/plural.$(OBJEXT): common/sub/plural.c common/ac/stdlib.h \ common/config.h common/config.messy.h common/str.h \ common/ac/stddef.h common/ac/stdarg.h \ common/attrib_forma.h common/main.h common/sub/plural.h \ common/sub/private.h common/sub.h common/trace.h \ common/wstr_list.h common/wstr.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/sub/plural.c mv plural.$(OBJEXT) $@ common/sub/progname.$(OBJEXT): common/sub/progname.c common/progname.h \ common/main.h common/sub/progname.h common/sub/private.h \ common/sub.h common/attrib_forma.h common/trace.h \ common/ac/stddef.h common/config.h common/config.messy.h \ common/wstr_list.h common/wstr.h common/ac/stdlib.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/sub/progname.c mv progname.$(OBJEXT) $@ common/sub/right.$(OBJEXT): common/sub/right.c common/str.h \ common/ac/stddef.h common/config.h common/config.messy.h \ common/ac/stdarg.h common/attrib_forma.h common/main.h \ common/sub/private.h common/sub.h common/sub/right.h \ common/trace.h common/wstr_list.h common/wstr.h \ common/ac/stdlib.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/sub/right.c mv right.$(OBJEXT) $@ common/sub/upcase.$(OBJEXT): common/sub/upcase.c common/sub/private.h \ common/sub.h common/attrib_forma.h common/main.h \ common/sub/upcase.h common/trace.h common/ac/stddef.h \ common/config.h common/config.messy.h common/wstr_list.h \ common/wstr.h common/ac/stdlib.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/sub/upcase.c mv upcase.$(OBJEXT) $@ common/sub/zero_pad.$(OBJEXT): common/sub/zero_pad.c common/mem.h \ common/ac/stddef.h common/config.h common/config.messy.h \ common/main.h common/str.h common/ac/stdarg.h \ common/attrib_forma.h common/sub/private.h common/sub.h \ common/sub/zero_pad.h common/trace.h common/wstr_list.h \ common/wstr.h common/ac/stdlib.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/sub/zero_pad.c mv zero_pad.$(OBJEXT) $@ common/trace.$(OBJEXT): common/trace.c common/ac/errno.h common/config.h \ common/config.messy.h common/ac/stddef.h \ common/ac/stdio.h common/main.h common/ac/string.h \ common/ac/stdarg.h common/error.h common/attrib_forma.h \ common/mem.h common/progname.h common/str.h \ common/trace.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/trace.c mv trace.$(OBJEXT) $@ common/undo.$(OBJEXT): common/undo.c common/ac/unistd.h common/config.h \ common/config.messy.h common/ac/sys/types.h common/mem.h \ common/ac/stddef.h common/main.h common/str.h \ common/ac/stdarg.h common/attrib_forma.h common/undo.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/undo.c mv undo.$(OBJEXT) $@ common/version.$(OBJEXT): common/version.c common/ac/stdio.h \ common/config.h common/config.messy.h common/main.h \ common/arglex.h common/error.h common/attrib_forma.h \ common/help.h common/progname.h common/quit.h \ common/str.h common/ac/stddef.h common/ac/stdarg.h \ common/trace.h common/version.h common/version_stmp.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/version.c mv version.$(OBJEXT) $@ common/version_stmp.$(OBJEXT): common/version_stmp.c common/patchlevel.h \ common/version_stmp.h common/main.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/version_stmp.c mv version_stmp.$(OBJEXT) $@ common/wstr.$(OBJEXT): common/wstr.c common/ac/limits.h common/config.h \ common/config.messy.h common/ac/stdarg.h \ common/ac/stddef.h common/ac/stdio.h common/main.h \ common/ac/stdlib.h common/ac/string.h common/ac/wchar.h \ common/ac/time.h common/ac/wctype.h common/ac/ctype.h \ common/error.h common/attrib_forma.h common/language.h \ common/mem.h common/str.h common/trace.h common/wstr.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/wstr.c mv wstr.$(OBJEXT) $@ common/wstr_list.$(OBJEXT): common/wstr_list.c common/ac/string.h \ common/config.h common/config.messy.h common/wstr_list.h \ common/wstr.h common/ac/stdlib.h common/main.h \ common/mem.h common/ac/stddef.h $(CC) $(CFLAGS) -Icommon -Icommon -c common/wstr_list.c mv wstr_list.$(OBJEXT) $@ fcomp/main.$(OBJEXT): fcomp/main.c common/ac/errno.h common/config.h \ common/config.messy.h common/ac/stdio.h common/main.h \ common/ac/stdlib.h common/ac/string.h common/arglex.h \ common/cmalloc.h common/ac/stddef.h common/compare.h \ common/error_intl.h common/sub.h common/attrib_forma.h \ common/fileio.h common/help.h common/isdir.h \ common/progname.h common/quit.h common/version.h $(CC) $(CFLAGS) -Ifcomp -Icommon -c fcomp/main.c mv main.$(OBJEXT) $@ fhist/breaks.$(OBJEXT): fhist/breaks.c common/ac/signal.h \ common/config.h common/config.messy.h common/ac/unistd.h \ common/ac/sys/types.h fhist/breaks.h common/main.h $(CC) $(CFLAGS) -Ifhist -Icommon -c fhist/breaks.c mv breaks.$(OBJEXT) $@ fhist/diff.$(OBJEXT): fhist/diff.c common/ac/errno.h common/config.h \ common/config.messy.h common/ac/stdio.h common/main.h \ common/ac/stdlib.h common/ac/string.h common/ac/unistd.h \ common/ac/sys/types.h common/cmalloc.h \ common/ac/stddef.h common/compare.h fhist/diff.h \ common/error.h common/attrib_forma.h common/error_intl.h \ common/sub.h fhist/extract.h common/fcheck.h \ fhist/fhist.h common/fileio.h fhist/modlin.h \ common/str.h common/ac/stdarg.h fhist/subroutine.h $(CC) $(CFLAGS) -Ifhist -Icommon -c fhist/diff.c mv diff.$(OBJEXT) $@ fhist/extract.$(OBJEXT): fhist/extract.c common/ac/libintl.h \ common/config.h common/config.messy.h common/main.h \ common/ac/stdio.h common/ac/string.h common/ac/unistd.h \ common/ac/sys/types.h common/cmalloc.h \ common/ac/stddef.h common/compare.h common/error_intl.h \ common/sub.h common/attrib_forma.h fhist/extract.h \ common/fcheck.h fhist/fhist.h common/fileio.h \ fhist/modlin.h common/output/file.h common/output.h \ common/ac/stdarg.h common/output/stdout.h \ common/output/quotprindeco.h fhist/subroutine.h $(CC) $(CFLAGS) -Ifhist -Icommon -c fhist/extract.c mv extract.$(OBJEXT) $@ fhist/list.$(OBJEXT): fhist/list.c common/ac/libintl.h common/config.h \ common/config.messy.h common/main.h common/ac/stdio.h \ common/cmalloc.h common/ac/stddef.h common/compare.h \ common/error_intl.h common/sub.h common/attrib_forma.h \ common/fcheck.h fhist/fhist.h common/fileio.h \ fhist/list.h fhist/subroutine.h $(CC) $(CFLAGS) -Ifhist -Icommon -c fhist/list.c mv list.$(OBJEXT) $@ fhist/main.$(OBJEXT): fhist/main.c common/ac/ctype.h common/config.h \ common/config.messy.h common/ac/sys/types.h \ common/ac/stdio.h common/main.h common/ac/errno.h \ common/ac/dirent.h common/ac/unistd.h common/ac/stdlib.h \ common/ac/string.h common/ac/sys/stat.h common/arglex.h \ fhist/breaks.h common/cmalloc.h common/ac/stddef.h \ common/compare.h fhist/diff.h common/error_intl.h \ common/sub.h common/attrib_forma.h fhist/extract.h \ fhist/fhist.h common/help.h common/isdir.h fhist/list.h \ fhist/modlin.h fhist/name.h common/progname.h \ fhist/prune.h common/quit.h common/str.h \ common/ac/stdarg.h fhist/subroutine.h common/trace.h \ fhist/update.h common/version.h $(CC) $(CFLAGS) -Ifhist -Icommon -c fhist/main.c mv main.$(OBJEXT) $@ fhist/modlin.$(OBJEXT): fhist/modlin.c common/ac/string.h \ common/config.h common/config.messy.h common/cmalloc.h \ common/ac/stddef.h common/main.h common/compare.h \ common/error_intl.h common/sub.h common/attrib_forma.h \ common/fcheck.h common/ac/stdio.h fhist/fhist.h \ common/fileio.h common/input/file_text.h common/input.h \ common/input/file.h common/ac/sys/stat.h \ common/ac/sys/types.h common/input/quotprinenco.h \ fhist/modlin.h common/trace.h $(CC) $(CFLAGS) -Ifhist -Icommon -c fhist/modlin.c mv modlin.$(OBJEXT) $@ fhist/name.$(OBJEXT): fhist/name.c common/ac/ctype.h common/config.h \ common/config.messy.h common/ac/errno.h \ common/ac/stdio.h common/main.h common/ac/string.h \ fhist/breaks.h common/compare.h common/error_intl.h \ common/sub.h common/attrib_forma.h fhist/fhist.h \ common/fileio.h fhist/name.h fhist/subroutine.h $(CC) $(CFLAGS) -Ifhist -Icommon -c fhist/name.c mv name.$(OBJEXT) $@ fhist/prune.$(OBJEXT): fhist/prune.c common/ac/stdio.h common/config.h \ common/config.messy.h common/main.h common/ac/string.h \ fhist/breaks.h common/compare.h common/error_intl.h \ common/sub.h common/attrib_forma.h common/fcheck.h \ fhist/fhist.h common/fileio.h fhist/prune.h common/str.h \ common/ac/stddef.h common/ac/stdarg.h fhist/subroutine.h $(CC) $(CFLAGS) -Ifhist -Icommon -c fhist/prune.c mv prune.$(OBJEXT) $@ fhist/subroutine.$(OBJEXT): fhist/subroutine.c common/ac/ctype.h \ common/config.h common/config.messy.h common/ac/errno.h \ common/ac/stdio.h common/main.h common/ac/string.h \ common/ac/unistd.h common/ac/sys/types.h \ common/cmalloc.h common/ac/stddef.h common/compare.h \ common/error_intl.h common/sub.h common/attrib_forma.h \ common/fcheck.h fhist/fhist.h common/fileio.h \ common/isdir.h common/str.h common/ac/stdarg.h \ fhist/subroutine.h $(CC) $(CFLAGS) -Ifhist -Icommon -c fhist/subroutine.c mv subroutine.$(OBJEXT) $@ fhist/update.$(OBJEXT): fhist/update.c common/ac/ctype.h common/config.h \ common/config.messy.h common/ac/errno.h common/ac/pwd.h \ common/ac/sys/types.h common/ac/stdio.h common/main.h \ common/ac/string.h common/ac/time.h common/ac/unistd.h \ fhist/breaks.h common/cmalloc.h common/ac/stddef.h \ common/compare.h common/error_intl.h common/sub.h \ common/attrib_forma.h common/fcheck.h fhist/fhist.h \ common/fileio.h common/input/file.h common/ac/sys/stat.h \ common/input.h common/input/file_text.h \ common/input/quotprinenco.h fhist/modlin.h common/str.h \ common/ac/stdarg.h fhist/subroutine.h common/trace.h \ common/undo.h fhist/update.h $(CC) $(CFLAGS) -Ifhist -Icommon -c fhist/update.c mv update.$(OBJEXT) $@ fmerge/main.$(OBJEXT): fmerge/main.c common/ac/errno.h common/config.h \ common/config.messy.h common/ac/stdio.h common/main.h \ common/ac/stdlib.h common/ac/string.h common/arglex.h \ common/cmalloc.h common/ac/stddef.h common/compare.h \ common/error_intl.h common/sub.h common/attrib_forma.h \ common/fileio.h common/help.h common/progname.h \ common/quit.h common/version.h fmerge/work.h $(CC) $(CFLAGS) -Ifmerge -Icommon -c fmerge/main.c mv main.$(OBJEXT) $@ fmerge/work.$(OBJEXT): fmerge/work.c common/ac/stdio.h common/config.h \ common/config.messy.h common/main.h common/ac/string.h \ common/ac/libintl.h common/cmalloc.h common/ac/stddef.h \ common/compare.h common/error_intl.h common/sub.h \ common/attrib_forma.h common/fcheck.h common/fileio.h \ fmerge/work.h $(CC) $(CFLAGS) -Ifmerge -Icommon -c fmerge/work.c mv work.$(OBJEXT) $@ lib/en/LC_MESSAGES/fcomp.mo: lib/en/LC_MESSAGES/fcomp.po \ lib/en/LC_MESSAGES/common.po $(SH) etc/msgfmt.sh --msgfmt=$(MSGFMT) --msgcat=$(MSGCAT) \ --output=$@ lib/en/LC_MESSAGES/fcomp.po \ lib/en/LC_MESSAGES/common.po $(NLSDIR)/en/LC_MESSAGES/fcomp.mo: lib/en/LC_MESSAGES/fcomp.mo \ lib/en/LC_MESSAGES/.nlsdir $(INSTALL_DATA) lib/en/LC_MESSAGES/fcomp.mo $@ lib/en/LC_MESSAGES/fhist.mo: lib/en/LC_MESSAGES/fhist.po \ lib/en/LC_MESSAGES/common.po $(SH) etc/msgfmt.sh --msgfmt=$(MSGFMT) --msgcat=$(MSGCAT) \ --output=$@ lib/en/LC_MESSAGES/fhist.po \ lib/en/LC_MESSAGES/common.po $(NLSDIR)/en/LC_MESSAGES/fhist.mo: lib/en/LC_MESSAGES/fhist.mo \ lib/en/LC_MESSAGES/.nlsdir $(INSTALL_DATA) lib/en/LC_MESSAGES/fhist.mo $@ lib/en/LC_MESSAGES/fmerge.mo: lib/en/LC_MESSAGES/fmerge.po \ lib/en/LC_MESSAGES/common.po $(SH) etc/msgfmt.sh --msgfmt=$(MSGFMT) --msgcat=$(MSGCAT) \ --output=$@ lib/en/LC_MESSAGES/fmerge.po \ lib/en/LC_MESSAGES/common.po $(NLSDIR)/en/LC_MESSAGES/fmerge.mo: lib/en/LC_MESSAGES/fmerge.mo \ lib/en/LC_MESSAGES/.nlsdir $(INSTALL_DATA) lib/en/LC_MESSAGES/fmerge.mo $@ lib/en/building.ps: lib/en/building/main.man $(SOELIM) -Ilib/en/building -Ietc -Ilib/en/man1 -Ilib/en/readme \ lib/en/building/main.man | $(GROFF) -s -t -p -man -mpic \ -mpspic > $@ $(datadir)/en/building.ps: lib/en/building.ps lib/en/.datadir $(INSTALL_DATA) lib/en/building.ps $@ lib/en/building.dvi: lib/en/building/main.man $(SOELIM) -Ilib/en/building -Ietc -Ilib/en/man1 -Ilib/en/readme \ lib/en/building/main.man | $(GROFF) -Tdvi -s -t -p -man \ -mpic > $@ $(datadir)/en/building.dvi: lib/en/building.dvi lib/en/.datadir $(INSTALL_DATA) lib/en/building.dvi $@ lib/en/building.txt: lib/en/building/main.man $(SOELIM) -Ilib/en/building -Ietc -Ilib/en/man1 -Ilib/en/readme \ lib/en/building/main.man | $(GROFF) -Tascii -s -t -p \ -man -mpic > $@ $(datadir)/en/building.txt: lib/en/building.txt lib/en/.datadir $(INSTALL_DATA) lib/en/building.txt $@ $(datadir)/en/man1/fcomp.1: lib/en/man1/fcomp.1 lib/en/man1/.datadir $(SOELIM) -Ilib/en/man1 -Ietc lib/en/man1/fcomp.1 > tmp $(INSTALL_DATA) tmp $@ @rm -f tmp $(mandir)/man1/fcomp.1: lib/$(MANLANG)/man1/fcomp.1 lib/en/man1/.mandir $(SOELIM) -Ilib/$(MANLANG)/man1 -Ietc lib/$(MANLANG)/man1/fcomp.1 > tmp $(INSTALL_DATA) tmp $@ @rm -f tmp $(datadir)/en/man1/fhist.1: lib/en/man1/fhist.1 lib/en/man1/.datadir $(SOELIM) -Ilib/en/man1 -Ietc lib/en/man1/fhist.1 > tmp $(INSTALL_DATA) tmp $@ @rm -f tmp $(mandir)/man1/fhist.1: lib/$(MANLANG)/man1/fhist.1 lib/en/man1/.mandir $(SOELIM) -Ilib/$(MANLANG)/man1 -Ietc lib/$(MANLANG)/man1/fhist.1 > tmp $(INSTALL_DATA) tmp $@ @rm -f tmp $(datadir)/en/man1/fhist_lic.1: lib/en/man1/fhist_lic.1 \ lib/en/man1/.datadir $(SOELIM) -Ilib/en/man1 -Ietc lib/en/man1/fhist_lic.1 > tmp $(INSTALL_DATA) tmp $@ @rm -f tmp $(mandir)/man1/fhist_lic.1: lib/$(MANLANG)/man1/fhist_lic.1 \ lib/en/man1/.mandir $(SOELIM) -Ilib/$(MANLANG)/man1 -Ietc \ lib/$(MANLANG)/man1/fhist_lic.1 > tmp $(INSTALL_DATA) tmp $@ @rm -f tmp $(datadir)/en/man1/fmerge.1: lib/en/man1/fmerge.1 lib/en/man1/.datadir $(SOELIM) -Ilib/en/man1 -Ietc lib/en/man1/fmerge.1 > tmp $(INSTALL_DATA) tmp $@ @rm -f tmp $(mandir)/man1/fmerge.1: lib/$(MANLANG)/man1/fmerge.1 \ lib/en/man1/.mandir $(SOELIM) -Ilib/$(MANLANG)/man1 -Ietc \ lib/$(MANLANG)/man1/fmerge.1 > tmp $(INSTALL_DATA) tmp $@ @rm -f tmp lib/en/readme.ps: lib/en/readme/main.man $(SOELIM) -Ilib/en/readme -Ietc -Ilib/en/man1 -Ilib/en/readme \ lib/en/readme/main.man | $(GROFF) -s -t -p -man -mpic \ -mpspic > $@ $(datadir)/en/readme.ps: lib/en/readme.ps lib/en/.datadir $(INSTALL_DATA) lib/en/readme.ps $@ lib/en/readme.dvi: lib/en/readme/main.man $(SOELIM) -Ilib/en/readme -Ietc -Ilib/en/man1 -Ilib/en/readme \ lib/en/readme/main.man | $(GROFF) -Tdvi -s -t -p -man \ -mpic > $@ $(datadir)/en/readme.dvi: lib/en/readme.dvi lib/en/.datadir $(INSTALL_DATA) lib/en/readme.dvi $@ lib/en/readme.txt: lib/en/readme/main.man $(SOELIM) -Ilib/en/readme -Ietc -Ilib/en/man1 -Ilib/en/readme \ lib/en/readme/main.man | $(GROFF) -Tascii -s -t -p -man \ -mpic > $@ $(datadir)/en/readme.txt: lib/en/readme.txt lib/en/.datadir $(INSTALL_DATA) lib/en/readme.txt $@ lib/en/reference.ps: lib/en/reference/main.man $(SOELIM) -Ilib/en/reference -Ietc -Ilib/en/man1 -Ilib/en/readme \ lib/en/reference/main.man | $(GROFF) -s -t -p -man -mpic \ -mpspic > $@ $(datadir)/en/reference.ps: lib/en/reference.ps lib/en/.datadir $(INSTALL_DATA) lib/en/reference.ps $@ lib/en/reference.dvi: lib/en/reference/main.man $(SOELIM) -Ilib/en/reference -Ietc -Ilib/en/man1 -Ilib/en/readme \ lib/en/reference/main.man | $(GROFF) -Tdvi -s -t -p -man \ -mpic > $@ $(datadir)/en/reference.dvi: lib/en/reference.dvi lib/en/.datadir $(INSTALL_DATA) lib/en/reference.dvi $@ lib/en/reference.txt: lib/en/reference/main.man $(SOELIM) -Ilib/en/reference -Ietc -Ilib/en/man1 -Ilib/en/readme \ lib/en/reference/main.man | $(GROFF) -Tascii -s -t -p \ -man -mpic > $@ $(datadir)/en/reference.txt: lib/en/reference.txt lib/en/.datadir $(INSTALL_DATA) lib/en/reference.txt $@ t0001a: test/00/t0001a.sh all $(SH) test/00/t0001a.sh t0002a: test/00/t0002a.sh all $(SH) test/00/t0002a.sh t0003a: test/00/t0003a.sh all $(SH) test/00/t0003a.sh t0004a: test/00/t0004a.sh all $(SH) test/00/t0004a.sh t0005a: test/00/t0005a.sh all $(SH) test/00/t0005a.sh t0006a: test/00/t0006a.sh all $(SH) test/00/t0006a.sh t0007a: test/00/t0007a.sh all $(SH) test/00/t0007a.sh t0008a: test/00/t0008a.sh all $(SH) test/00/t0008a.sh t0009a: test/00/t0009a.sh all $(SH) test/00/t0009a.sh t0010a: test/00/t0010a.sh all $(SH) test/00/t0010a.sh t0011a: test/00/t0011a.sh all $(SH) test/00/t0011a.sh t0012a: test/00/t0012a.sh all $(SH) test/00/t0012a.sh t0013a: test/00/t0013a.sh all $(SH) test/00/t0013a.sh t0014a: test/00/t0014a.sh all $(SH) test/00/t0014a.sh t0015a: test/00/t0015a.sh all $(SH) test/00/t0015a.sh t0016a: test/00/t0016a.sh all $(SH) test/00/t0016a.sh t0017a: test/00/t0017a.sh all $(SH) test/00/t0017a.sh t0018a: test/00/t0018a.sh all $(SH) test/00/t0018a.sh t0019a: test/00/t0019a.sh all $(SH) test/00/t0019a.sh t0020a: test/00/t0020a.sh all $(SH) test/00/t0020a.sh t0021a: test/00/t0021a.sh all $(SH) test/00/t0021a.sh t0022a: test/00/t0022a.sh all $(SH) test/00/t0022a.sh t0023a: test/00/t0023a.sh all $(SH) test/00/t0023a.sh t0024a: test/00/t0024a.sh all $(SH) test/00/t0024a.sh t0025a: test/00/t0025a.sh all $(SH) test/00/t0025a.sh t0026a: test/00/t0026a.sh all $(SH) test/00/t0026a.sh t0027a: test/00/t0027a.sh all $(SH) test/00/t0027a.sh t0028a: test/00/t0028a.sh all $(SH) test/00/t0028a.sh t0029a: test/00/t0029a.sh all $(SH) test/00/t0029a.sh t0030a: test/00/t0030a.sh all $(SH) test/00/t0030a.sh t0031a: test/00/t0031a.sh all $(SH) test/00/t0031a.sh lib/en/LC_MESSAGES/.nlsdir: lib/en/.nlsdir -$(INSTALL) -m 0755 -d $(NLSDIR)/en/LC_MESSAGES @-test -d $(NLSDIR)/en/LC_MESSAGES && touch $@ @sleep 1 lib/en/.nlsdir: lib/.nlsdir -$(INSTALL) -m 0755 -d $(NLSDIR)/en @-test -d $(NLSDIR)/en && touch $@ @sleep 1 lib/.nlsdir: -$(INSTALL) -m 0755 -d $(NLSDIR) @-test -d $(NLSDIR) && touch $@ @sleep 1 lib/en/man1/.mandir: lib/en/.mandir -$(INSTALL) -m 0755 -d $(mandir)/man1 @-test -d $(mandir)/man1 && touch $@ @sleep 1 lib/en/.mandir: -$(INSTALL) -m 0755 -d $(mandir) @-test -d $(mandir) && touch $@ @sleep 1 lib/en/man1/.datadir: lib/en/.datadir -$(INSTALL) -m 0755 -d $(datadir)/en/man1 @-test -d $(datadir)/en/man1 && touch $@ @sleep 1 lib/en/.datadir: lib/.datadir -$(INSTALL) -m 0755 -d $(datadir)/en @-test -d $(datadir)/en && touch $@ @sleep 1 lib/.datadir: -$(INSTALL) -m 0755 -d $(datadir) @-test -d $(datadir) && touch $@ @sleep 1 all: binaries po doc CommonFiles = common/ac/libintl.$(OBJEXT) common/ac/string.$(OBJEXT) \ common/ac/unistd.$(OBJEXT) common/ac/wchar.$(OBJEXT) \ common/ac/wctype.$(OBJEXT) common/arglex.$(OBJEXT) \ common/cmalloc.$(OBJEXT) common/compare.$(OBJEXT) \ common/env.$(OBJEXT) common/error.$(OBJEXT) \ common/error_intl.$(OBJEXT) common/fcheck.$(OBJEXT) \ common/fileio.$(OBJEXT) common/help.$(OBJEXT) \ common/input.$(OBJEXT) common/input/crlf.$(OBJEXT) \ common/input/file.$(OBJEXT) \ common/input/file_text.$(OBJEXT) \ common/input/hexify.$(OBJEXT) \ common/input/private.$(OBJEXT) \ common/input/pushba_trans.$(OBJEXT) \ common/input/quotprinenco.$(OBJEXT) \ common/input/stdin.$(OBJEXT) common/isdir.$(OBJEXT) \ common/language.$(OBJEXT) common/libdir.$(OBJEXT) \ common/mem.$(OBJEXT) common/mprintf.$(OBJEXT) \ common/output.$(OBJEXT) common/output/file.$(OBJEXT) \ common/output/private.$(OBJEXT) \ common/output/quotprindeco.$(OBJEXT) \ common/output/stdout.$(OBJEXT) common/page.$(OBJEXT) \ common/pager.$(OBJEXT) common/progname.$(OBJEXT) \ common/quit.$(OBJEXT) common/str.$(OBJEXT) \ common/str_list.$(OBJEXT) common/sub.$(OBJEXT) \ common/sub/basename.$(OBJEXT) common/sub/date.$(OBJEXT) \ common/sub/dirname.$(OBJEXT) \ common/sub/downcase.$(OBJEXT) common/sub/errno.$(OBJEXT) \ common/sub/expr.$(OBJEXT) \ common/sub/expr_gram.gen.$(OBJEXT) \ common/sub/expr_lex.$(OBJEXT) common/sub/ident.$(OBJEXT) \ common/sub/left.$(OBJEXT) common/sub/length.$(OBJEXT) \ common/sub/plural.$(OBJEXT) \ common/sub/progname.$(OBJEXT) common/sub/right.$(OBJEXT) \ common/sub/upcase.$(OBJEXT) \ common/sub/zero_pad.$(OBJEXT) common/trace.$(OBJEXT) \ common/undo.$(OBJEXT) common/version.$(OBJEXT) \ common/version_stmp.$(OBJEXT) common/wstr.$(OBJEXT) \ common/wstr_list.$(OBJEXT) TestFiles = t0001a t0002a t0003a t0004a t0005a t0006a t0007a t0008a \ t0009a t0010a t0011a t0012a t0013a t0014a t0015a t0016a \ t0017a t0018a t0019a t0020a t0021a t0022a t0023a t0024a \ t0025a t0026a t0027a t0028a t0029a t0030a t0031a install-man: $(mandir)/man1/fcomp.1 $(mandir)/man1/fhist.1 \ $(mandir)/man1/fhist_lic.1 $(mandir)/man1/fmerge.1 install-iman: install-iman-$(HAVE_I18N) install-iman-yes: $(datadir)/en/man1/fcomp.1 $(datadir)/en/man1/fhist.1 \ $(datadir)/en/man1/fhist_lic.1 \ $(datadir)/en/man1/fmerge.1 install-iman-no: po: po-$(HAVE_I18N) po-yes: lib/en/LC_MESSAGES/fcomp.mo lib/en/LC_MESSAGES/fhist.mo \ lib/en/LC_MESSAGES/fmerge.mo po-no: install-po: install-po-$(HAVE_I18N) install-po-yes: $(NLSDIR)/en/LC_MESSAGES/fcomp.mo \ $(NLSDIR)/en/LC_MESSAGES/fhist.mo \ $(NLSDIR)/en/LC_MESSAGES/fmerge.mo install-po-no: doc: doc-$(HAVE_GROFF) doc-yes: lib/en/building.ps lib/en/building.dvi lib/en/building.txt \ lib/en/readme.ps lib/en/readme.dvi lib/en/readme.txt \ lib/en/reference.ps lib/en/reference.dvi \ lib/en/reference.txt doc-no: install-doc: install-doc-$(HAVE_GROFF) install-doc-yes: $(datadir)/en/building.ps $(datadir)/en/building.dvi \ $(datadir)/en/building.txt $(datadir)/en/readme.ps \ $(datadir)/en/readme.dvi $(datadir)/en/readme.txt \ $(datadir)/en/reference.ps $(datadir)/en/reference.dvi \ $(datadir)/en/reference.txt install-doc-no: binaries: bin/fcomp$(EXEEXT) bin/fhist$(EXEEXT) bin/fmerge$(EXEEXT) fcomp_files = fcomp/main.$(OBJEXT) bin/fcomp$(EXEEXT): $(fcomp_files) common/lib.$(LIBEXT) .bin $(CC) $(LDFLAGS) -o $@ $(fcomp_files) common/lib.$(LIBEXT) $(LIBS) chmod 755 $@ $(bindir)/$(PROGRAM_PREFIX)fcomp$(PROGRAM_SUFFIX)$(EXEEXT): \ bin/fcomp$(EXEEXT) .bindir $(INSTALL_PROGRAM) bin/fcomp$(EXEEXT) $@ fhist_files = fhist/breaks.$(OBJEXT) fhist/diff.$(OBJEXT) \ fhist/extract.$(OBJEXT) fhist/list.$(OBJEXT) \ fhist/main.$(OBJEXT) fhist/modlin.$(OBJEXT) \ fhist/name.$(OBJEXT) fhist/prune.$(OBJEXT) \ fhist/subroutine.$(OBJEXT) fhist/update.$(OBJEXT) bin/fhist$(EXEEXT): $(fhist_files) common/lib.$(LIBEXT) .bin $(CC) $(LDFLAGS) -o $@ $(fhist_files) common/lib.$(LIBEXT) $(LIBS) chmod 755 $@ $(bindir)/$(PROGRAM_PREFIX)fhist$(PROGRAM_SUFFIX)$(EXEEXT): \ bin/fhist$(EXEEXT) .bindir $(INSTALL_PROGRAM) bin/fhist$(EXEEXT) $@ fmerge_files = fmerge/main.$(OBJEXT) fmerge/work.$(OBJEXT) bin/fmerge$(EXEEXT): $(fmerge_files) common/lib.$(LIBEXT) .bin $(CC) $(LDFLAGS) -o $@ $(fmerge_files) common/lib.$(LIBEXT) $(LIBS) chmod 755 $@ $(bindir)/$(PROGRAM_PREFIX)fmerge$(PROGRAM_SUFFIX)$(EXEEXT): \ bin/fmerge$(EXEEXT) .bindir $(INSTALL_PROGRAM) bin/fmerge$(EXEEXT) $@ clean-obj: rm -f core common/lib.$(LIBEXT) .bin .bindir rm -f common/ac/libintl.$(OBJEXT) common/ac/string.$(OBJEXT) rm -f common/ac/unistd.$(OBJEXT) common/ac/wchar.$(OBJEXT) rm -f common/ac/wctype.$(OBJEXT) common/arglex.$(OBJEXT) rm -f common/cmalloc.$(OBJEXT) common/compare.$(OBJEXT) rm -f common/env.$(OBJEXT) common/error.$(OBJEXT) rm -f common/error_intl.$(OBJEXT) common/fcheck.$(OBJEXT) rm -f common/fileio.$(OBJEXT) common/help.$(OBJEXT) rm -f common/input.$(OBJEXT) common/input/crlf.$(OBJEXT) rm -f common/input/file.$(OBJEXT) rm -f common/input/file_text.$(OBJEXT) rm -f common/input/hexify.$(OBJEXT) rm -f common/input/private.$(OBJEXT) rm -f common/input/pushba_trans.$(OBJEXT) rm -f common/input/quotprinenco.$(OBJEXT) rm -f common/input/stdin.$(OBJEXT) common/isdir.$(OBJEXT) rm -f common/language.$(OBJEXT) common/libdir.$(OBJEXT) rm -f common/mem.$(OBJEXT) common/mprintf.$(OBJEXT) rm -f common/output.$(OBJEXT) common/output/file.$(OBJEXT) rm -f common/output/private.$(OBJEXT) rm -f common/output/quotprindeco.$(OBJEXT) rm -f common/output/stdout.$(OBJEXT) common/page.$(OBJEXT) rm -f common/pager.$(OBJEXT) common/progname.$(OBJEXT) rm -f common/quit.$(OBJEXT) common/str.$(OBJEXT) rm -f common/str_list.$(OBJEXT) common/sub.$(OBJEXT) rm -f common/sub/basename.$(OBJEXT) common/sub/date.$(OBJEXT) rm -f common/sub/dirname.$(OBJEXT) common/sub/downcase.$(OBJEXT) rm -f common/sub/errno.$(OBJEXT) common/sub/expr.$(OBJEXT) rm -f common/sub/expr_gram.gen.c common/sub/expr_gram.gen.h rm -f common/sub/expr_gram.gen.$(OBJEXT) rm -f common/sub/expr_lex.$(OBJEXT) common/sub/ident.$(OBJEXT) rm -f common/sub/left.$(OBJEXT) common/sub/length.$(OBJEXT) rm -f common/sub/plural.$(OBJEXT) common/sub/progname.$(OBJEXT) rm -f common/sub/right.$(OBJEXT) common/sub/upcase.$(OBJEXT) rm -f common/sub/zero_pad.$(OBJEXT) common/trace.$(OBJEXT) rm -f common/undo.$(OBJEXT) common/version.$(OBJEXT) rm -f common/version_stmp.$(OBJEXT) common/wstr.$(OBJEXT) rm -f common/wstr_list.$(OBJEXT) fcomp/main.$(OBJEXT) rm -f fhist/breaks.$(OBJEXT) fhist/diff.$(OBJEXT) rm -f fhist/extract.$(OBJEXT) fhist/list.$(OBJEXT) rm -f fhist/main.$(OBJEXT) fhist/modlin.$(OBJEXT) rm -f fhist/name.$(OBJEXT) fhist/prune.$(OBJEXT) rm -f fhist/subroutine.$(OBJEXT) fhist/update.$(OBJEXT) rm -f fmerge/main.$(OBJEXT) fmerge/work.$(OBJEXT) rm -f lib/en/LC_MESSAGES/.nlsdir lib/en/.nlsdir lib/.nlsdir rm -f lib/en/building.ps lib/en/building.dvi lib/en/building.txt rm -f lib/en/man1/.mandir lib/en/.mandir lib/en/man1/.datadir rm -f lib/en/.datadir lib/.datadir lib/en/readme.ps rm -f lib/en/readme.dvi lib/en/readme.txt lib/en/reference.ps rm -f lib/en/reference.dvi lib/en/reference.txt clean: clean-obj rm -f bin/fcomp$(EXEEXT) bin/fhist$(EXEEXT) bin/fmerge$(EXEEXT) distclean: clean rm -f config.status config.log config.cache Makefile rm -f common/config.h etc/libdir-h common/lib.$(LIBEXT): $(CommonFiles) rm -f $@ ar cq $@ $(CommonFiles) $(RANLIB) $@ .bin: -mkdir bin -@test -d bin && touch $@ @sleep 1 .bindir: -$(INSTALL) -d -m 0755 $(bindir) -@test -d $(bindir) && touch $@ @sleep 1 sure: $(TestFiles) @echo Passed All Tests install: install-bin install-man install-iman install-po install-doc @echo Installation Complete install-bin: $(bindir)/$(PROGRAM_PREFIX)fcomp$(PROGRAM_SUFFIX)$(EXEEXT) \ $(bindir)/$(PROGRAM_PREFIX)fhist$(PROGRAM_SUFFIX)$(EXEEXT) \ $(bindir)/$(PROGRAM_PREFIX)fmerge$(PROGRAM_SUFFIX)$(EXEEXT) fhist-1.18/aegis.conf 644 0 0 1077411265752627 140000ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1993-1995, 1998, 2000, 2006, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ configuration_directory = "aegis.conf.d"; /* * how to build the project * (actually, how to do an integration build) * mandatory */ build_command = "cook -book ${source etc/Howto.cook} -nl -st " "project=$project change=$change " "version=$version arch=$arch " "search_path=$search_path " "cc=${Project_Specific cc} " "${uname}_cc=${Project_Specific ${uname}_cc} " "${uname}_cc_flags=${Project_Specific ${uname}_cc_flags} " "${uname}_ld_flags=${Project_Specific ${uname}_ld_flags} " "${uname}_libs=${Project_Specific ${uname}_libs}"; /* * When do -Integrate_Begin, link the baseline to the integration directory, * rather than copying it.. This should be much faster. * * There is a gotcha: all the recipes in Howto.cook must unlink their targets * before re-creating them, otherwise the baseline will be trashed. */ link_integration_directory = true; /* * create a new history * always executed as the project owner */ history_create_command = "fhist ${basename $history} -cr -cu -i ${input} -p ${dirname $history} -r"; /* * get a file from history * may be executed by developers */ history_get_command = "fhist ${basename $history} -e '$edit' -o $output -p ${dirname $history}"; /* * add a new change to the history * always executed as the project owner */ history_put_command = "fhist ${basename $history} -cu -cr -i $input -p ${dirname $history} -r"; /* * query the topmost edit of a history file * Result to be printed on stdout. * may be executed by developers */ history_query_command = "fhist ${basename $history} -l 0 -p ${dirname $history} -q"; /* * difference of 2 files */ diff_command = "fcomp -s -w $original $input -o $output"; /* * merege 2 competing edits */ merge_command = "fmerge $original $mostRecent $input -o $output -c $input,C"; /* * whenever files are added to or removed from the change, * execute the following command. */ change_file_command = "rm -f .c_inclrc etc/cook/*"; project_file_command = "rm -f .c_inclrc etc/cook/*"; /* * new file templates */ file_template = [ { pattern = [ "*.[cyl]" ]; body = "${read_file ${source etc/template/c abs}}"; }, { pattern = [ "*.h" ]; body = "${read_file ${source etc/template/h abs}}"; }, { pattern = [ "test/*/*.sh" ]; body = "${read_file ${source etc/template/test abs}}"; }, { pattern = [ "*.sh" ]; body = "${read_file ${source etc/template/sh abs}}"; }, { pattern = [ "*.man", "*.[12345678]" ]; body = "${read_file ${source etc/template/man abs}}"; }, { pattern = [ "*.so", "*.ms", "*.me" ]; body = "${read_file ${source etc/template/ms abs}}"; }, { pattern = [ "*" ]; body = "${read_file ${source etc/template/generic abs}}"; } ]; architecture = [ { name = "linux-i486"; pattern = "Linux-*-*-i?86"; }, ]; develop_begin_command = "ln -s $bl bl"; integrate_begin_command = "rm -f aegis.log common/patchlevel.h lib/*/readme/new.so etc/version.so"; test_command = "$sh $filename $arch"; maximum_filename_length = 14; project_specific = [ { name = "html:body-begin"; value = @ @; }, ]; fhist-1.18/aegis.conf.d/aede-policy 644 0 0 221711265752627 163660ustar PeterMiller 0 0# # fhist - file history and comparison tools # Copyright (C) 2008 Peter Miller # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or (at # your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # develop_end_policy_command = "aede-policy -p $project -c $change"; project_specific = [ { name = "aede-policy"; value = "copyright " "crlf " "description " "fsf-address " "gpl-version=3 " "line-length " # "merge-fhist " "no-manifest " "no-tabs " "printable " "white-space" ; } ]; fhist-1.18/aegis.conf.d/rss 644 0 0 252711265752627 150060ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2005, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ project_specific = [ { name = "rss:feedfilename-completed.xml"; value = "completed"; }, { name = "rss:feeddescription-completed.xml"; value = "This feed provides you with a way to subscribe to new " "FHist change sets if you are interested in tracking FHist " "development." ; }, { name = "rss:feedtitle-completed.xml"; value = "Developments"; }, { name = "rss:feedlanguage-completed.xml"; value = "en-AU"; }, ]; fhist-1.18/aegis.conf.d/site.conf 644 0 0 1076211265752627 161070ustar PeterMiller 0 0# # fhist - file history and comparison tools # Copyright (C) 2006, 2008 Peter Miller # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see # . # /* * This file define some variables specific to *your* site. */ project_specific = [ /* * Define the following attribute if you need to override the * default autoconf name, or if it is in an unusual (not in * $PATH) directory. */ { name = "autoconf"; value = ""; }, /* * Define the following attribute if you need to override the * default autoheader name, or if it is in an unusual (not in * $PATH) directory. */ { name = "autoheader"; value = ""; }, /* * Define the following attribute if you want to override the * c compiler for the solaris 5.8 architecture. */ { name = "sun4-SunOS-5.8_cc"; value = ""; }, { name = "sun4-SunOS-5.8_cc_flags"; value = "-I/usr/local/include/libxml2"; }, { name = "sun4-SunOS-5.8_ld_flags"; value = "-L/usr/local/lib"; }, { name = "sun4-SunOS-5.8_libs"; value = "-liconv"; }, /* * Define the following attribute if you want to override the * c compiler for the linux 2.4 architecture. */ { name = "i686-Linux-2.4_cc"; value = ""; }, { name = "i686-Linux-2.4_cc_flags"; value = "-I/usr/local/include/libxml2"; }, { name = "i686-Linux-2.4_ld_flags"; value = "-L/usr/local/lib%-Wl,-rpath,/usr/local/lib"; }, { name = "i686-Linux-2.4_libs"; value = ""; }, /* * Define the following attribute if you want to override the * c compiler for the linux 2.6 architecture. */ { name = "i686-Linux-2.6_cc"; value = ""; }, { name = "i686-Linux-2.6_cc_flags"; value = "-I/usr/include/libxml2"; }, { name = "i686-Linux-2.6_ld_flags"; value = ""; }, { name = "i686-Linux-2.6_libs"; value = ""; }, /* * Define the following attributes if you want to override the * c compiler for the ppc-Darwin architecture. */ { name = "ppc-Darwin-8.x_cc"; value = ""; }, { name = "ppc-Darwin-8.x_cc_flags"; value = ""; }, { name = "ppc-Darwin-8.x_ld_flags"; value = "-L/usr/local/lib%-lintl"; }, { name = "ppc-Darwin-8.x_libs"; value = "-lintl"; }, /* * Define the following attribute if you want to override the * c compiler for the mips architecture. */ { name = "mips-IRIX64-6.5_cc"; value = ""; }, { name = "mips-IRIX64-6.5_cc_flags"; value = "-I/usr/local/include/libxml2"; }, { name = "mips-IRIX64-6.5_ld_flags"; value = "-Wl,-L/usr/local/lib,-LD_MSG:woff=84:woff=127,-rpath,/usr/local/lib"; }, { name = "mips-IRIX64-6.5_libs"; value = "-liconv"; }, /* * Define the following attribute if you want to suggest which * c compiler to use to configure. */ { name = "cc"; value = ""; } ]; fhist-1.18/common/ac/ctype.h 644 0 0 320411265752627 151570ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_AC_CTYPE_H #define COMMON_AC_CTYPE_H #include #include /* * HAVE_ISWPRINT is only set if (a) there is a have_iswprint function, * and (b) it works for ascii. It is assumed that if iswprint is absent * or brain-dead, then so are the rest. * * This code copes with the case where (a) it exists, (b) it is broken, * and (c) it is defined in , of all places! */ #ifndef HAVE_ISWPRINT #ifdef iswprint #undef iswprint #endif #ifdef iswspace #undef iswspace #endif #ifdef iswpunct #undef iswpunct #endif #ifdef iswupper #undef iswupper #endif #ifdef iswlower #undef iswlower #endif #ifdef iswdigit #undef iswdigit #endif #ifdef iswalnum #undef iswalnum #endif #ifdef towupper #undef towupper #endif #ifdef towlower #undef towlower #endif #endif /* !HAVE_ISWPRINT */ #endif /* COMMON_AC_CTYPE_H */ fhist-1.18/common/ac/dirent.h 644 0 0 261411265752627 153240ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1994, 1998, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_AC_DIRENT_H #define COMMON_AC_DIRENT_H #include /* unistd.h defines _POSIX_VERSION on POSIX.1 systems. */ #if defined(DIRENT) || defined(_POSIX_VERSION) #include #define NLENGTH(dirent) (strlen((dirent)->d_name)) #else /* not (DIRENT or _POSIX_VERSION) */ #define dirent direct #define NLENGTH(dirent) ((dirent)->d_namlen) #ifdef SYSNDIR #include #endif /* SYSNDIR */ #ifdef SYSDIR #include #endif /* SYSDIR */ #ifdef NDIR #include #endif /* NDIR */ #endif /* not (DIRENT or _POSIX_VERSION) */ #endif /* COMMON_AC_DIRENT_H */ fhist-1.18/common/ac/errno.h 644 0 0 164611265752627 151700ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2000, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_AC_ERRNO_H #define COMMON_AC_ERRNO_H #include #include #endif /* COMMON_AC_ERRNO_H */ fhist-1.18/common/ac/grp.h 644 0 0 173011265752627 146250ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2002, 2004, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_AC_GRP_H #define COMMON_AC_GRP_H /* MacOS X needs sys/types.h before grp.h */ #include #include #endif /* COMMON_AC_GRP_H */ fhist-1.18/common/ac/libintl.c 644 0 0 247211265752627 154710ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include /* * NAME * gettext * * DESCRIPTION * The gettext function is used to translate messages into a * language dictated by the LANG environment variable (et al). If * the current operating system does not supply one, then pass the * message through unchanged. (This is what gettext will do for * error messages it does not have a translation for.) */ #ifndef HAVE_GETTEXT char * gettext(const char *s) { return (char *)s; } #endif /* !HAVE_GETTEXT */ fhist-1.18/common/ac/libintl.h 644 0 0 236611265752627 155000ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 1999, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_AC_LIBINTL_H #define COMMON_AC_LIBINTL_H #include /* * if the libintl.h include file is available, include it */ #ifdef HAVE_LIBINTL_H #include #else #ifdef HAVE_LIBGETTEXT_H #include #else /* * otherwise, provide a prototype and nothing else */ #include char *gettext(const char *); #endif /* !HAVE_LIBGETTEXT_H */ #endif /* !HAVE_LIBINTL_H */ #endif /* COMMON_AC_LIBINTL_H */ fhist-1.18/common/ac/limits.h 644 0 0 367211265752627 153450ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1994, 1998, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_AC_LIMITS_H #define COMMON_AC_LIMITS_H #include #ifdef HAVE_LIMITS_H #include #else /* * fake a few of the values * (the *_MIN things only work on 2s compliment machines, * the *SHRT* things do not work on non-compliant compilers) */ #ifndef USHRT_MAX #define USHRT_MAX ((unsigned short)~(unsigned)0) #endif #ifndef SHRT_MAX #define SHRT_MAX ((short)(USHRT_MAX >> 1)) #endif #ifndef SHRT_MIN #define SHRT_MIN ((short)(~(unsigned short)SHRT_MAX)) #endif #ifndef UINT_MAX #define UINT_MAX (~(unsigned)0) #endif #ifndef INT_MAX #define INT_MAX ((int)(UINT_MAX >> 1)) #endif #ifndef INT_MIN #define INT_MIN ((int)(~(unsigned)INT_MAX)) #endif #ifndef ULONG_MAX #define ULONG_MAX (~(unsigned long)0) #endif #ifndef LONG_MAX #define LONG_MAX ((long)(ULONG_MAX >> 1)) #endif #ifndef LONG_MIN #define LONG_MIN ((long)(~(unsigned long)LONG_MAX)) #endif #ifndef CHAR_BIT #define CHAR_BIT 8 #endif #ifndef MB_LEN_MAX #define MB_LEN_MAX 1 #endif #ifndef UCHAR_MAX #define UCHAR_MAX 255 #endif #endif /* !HAVE_LIMITS_H */ #endif /* COMMON_AC_LIMITS_H */ fhist-1.18/common/ac/locale.h 644 0 0 170711265752627 153000ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_AC_LOCALE_H #define COMMON_AC_LOCALE_H #include #ifdef HAVE_LOCALE_H #include #endif #endif /* COMMON_AC_LOCALE_H */ fhist-1.18/common/ac/pwd.h 644 0 0 165211265752627 146320ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2002, 2004, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_AC_PWD_H #define COMMON_AC_PWD_H #include #include #endif /* COMMON_AC_PWD_H */ fhist-1.18/common/ac/signal.h 644 0 0 165211265752627 153150ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1999, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_AC_SIGNAL_H #define COMMON_AC_SIGNAL_H #include #include #endif /* COMMON_AC_SIGNAL_H */ fhist-1.18/common/ac/stdarg.h 644 0 0 167311265752627 153270ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1992-1994, 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_AC_STDARG_H #define COMMON_AC_STDARG_H #include #include #endif /* COMMON_AC_STDARG_H */ fhist-1.18/common/ac/stddef.h 644 0 0 206111265752627 153040ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1994, 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_AC_STDDEF_H #define COMMON_AC_STDDEF_H #include #ifdef HAVE_STDDEF_H #include #endif #ifndef offsetof #define offsetof(a, b) ((size_t)((char *)&((a *)0)->b - (char *)0)) #endif #endif /* COMMON_AC_STDDEF_H */ fhist-1.18/common/ac/stdio.h 644 0 0 245311265752627 151620ustar PeterMiller 0 0/* * cook - file construction tool * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_AC_STDIO_H #define COMMON_AC_STDIO_H /* * Need to define _POSIX_SOURCE on Linux, in order to get the fdopen, * fileno, popen and pclose function prototypes. */ #ifdef __linux__ #ifndef _POSIX_SOURCE #define _POSIX_SOURCE 1 #endif #endif #include /* * Ancient pre-ANSI-C systems (e.g. SunOS 4.1.2) fail to define this. */ #ifndef SEEK_SET #define SEEK_SET 0 #endif #include #ifndef HAVE_CUSERID #include char *cuserid(char *); #endif #endif /* COMMON_AC_STDIO_H */ fhist-1.18/common/ac/stdlib.h 644 0 0 310411265752627 153130ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1994, 1998, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_AC_STDLIB_H #define COMMON_AC_STDLIB_H #include #ifdef HAVE_STDLIB_H #include #else #ifndef _WCHAR_T #ifndef _T_WCHAR_ #ifndef _T_WCHAR #ifndef __WCHAR_T #ifndef _WCHAR_T_ #ifndef _WCHAR_T_H #ifndef ___int_wchar_t_h #ifndef __INT_WCHAR_T_H #ifndef _GCC_WCHAR_T #define _WCHAR_T #define _T_WCHAR_ #define _T_WCHAR #define __WCHAR_T #define _WCHAR_T_ #define _WCHAR_T_H #define ___int_wchar_t_h #define __INT_WCHAR_T_H #define _GCC_WCHAR_T #ifndef __WCHAR_TYPE__ #define __WCHAR_TYPE__ int #endif typedef __WCHAR_TYPE__ wchar_t; typedef int wchar_t; #endif #endif #endif #endif #endif #endif #endif #endif #endif #ifndef MB_LEN_MAX #define MB_LEN_MAX 1 #endif #ifndef MB_CUR_MAX #define MB_CUR_MAX 1 #endif #endif #endif /* COMMON_AC_STDLIB_H */ fhist-1.18/common/ac/string.c 644 0 0 1134411265752627 153600ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1993, 1994, 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . * * This file contains functions for use with non-ANSI conforming systems * to implement absent ANSI functionality. */ #include #include #include #include #include /* * NAME * strerror - string for error number * * SYNOPSIS * char *strerror(int errnum); * * DESCRIPTION * The strerror function maps the error number in errnum to an error * message string. * * RETURNS * The strerror function returns a pointer to the string, the contents of * which are implementation-defined. The array pointed to shall not be * modified by the program, but may be overwritten by a subsequent call to * the strerror function. * * CAVEAT * Unknown errors will be rendered in the form "Error %d", where %d will * be replaced by a decimal representation of the error number. */ #ifndef HAVE_STRERROR char * strerror(int n) { extern int sys_nerr; extern char *sys_errlist[]; static char buffer[30]; if (n < 1 || n > sys_nerr) { sprintf(buffer, "Error %d", n); return buffer; } return sys_errlist[n]; } #endif /* !HAVE_STRERROR */ #ifndef HAVE_STRCASECMP int strcasecmp(const char *s1, const char *s2) { int c1; int c2; for (;;) { c1 = *s1++; if (islower(c1)) c1 = toupper(c1); c2 = *s2++; if (islower(c2)) c2 = toupper(c2); if (c1 != c2) { /* * if s1 is a leading substring of s2, must * return -1, even if the next character of s2 * is negative. */ if (!c1) return -1; if (c1 < c2) return -1; return 1; } if (!c1) return 0; } } #endif /* !HAVE_STRCASECMP */ #ifndef HAVE_STRSIGNAL char * strsignal(int n) { static char buffer[16]; switch (n) { #ifdef SIGHUP case SIGHUP: return "hang up [SIGHUP]"; #endif /* SIGHUP */ #ifdef SIGINT case SIGINT: return "user interrupt [SIGINT]"; #endif /* SIGINT */ #ifdef SIGQUIT case SIGQUIT: return "user quit [SIGQUIT]"; #endif /* SIGQUIT */ #ifdef SIGILL case SIGILL: return "illegal instruction [SIGILL]"; #endif /* SIGILL */ #ifdef SIGTRAP case SIGTRAP: return "trace trap [SIGTRAP]"; #endif /* SIGTRAP */ #ifdef SIGIOT case SIGIOT: return "abort [SIGIOT]"; #endif /* SIGIOT */ #ifdef SIGEMT case SIGEMT: return "EMT instruction [SIGEMT]"; #endif /* SIGEMT */ #ifdef SIGFPE case SIGFPE: return "floating point exception [SIGFPE]"; #endif /* SIGFPE */ #ifdef SIGKILL case SIGKILL: return "kill [SIGKILL]"; #endif /* SIGKILL */ #ifdef SIGBUS case SIGBUS: return "bus error [SIGBUS]"; #endif /* SIGBUS */ #ifdef SIGSEGV case SIGSEGV: return "segmentation violation [SIGSEGV]"; #endif /* SIGSEGV */ #ifdef SIGSYS case SIGSYS: return "bad argument to system call [SIGSYS]"; #endif /* SIGSYS */ #ifdef SIGPIPE case SIGPIPE: return "write on a pipe with no one to read it [SIGPIPE]"; #endif /* SIGPIPE */ #ifdef SIGALRM case SIGALRM: return "alarm clock [SIGALRM]"; #endif /* SIGALRM */ #ifdef SIGTERM case SIGTERM: return "software termination [SIGTERM]"; #endif /* SIGTERM */ #ifdef SIGUSR1 case SIGUSR1: return "user defined signal one [SIGUSR1]"; #endif /* SIGUSR1 */ #ifdef SIGUSR2 case SIGUSR2: return "user defined signal two [SIGUSR2]"; #endif /* SIGUSR2 */ #ifdef SIGCLD case SIGCLD: return "death of child [SIGCLD]"; #endif /* SIGCLD */ #ifdef SIGPWR case SIGPWR: return "power failure [SIGPWR]"; #endif /* SIGPWR */ default: sprintf(buffer, "signal %d", n); return buffer; } } #endif /* !HAVE_STRSIGNAL */ fhist-1.18/common/ac/string.h 644 0 0 346411265752627 153510ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1994, 1998, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_AC_STRING_H #define COMMON_AC_STRING_H #include /* * We could have used __USE_BSD, but that defines prototypes for the * index, rindex, bcmp, bzero and bcopy functions, and we don't want * them. This prototype does not conflict, however. */ #if !defined(HAVE_STRCASECMP) || defined(__linux__) # if __STDC__ >= 1 # ifdef __USE_BSD # undef __USE_BSD # endif int strcasecmp(const char *, const char *); # endif #endif /* * We could have used __USE_GNU, but that defines prototypes for * too many other things. This prototype does not conflict, however. */ #if !defined(HAVE_STRSIGNAL) || defined(__linux__) # if __STDC__ >= 1 char *strsignal(int); # endif #endif #if STDC_HEADERS || HAVE_STRING_H # include /* An ANSI string.h and pre-ANSI memory.h might conflict. */ # if !STDC_HEADERS && HAVE_MEMORY_H # include # endif #else /* memory.h and strings.h conflict on some systems. */ # include #endif #endif /* COMMON_AC_STRING_H */ fhist-1.18/common/ac/sys/stat.h 644 0 0 172711265752627 156340ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2004, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_AC_SYS_STAT_H #define COMMON_AC_SYS_STAT_H #include #ifdef HAVE_SYS_STAT_H #include #endif #endif /* COMMON_AC_SYS_STAT_H */ fhist-1.18/common/ac/sys/types.h 644 0 0 172611265752627 160240ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2004, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_AC_SYS_TYPES_H #define COMMON_AC_SYS_TYPES_H #include #ifdef HAVE_SYS_TYPES_H #include #endif #endif /* COMMON_AC_SYS_TYPES_H */ fhist-1.18/common/ac/termios.h 644 0 0 212511265752627 155160ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_AC_TERMIOS_H #define COMMON_AC_TERMIOS_H #include #ifdef HAVE_winsize_SYS_IOCTL_H #include #else #ifdef HAVE_winsize_TERMIOS_H #include #endif /* HAVE_winsize_TERMIOS_H */ #endif /* !HAVE_winsize_SYS_IOCTL_H */ #endif /* COMMON_AC_TERMIOS_H */ fhist-1.18/common/ac/time.h 644 0 0 236011265752627 147730ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1994, 1998, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_AC_TIME_H #define COMMON_AC_TIME_H #include /* * Catch-22: Dec Alpha OSF/1: need to include time.h before sys/time.h * before time.h */ #ifdef __alpha__ #ifndef _CLOCK_ID_T #define _CLOCK_ID_T typedef int clockid_t; #endif #endif #ifdef TIME_WITH_SYS_TIME #include #include #else #ifdef HAVE_SYS_TIME_H #include #else #include #endif #endif #endif /* COMMON_AC_TIME_H */ fhist-1.18/common/ac/unistd.c 644 0 0 220111265752627 153300ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #ifndef HAVE_RENAME /* * Routine to rename files using link and unlink. * Returns -1 on failure. */ int rename(char *oldname, char *newname) { if (link(oldname, newname) < 0) return -1; if (unlink(oldname) < 0) { unlink(newname); return -1; } return 0; } #endif fhist-1.18/common/ac/unistd.h 644 0 0 243611265752627 153470ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1994, 1998, 2004, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_AC_UNISTD_H #define COMMON_AC_UNISTD_H #include /* * Need to define _BSD_SOURCE on Linux to get prototypes for the symlink * and readlink functions. */ #ifdef __linux__ #ifndef _BSD_SOURCE #define _BSD_SOURCE 1 #endif #ifndef __USE_BSD #define __USE_BSD 1 #endif #endif #ifdef HAVE_UNISTD_H #include #include #endif #ifndef SEEK_SET #define SEEK_SET 0 #endif #ifndef F_OK #define F_OK 0 #endif #endif /* COMMON_AC_UNISTD_H */ fhist-1.18/common/ac/wchar.c 644 0 0 200711265752627 151320ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #ifndef HAVE_WCSLEN size_t wcslen(const wchar_t *wcs) { const wchar_t *start; start = wcs; while (*wcs) ++wcs; return (wcs - start); } #endif /* !HAVE_WCSLEN */ fhist-1.18/common/ac/wchar.h 644 0 0 512711265752627 151450ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2001, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_AC_WCHAR_H #define COMMON_AC_WCHAR_H #include /* * From the ``believe it or not'' category: The Dec Alpha OSF/1 * includes , but we need to make sure own own * is invoked first. */ #ifdef __alpha___ #include #endif #ifdef HAVE_WCHAR_H #include #else #include #include typedef int mbstate_t; #ifndef WEOF #define WEOF (wchar_t)(-1); #endif int mbsinit(const mbstate_t *); size_t wcslen(const wchar_t *); size_t mbrlen(const char *, size_t, mbstate_t *); size_t mbrtowc(wchar_t *, const char *, size_t, mbstate_t *); size_t wcrtomb(char *, wchar_t, mbstate_t *); size_t mbsrtowcs(wchar_t *, const char **, size_t, mbstate_t *); size_t wcsrtombs(char *, const wchar_t **, size_t, mbstate_t *); #endif /* * HAVE_ISWPRINT is only set if (a) there is a have_iswprint function, * and (b) it works for ascii. It is assumed that if iswprint is absent * or brain-dead, then so are the rest. * * This code copes with the case where (a) it exists, (b) it is broken, * and (c) it is defined in , of all places! */ #ifndef HAVE_ISWPRINT #ifdef iswprint #undef iswprint #endif #ifdef iswspace #undef iswspace #endif #ifdef iswpunct #undef iswpunct #endif #ifdef iswupper #undef iswupper #endif #ifdef iswlower #undef iswlower #endif #ifdef iswdigit #undef iswdigit #endif #ifdef iswalnum #undef iswalnum #endif #ifdef towupper #undef towupper #endif #ifdef towlower #undef towlower #endif #endif /* !HAVE_ISWPRINT */ /* * The ANSI C standard states that wint_t symbol shall be defined by * and . The GNU people also define it in , * but this is incorrect. */ #ifndef HAVE_WINT_T #define HAVE_WINT_T typedef wchar_t wint_t; #endif #endif /* COMMON_AC_WCHAR_H */ fhist-1.18/common/ac/wctype.c 644 0 0 702311265752627 153440ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . * * The use of the long variable is to cope with the possibility of an * unusual data type having been defined for wchar_t. Unusual types * have been observed, and often cause unnecessary warnings from * compilers. The long takes care of it. * * Also, the HAVE_ISWPRINT can be false (e.g. on Solaris) but iswprint * is still available as a macro. Hence, we need to test for the macro * as well as the function. */ #include #include #include #ifndef HAVE_ISWPRINT #ifndef iswprint int iswprint(wint_t wc) { long c; /* * Assume characters over 256 are printable. Assume characters * under 256 are either ASCII or Latin-1. These are dumb * assumptions, but real i18n support will provide a real * iswprint function. */ c = wc; return (c > UCHAR_MAX || (c >= 0 && isprint((unsigned char)c))); } #endif #ifndef iswspace int iswspace(wint_t wc) { long c; /* * Assume characters over 256 are letters. Assume characters * under 256 are either ASCII or Latin-1. These are dumb * assumptions, but real i18n support will provide a real * iswspace function. */ c = wc; return (c >= 0 && c <= UCHAR_MAX && isspace((unsigned char)c)); } #endif #ifndef iswpunct int iswpunct(wint_t wc) { long c; /* * Assume characters over 256 are letters. Assume characters * under 256 are either ASCII or Latin-1. These are dumb * assumptions, but real i18n support will provide a real * iswpunct function. */ c = wc; return (c >= 0 && c <= UCHAR_MAX && ispunct((unsigned char)c)); } #endif #ifndef iswupper int iswupper(wint_t wc) { long c; c = wc; return (c >= 0 && c <= UCHAR_MAX && isupper((unsigned char)c)); } #endif #ifndef iswlower int iswlower(wint_t wc) { long c; c = wc; return (c >= 0 && c <= UCHAR_MAX && islower((unsigned char)c)); } #endif #ifndef iswdigit int iswdigit(wint_t wc) { long c; c = wc; return (c >= 0 && c <= UCHAR_MAX && isdigit((unsigned char)c)); } #endif #ifndef iswalnum int iswalnum(wint_t wc) { long c; c = wc; return (c >= 0 && c <= UCHAR_MAX && isalnum((unsigned char)c)); } #endif #ifndef towupper wint_t towupper(wint_t wc) { long c; c = wc; if (c >= 0 && c <= UCHAR_MAX && islower((unsigned char)c)) return toupper((unsigned char)c); return c; } #endif #ifndef towlower wint_t towlower(wint_t wc) { long c; c = wc; if (c >= 0 && c <= UCHAR_MAX && isupper((unsigned char)c)) return tolower((unsigned char)c); return c; } #endif #endif /* !HAVE_ISWPRINT */ fhist-1.18/common/ac/wctype.h 644 0 0 515311265752627 153530ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 1999, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_AC_WCTYPE_H #define COMMON_AC_WCTYPE_H /* * Often needed, if is implemented in terms of . * Not strictly ANSI C standard conforming. */ #include /* * Often needed, particularly to implement the dummy functions if real * ones aren't present. Not strictly ANSI C standard conforming. */ #include /* Solaris bug 1250837: include wchar.h before widec.h */ #ifdef HAVE_WCHAR_H #include #endif /* * Silicon Graphics */ #ifdef HAVE_WIDEC_H #include #endif #ifdef HAVE_WCTYPE_H #include #endif /* * The ANSI C standard states that wint_t symbol shall be defined by * and . The GNU people also define it in , * but this is incorrect. */ #ifndef HAVE_WINT_T #define HAVE_WINT_T typedef wchar_t wint_t; #endif #ifndef HAVE_WCTYPE_H #include int iswalnum(wint_t); int iswdigit(wint_t); int iswlower(wint_t); int iswprint(wint_t); int iswpunct(wint_t); int iswspace(wint_t); int iswupper(wint_t); wint_t towlower(wint_t); wint_t towupper(wint_t); #endif /* * HAVE_ISWPRINT is only set if (a) there is a have_iswprint function, * and (b) it works for ascii. It is assumed that if iswprint is absent * or brain-dead, then so are the rest. * * This code copes with the case where (a) it exists, (b) it is broken, * and (c) it is defined in */ #ifndef HAVE_ISWPRINT #ifdef iswprint #undef iswprint #endif #ifdef iswspace #undef iswspace #endif #ifdef iswpunct #undef iswpunct #endif #ifdef iswupper #undef iswupper #endif #ifdef iswlower #undef iswlower #endif #ifdef iswdigit #undef iswdigit #endif #ifdef iswalnum #undef iswalnum #endif #ifdef towupper #undef towupper #endif #ifdef towlower #undef towlower #endif #endif /* !HAVE_ISWPRINT */ #endif /* COMMON_AC_WCTYPE_H */ fhist-1.18/common/arglex.c 644 0 0 2341511265752627 147530ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1991-1994, 1998, 2000-2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include #include #include #include #include #include #include #include static arglex_table_ty table[] = { { "-", arglex_token_stdio, }, { "-Help", arglex_token_help, }, { "-VERSion", arglex_token_version, }, { 0, 0, }, /* end marker */ }; static int argc; static char **argv; arglex_value_ty arglex_value; arglex_token_ty arglex_token; static arglex_table_ty *utable; static const char *partial; void arglex_init(int ac, char **av, arglex_table_ty *tp) { progname_set(av[0]); language_init(); argc = ac - 1; argv = av + 1; utable = tp; } int arglex_compare(const char *formal, const char *actual) { char fc; char ac; int result; for (;;) { ac = *actual++; if (isupper((unsigned char)ac)) ac = tolower((unsigned char)ac); fc = *formal++; switch (fc) { case 0: result = !ac; goto ret; case '_': if (ac == '-') break; /* fall through... */ case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': /* * optional characters */ if (ac == fc && arglex_compare(formal, actual)) { result = 1; goto ret; } /* * skip forward to next * mandatory character, or after '_' */ while (islower((unsigned char)*formal)) ++formal; if (*formal == '_') { ++formal; if (ac == '_' || ac == '-') ++actual; } --actual; break; case '*': /* * This is a hack, it should really * check for a match match the stuff after * the '*', too, a la glob. */ if (!ac) { result = 0; goto ret; } partial = actual - 1; result = 1; goto ret; case '\\': if (actual[-1] != *formal++) { result = 0; goto ret; } break; case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': fc = tolower((unsigned char)fc); /* fall through... */ default: /* * mandatory characters */ if (fc != ac) { result = 0; goto ret; } break; } } ret: return result; } static int is_a_number(const char *s) { long n; int sign; n = 0; switch (*s) { default: sign = 1; break; case '+': s++; sign = 1; break; case '-': s++; sign = -1; break; } switch (*s) { case '0': if ((s[1] == 'x' || s[1] == 'X') && s[2]) { s += 2; for (;;) { switch (*s) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': n = n * 16 + *s++ - '0'; continue; case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': n = n * 16 + *s++ - 'A' + 10; continue; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': n = n * 16 + *s++ - 'a' + 10; continue; } break; } } else { for (;;) { switch (*s) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': n = n * 8 + *s++ - '0'; continue; } break; } } break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': for (;;) { switch (*s) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': n = n * 10 + *s++ - '0'; continue; } break; } break; default: return 0; } if (*s) return 0; arglex_value.alv_number = n * sign; return 1; } arglex_token_ty arglex(void) { arglex_table_ty *tp; int j; arglex_table_ty *hit[20]; int nhit; static char *pushback; char *arg; if (pushback) { /* * the second half of a "-foo=bar" style argument. */ arg = pushback; pushback = 0; } else { if (argc <= 0) { arglex_token = arglex_token_eoln; arg = ""; goto ret; } arg = argv[0]; argc--; argv++; /* * See if it looks like a GNU "-foo=bar" option. * Split it at the '=' to make it something the * rest of the code understands. */ if (arg[0] == '-' && arg[1] != '=') { char *eqp; eqp = strchr(arg, '='); if (eqp) { pushback = eqp + 1; *eqp = 0; } } /* * Turn the GNU-style leading "--" * into "-" if necessary. */ if ( arg[0] == '-' && arg[1] == '-' && arg[2] && !is_a_number(arg + 1) ) ++arg; } if (is_a_number(arg)) { arglex_token = arglex_token_number; goto ret; } nhit = 0; partial = 0; for (tp = table; tp->name; tp++) { if (arglex_compare(tp->name, arg)) hit[nhit++] = tp; } if (utable) { for (tp = utable; tp->name; tp++) { if (arglex_compare(tp->name, arg)) hit[nhit++] = tp; } } switch (nhit) { case 0: /* * not found in the table */ if (arg[0] == '-') arglex_token = arglex_token_option; else arglex_token = arglex_token_string; break; case 1: if (partial) arg = (char *)partial; else arg = hit[0]->name; arglex_token = hit[0]->token; break; default: { size_t len; char *buf; sub_context_ty *scp; len = strlen(hit[0]->name + 1); for (j = 1; j < nhit; ++j) len += strlen(hit[j]->name) + 2; buf = r_alloc_and_check(len); strcpy(buf, hit[0]->name); for (j = 1; j < nhit; ++j) { strcat(buf, ", "); strcat(buf, hit[j]->name); } scp = sub_context_new(); sub_var_set_charstar(scp, "Name", arg); sub_var_set_charstar(scp, "Guess", buf); fatal_intl(scp, i18n("option \"$name\" ambiguous ($guess)")); /* NOTREACHED */ } } ret: arglex_value.alv_string = arg; return arglex_token; } char * arglex_token_name(arglex_token_ty n) { arglex_table_ty *tp; switch (n) { case arglex_token_eoln: return "end of command line"; case arglex_token_number: return "number"; case arglex_token_option: return "option"; case arglex_token_stdio: return "standard input or output"; case arglex_token_string: return "string"; default: break; } for (tp = table; tp < ENDOF(table); tp++) { if (tp->token == n) return tp->name; } if (utable) { for (tp = utable; tp->name; tp++) { if (tp->token == n) return tp->name; } } return "unknown command line token"; } fhist-1.18/common/arglex.h 644 0 0 326711265752627 147430ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1991-1994, 1998, 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef ARGLEX_H #define ARGLEX_H #include enum arglex_token_ty { arglex_token_eoln = -20, arglex_token_help, arglex_token_number, arglex_token_option, arglex_token_stdio, arglex_token_string, arglex_token_version }; typedef enum arglex_token_ty arglex_token_ty; typedef struct arglex_table_ty arglex_table_ty; struct arglex_table_ty { char *name; arglex_token_ty token; }; typedef struct arglex_value_ty arglex_value_ty; struct arglex_value_ty { char *alv_string; long alv_number; }; extern arglex_token_ty arglex_token; extern arglex_value_ty arglex_value; void arglex_init(int, char **, arglex_table_ty *); arglex_token_ty arglex(void); int arglex_compare(const char *formal, const char *actual); char *arglex_token_name(arglex_token_ty); #endif /* ARGLEX_H */ fhist-1.18/common/attrib_forma.h 644 0 0 252411265752627 161250ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2000, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_ATTRIB_FORMA_H #define COMMON_ATTRIB_FORMA_H #ifdef __GNCU__ #define ATTRIBUTE_FORMAT_1_2 __attribute__ ((__format__ (__printf__, 1, 2))) #define ATTRIBUTE_FORMAT_2_3 __attribute__ ((__format__ (__printf__, 2, 3))) #define ATTRIBUTE_FORMAT_3_4 __attribute__ ((__format__ (__printf__, 3, 4))) #define ATTRIBUTE_FORMAT_4_5 __attribute__ ((__format__ (__printf__, 4, 5))) #else #define ATTRIBUTE_FORMAT_1_2 #define ATTRIBUTE_FORMAT_2_3 #define ATTRIBUTE_FORMAT_3_4 #define ATTRIBUTE_FORMAT_4_5 #endif #endif /* COMMON_ATTRIB_FORMA_H */ fhist-1.18/common/cmalloc.c 644 0 0 1511711265752627 151030ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1991-1994, 1998, 2000-2002, 2008 Peter Miller * * Derived from a work * Copyright (C) 1990 David I. Bell. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . * * Malloc interludes which allow for releasing of all used memory blocks. * Just call cm_reset whenever you want to free all allocated memory. * This is convenient when reinitializing a program which allocates memory. * * Note: You must make sure that old stale pointers are not referenced, * such as static pointers which were 0 when the program started but * won't be later. In other words, to be safe you should not assume any * variables have been initialized, even for zero values. */ #include #include #include #include #include #undef malloc #undef realloc #undef free #undef calloc #define MAGIC 54928347L /* * This is to protect DOS. * On a 16-bit machine, this will be 65535, * exactly right for small-memory-model doc programs. * * but on a 32-bit machine, like most unixes, * this is essentially infinity. */ #define BIG ((unsigned int)-1) typedef struct chunk CHUNK; struct chunk { CHUNK *next; /* next chunk in chain */ CHUNK *prev; /* previous chunk in chain */ long magic; /* magic value */ double data[1]; /* data storage (varying size) */ }; #define CHUNKSIZE(size) (sizeof(CHUNK) + (size) - sizeof(double)) #define DPTOCP(dp) \ ((CHUNK *)(void*)(((char *)(dp)) - offsetof(CHUNK, data[0]))) static CHUNK head = {&head, &head}; /* * Actual calls to malloc, realloc, calloc, and free. * Users must be sure not to intermix these calls with the ones above. */ void * r_alloc(size_t size) { void *result; if (size > BIG) { errno = EINVAL; return 0; } errno = 0; result = malloc((unsigned int) size); if (!result && !errno) errno = ENOMEM; return result; } void * r_realloc(void *dp, size_t size) { void *result; if (size > BIG) { errno = EINVAL; return 0; } errno = 0; result = realloc(dp, (unsigned int) size); if (!result && !errno) errno = ENOMEM; return result; } void * r_realloc_and_check(void *a, size_t b) { void *result; result = r_realloc(a, b); if (!result) nfatal_raw("realloc(%lu)", (unsigned long)b); return result; } void r_free(void *dp) { free(dp); } void * r_alloc_and_check(size_t n) { void *result; result = r_alloc(n); if (!result) nfatal_raw("malloc(%lu)", (unsigned long)n); return result; } /* * Allocate some memory. */ void * cm_alloc(size_t size) { CHUNK *cp; if (size > BIG) { errno = EINVAL; return 0; } cp = (CHUNK *)r_alloc((size_t)CHUNKSIZE(size)); if (!cp) return 0; cp->magic = MAGIC; cp->next = head.next; cp->next->prev = cp; cp->prev = &head; head.next = cp; return (void *)cp->data; } void * cm_alloc_and_check(size_t n) { void *result; result = cm_alloc(n); if (!result) nfatal_raw("malloc(%lu)", (unsigned long)n); return result; } /* * Reallocate memory. */ void * cm_realloc(void *dp, size_t size) { CHUNK *cp; if (!dp || size > BIG) { errno = EINVAL; return 0; } cp = DPTOCP(dp); if (cp->magic != MAGIC) { error_raw ( "%s: %d: bad realloc %08lX (bug)", __FILE__, __LINE__, (unsigned long)dp ); errno = EINVAL; return 0; } cp = (CHUNK *)r_realloc(cp, (size_t)CHUNKSIZE(size)); if (!cp) return 0; cp->next->prev = cp; cp->prev->next = cp; return (void *)cp->data; } void * cm_realloc_and_check(void *a, size_t b) { void *result; result = cm_realloc(a, b); if (!result) nfatal_raw("malloc(%lu)", (unsigned long)b); return result; } /* * Allocate zeroed memory. */ void * cm_calloc(size_t nelem, size_t elsize) { size_t totalsize; CHUNK *cp; if (nelem > BIG || elsize > BIG) { errno = EINVAL; return 0; } totalsize = CHUNKSIZE(nelem * elsize); if (totalsize > BIG) { errno = EINVAL; return 0; } cp = (CHUNK *)r_alloc(totalsize); if (!cp) return 0; cp->magic = MAGIC; cp->next = head.next; cp->next->prev = cp; cp->prev = &head; head.next = cp; return (void *)cp->data; } void * cm_calloc_and_check(size_t a, size_t b) { void *result; result = cm_calloc(a, b); if (!result) nfatal_raw("malloc(%lu)", (unsigned long)b); return result; } /* * Free memory. */ void cm_free(void *dp) { CHUNK *cp; if (!dp) return; cp = DPTOCP(dp); if (cp->magic != MAGIC) { error_raw ( "%s: %d: bad free %08lX (bug)", __FILE__, __LINE__, (unsigned long)dp ); return; } cp->prev->next = cp->next; cp->next->prev = cp->prev; cp->next = 0; cp->prev = 0; cp->magic = 0; r_free(cp); } /* * Reset the whole memory arena. * This frees all memory allocated since the last cm_reset call. */ void cm_reset(void) { CHUNK *cp; while (head.next != &head) { cp = head.next; if (cp->magic != MAGIC) { error_raw ( "%s: %d: bad cm_reset %08lX (bug)", __FILE__, __LINE__, (unsigned long)cp ); break; } head.next = cp->next; cp->next = 0; cp->prev = 0; cp->magic = 0; r_free(cp); } head.next = &head; head.prev = &head; } fhist-1.18/common/cmalloc.h 644 0 0 373111265752627 150670ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1991-1995, 1998, 2002, 2008 Peter Miller * * Derived from a work * Copyright (C) 1990 David I. Bell. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . * * Definitions to use releaseable memory allocation. */ #ifndef CMALLOC_H #define CMALLOC_H #include #include /* * prevent use of libc functions */ #undef malloc #define malloc(n) !/!/!cmalloc((unsigned long) (n)) #undef realloc #define realloc(p,n) !/!/!cmrealloc((char *) (p), (unsigned long) (n)) #undef calloc #define calloc(n,s) !/!/!cmcalloc((unsigned long) (n), (unsigned long) (s)) #undef free #define free(p) !/!/!cmfree((char *) (p)) /* * these functions can be released * by using the cmreset function. */ void *cm_alloc(size_t); void *cm_alloc_and_check(size_t); void *cm_realloc(void *, size_t); void *cm_realloc_and_check(void *, size_t); void *cm_calloc(size_t, size_t); void *cm_calloc_and_check(size_t, size_t); void cm_free(void *); void cm_reset(void); /* * these functions access the libc functions more-or-less directly */ void *r_alloc(size_t); void *r_alloc_and_check(size_t); void *r_realloc(void *, size_t); void *r_realloc_and_check(void *, size_t); void *r_calloc(size_t, size_t); void r_free(void *); #endif /* CMALLOC_H */ fhist-1.18/common/compare.c 644 0 0 11066311265752627 151410ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1991-1995, 1998-2002, 2008 Peter Miller * * Derived from a work * Copyright (C) 1990 David I. Bell. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . * * This program is based on the algorithm in: * An O(ND) Difference Algorithm and Its Variations * Eugene W. Myers * (TR 85-6, April 10, 1985) * Department of Computer Science * The University of Arizona * Tuscon, Arizona 85721 * * Also see: * A File Comparison Program * Webb Miller and Eugene W. Myers * Software Practice and Experience * (Volume 15, No. 11, November 1985) * * Actual implementation and features by David I. Bell. * Enhancements and bug fixes by Peter Miller. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define SNAKEALLOCSIZE (size_t)500 /* chunk size for snake allocation */ #define CHARALLOCSIZE (size_t)10240 /* allocation size for file data */ #define UNIQUEALLOCSIZE (size_t)512 /* unique handling size for allocation */ #define LINEALLOCSIZE (size_t)2000 /* number of lines to allocate */ #define HASHSIZE 2003 /* size of hash table */ #define CHANGEBLABINTERVAL 100 /* how often to talk about changes */ #define READBLABINTERVAL 1000 /* how often to talk about reading */ #define SNAKEBLABINTERVAL 1000 /* how often to talk about snakes */ #define TABSIZE 8 /* tab size */ #define DETABALLOCSIZE (size_t)128 /* buffer allocation size for detab */ static size_t tablesize; /* needed table size */ static size_t snakecount; /* number of snake structures used */ static int availchars; /* number of available characters */ static char *nextchar; /* next allocable character storage */ static long *V1; /* the row containing the last d */ static long *V2; /* another row */ static SNAKE *nextsnake; /* next allocable snake structure */ static SNAKE *lastsnake; /* end of allocable snake structures */ static SNAKE *endsnake; /* last snake structure in list */ static LINE **hashtable; /* hash table for lines */ static modifyline_type modifyline; FCOMP_DATA fc; /* externally referencable data */ /* * NAME * canonical * * SYNOPSIS * char *canonical(char *s); * * DESCRIPTION * The canonical function is used to apply the -Upcase and -Spaces * options to produce a canonical line for comparison purposes. * * ARGUMENTS * s - string to canonicalize * * RETURNS * A pointer to the canonical line is returned. This will be valid * until the next call to this function. If the canonical string * would be the same as the input string, the input string is returned. */ static char * canonical(char *s) { static size_t bufsiz; static char *buf; size_t len; int changed; int space; char *cp1; char *cp2; /* * if no modifiers are in effect, * no alterations will be required */ if (!fc.upcaseflag && !fc.spaceflag) return s; /* * make sure the buffer is large enough */ len = strlen(s) + 1; if (len > bufsiz) { if (buf) { bufsiz = len; buf = r_realloc_and_check(buf, bufsiz); } else { bufsiz = len; buf = r_alloc_and_check(bufsiz); } } /* * simple upcase is easier to handle */ if (fc.upcaseflag) { changed = 0; cp1 = s; cp2 = buf; while (*cp1) { if (islower((unsigned char)*cp1)) { *cp2++ = toupper((unsigned char)*cp1); changed = 1; } else *cp2++ = *cp1; ++cp1; } if (!changed) return s; *cp2 = 0; return buf; } /* * spaces are rather harder to handle * * keep track of whether a run of spaces has been seen. * replace this run of spaces with a single space * provided it is not at either end of a line. */ cp1 = s; cp2 = buf; space = 0; changed = 0; while (*cp1) { int c; c = (unsigned char)*cp1++; if (fc.upcaseflag && islower(c)) { c = toupper(c); changed = 1; } if (c == '\n') { if (space) changed = 1; *cp2++ = c; space = 0; } else if (isspace(c)) { if (space || c != ' ') changed = 1; space = 1; } else { if (space) { if (cp2 != buf) *cp2++ = ' '; else changed = 1; } *cp2++ = c; space = 0; } } if (!changed) return s; *cp2 = 0; return buf; } /* * Allocate a string of a certain size. This routine is used instead of * simply calling malloc in order to reduce the overhead. The allocated * strings cannot be freed or realloced. */ void * allocstr(long len) { char *cp; static unsigned alignment_mask; if (!alignment_mask) { struct test { char a; double b; }; unsigned alignment; alignment = offsetof(struct test, b); /* make sure is a power of 2 */ while ((alignment & (~alignment + 1)) != alignment) ++alignment; alignment_mask = alignment - 1; } /* round length to a multiple of alignment */ len = (len + alignment_mask) & ~alignment_mask; if (len >= UNIQUEALLOCSIZE) return cm_alloc_and_check(len); cp = nextchar; if (len > availchars) { cp = cm_alloc_and_check(CHARALLOCSIZE); nextchar = cp; availchars = CHARALLOCSIZE; } nextchar += len; availchars -= len; return cp; } /* * Subroutine to allocate a line structure of the appropriate size and * add it to the hash table. If it matches an already existing line, then * the old structure will be returned. */ static LINE * addline(char *cp) { LINE *lp; /* current line element */ char *curcp; /* current character of string */ LINE **hashentry; /* hash entry to use */ long hash; /* hash value */ long len; /* line length */ int ch; /* current char */ char *canon; /* * Compute line length and hash value. * This has to take into account the space and uppercase flags. */ canon = canonical(cp); hash = 0; for (curcp = canon; *curcp; curcp++) { ch = *curcp; hash += ((hash * 101) + ch); if (hash < 0) hash = (hash + 1) & INFINITY; } len = curcp - canon; /* * Search proper hash chain for already existing line. * If the hash accidentally matches, modify it and try again. * * Search on the real data, not the canonical form, * that way fcomp -w -s can report more natural looking results. */ again: hashentry = &hashtable[hash % HASHSIZE]; for (lp = *hashentry; lp; lp = lp->l_next) { if (lp->l_hash != hash) continue; if (strcmp(cp, lp->l_data) == 0) return lp; if ( (cp != canon || lp->l_canon != lp->l_data) && strcmp(canon, lp->l_canon) == 0 ) continue; hash = ((hash * 1234321) + 1) & INFINITY; goto again; } /* * Line not found, allocate a new one */ if (canon != cp) { lp = (LINE *)allocstr(LINE_SIZE(strlen(cp))); strcpy(lp->l_data, cp); lp->l_canon = allocstr(len + 1); strcpy(lp->l_canon, canon); } else { lp = (LINE *)allocstr(LINE_SIZE(len)); strcpy(lp->l_data, cp); lp->l_canon = lp->l_data; } lp->l_hash = hash; lp->l_next = *hashentry; *hashentry = lp; return lp; } static int is_blank_string(const char *s) { while (*s) if (!isspace((unsigned char)*s)) return 0; return 1; } /* * Readfile - read in a file and remember the maximum number of lines it needs. * This routine squeezes out blank lines if specified. * The first specified number of lines is skipped first. * Then the specified number of lines is modified. */ static void readfile(FILEINFO *fi, long skip, long modify) { input_ty *fp; /* file pointer for file to read in */ LINE **lines; /* pointer to lines array */ long *lnums; /* line numbers within file */ char *cp; /* current line */ long linesavail; /* available number of lines */ long linecount; /* current number of lines */ long linenumber; /* current line number */ long linelen; /* length of line read */ fi->is_binary = 0; if (fc.verbosity > VERBOSE_DEFAULT) error_raw("[Reading \"%s\"]", fi->f_name); fp = fi->f_file; if (skip > 0) input_skip_lines(fp, skip); linecount = 0; linenumber = 0; linesavail = LINEALLOCSIZE; lines = (LINE **)cm_alloc_and_check(sizeof(LINE *) * LINEALLOCSIZE); lnums = (long *)cm_alloc_and_check(sizeof(long) * LINEALLOCSIZE); for (;;) { cp = input_readline(fp, &linelen, 0, &fi->is_binary); if (!cp) break; if (++linenumber <= modify && modifyline) cp = modifyline(cp, &linelen, (struct INFO *)0); if ( (fc.verbosity > VERBOSE_DEFAULT) && ((linenumber % READBLABINTERVAL) == 0) ) error_raw("[%ld lines]", linenumber); if (fc.blankflag && is_blank_string(cp)) continue; if (linecount >= linesavail) { linesavail += LINEALLOCSIZE; lines = (LINE **) cm_realloc_and_check(lines, sizeof(LINE *) * linesavail); lnums = (long *)cm_realloc_and_check(lnums, sizeof(long) * linesavail); } lnums[linecount] = linenumber; lines[linecount] = addline(cp); linecount++; } fi->f_lnums = lnums; fi->f_lines = lines; fi->f_linecount = linecount; fi->f_linestotal = linenumber; if (linecount > fc.maxlines) fc.maxlines = linecount; input_delete(fp); if (fc.verbosity > VERBOSE_DEFAULT) { if (linecount == linenumber) error_raw("[Done, %ld lines]", linenumber); else { error_raw ( "[Done, %ld lines, %ld non-blanks]", linenumber, linecount ); } } } /* * Allocate a new snake structure and append it to the snake list. */ static SNAKE * allocsnake(void) { SNAKE *sp; /* snake being allocated */ sp = nextsnake; if (sp >= lastsnake) { sp = (SNAKE *)cm_alloc_and_check(sizeof(SNAKE) * SNAKEALLOCSIZE); nextsnake = sp; lastsnake = sp + SNAKEALLOCSIZE; } nextsnake++; sp->next = NULL; if (!fc.snakelist) fc.snakelist = sp; else endsnake->next = sp; endsnake = sp; if (fc.verbosity > VERBOSE_DEFAULT && !(++snakecount % SNAKEBLABINTERVAL)) error_raw("[%ld snake elements]", snakecount); return sp; } /* * Routine to find the middle snake of an optimial D-path spanning * lines A to A+N in file A to lines B to B+N in file B. Returns the * length D of the D-path as a return value, and the upper left and * lower right relative coordinates of a snake midway through the D-path. */ static long midsnake(int depth, long A, long N, long B, long M, long *ulx, long *uly, long *lrx, long *lry) { long D; long MAXD; long DELTA; long odd; long x; long y; long k; long changes; long oldx; LINE **lp1; LINE **lp2; if (fc.debugflag) { error_raw ( "%*ssearching: %ld,%ld to %ld,%ld midsnake: ", depth * 2, "", A, B, A + N, B + M ); } DELTA = N - M; odd = DELTA & 1; MAXD = (M + N + 1) / 2; V1[1] = 0; V2[-1] = 0; changes = -odd - 2; /* * This is the main loop for searching for the snake. * D is the distance off the diagonals, and is the number * of changes needed to get from the upper left to the * lower right corner of the region. */ for (D = 0; D <= MAXD; D++) { changes += 2; if (changes > fc.maxchanges) { sub_context_ty *scp; scp = sub_context_new(); sub_var_set_long(scp, "Number", fc.maxchanges); fatal_intl(scp, i18n("More than $number changes required")); /* NOTREACHED */ sub_context_delete(scp); } if ( (fc.verbosity > VERBOSE_DEFAULT) && (depth == 0) && (changes > 1) && ((changes % CHANGEBLABINTERVAL) <= 1) ) error_raw("[%ld changes]", changes - odd); /* * Examine all diagonals within current distance. * First search from upper left to lower right, * and then search from lower right to upper left. */ for (k = -D; k <= D; k += 2) { /* * Find the end of the furthest forward D-path * in diagonal k. */ if (k == -D || (k != D && (V1[k - 1] < V1[k + 1]))) x = V1[k + 1]; else x = V1[k - 1] + 1; y = x - k; lp1 = &fc.fileA.f_lines[A + x]; lp2 = &fc.fileB.f_lines[B + y]; oldx = x; while ((x < N) && (y < M) && ((*lp1)->l_hash == (*lp2)->l_hash)) { x++; y++; lp1++; lp2++; } V1[k] = x; /* * See if path overlaps furthest reverse D-path. * If so, then we have found the snake. */ if (odd && (k >= (DELTA - (D - 1))) && (k <= (DELTA + (D - 1)))) { if ((x + V2[k - DELTA]) >= N) { *ulx = oldx; *uly = oldx - k; *lrx = x; *lry = y; if (fc.debugflag) { error_raw ( "%ld,%ld to %ld,%ld (odd)", *ulx, *uly, *lrx, *lry ); } return changes; } } } for (k = -D; k <= D; k += 2) { /* * Find the end of the furthest reaching reverse * path in diagonal k+DELTA. */ if (k == D || (k != -D && (V2[k + 1] < V2[k - 1]))) x = V2[k - 1]; else x = V2[k + 1] + 1; y = x + k; lp1 = &fc.fileA.f_lines[A + N - x - 1]; lp2 = &fc.fileB.f_lines[B + M - y - 1]; oldx = x; while ((x < N) && (y < M) && ((*lp1)->l_hash == (*lp2)->l_hash)) { x++; y++; lp1--; lp2--; } V2[k] = x; /* * See if path overlaps furthest forward D-path. * If so, then we have found the snake. */ if (!odd && (k <= D - DELTA) && (k >= -D - DELTA)) { if ((x + V1[k + DELTA]) >= N) { *ulx = N - x; *uly = M - y; *lrx = N - oldx; *lry = *lrx + *uly - *ulx; if (fc.debugflag) { error_raw ( "%ld,%ld to %ld,%ld (even)", *ulx, *uly, *lrx, *lry ); } return changes; } } } } fatal_raw("Middle snake procedure failed (bug)"); return 0; } /* * Recursive routine to find a minimal D-path through the edit graph * of the two input files. Arguments are the beginning line numbers in * the files, and the number of lines to examine. This is basically a * divide-and-conquer routine which finds the middle snake of an optimal * D-path, then calls itself to find the remainder of the path before the * snake and after the snake. */ static void findsnake(int depth, long A, long N, long B, long M) { SNAKE *sp; long ulx; long uly; long lrx; long lry; long D; long count; /* * If more than one change needed, then call ourself for each part. */ D = midsnake(depth, A, N, B, M, &ulx, &uly, &lrx, &lry); if ((fc.verbosity > VERBOSE_DEFAULT) && (depth == 0)) { error_raw("[%ld change%s total]", D, ((D == 1) ? "" : "s")); error_raw("[Finding edit path]"); } if (D > 1) { if ((ulx > 0) && (uly > 0)) findsnake(depth + 1, A, ulx, B, uly); count = lrx - ulx; if (count > fc.maxjoin) { sp = allocsnake(); sp->line1 = A + ulx; sp->line2 = B + uly; sp->count = count; } N -= lrx; M -= lry; if ((N > 0) && (M > 0)) findsnake(depth + 1, A + lrx, N, B + lry, M); return; } /* * Only 0 or 1 change needed, so we can compute the result directly. * First compute the snake coming from the upper left corner if any. */ if (N > M) count = uly; else count = ulx; if (count > fc.maxjoin) { sp = allocsnake(); sp->line1 = A; sp->line2 = B; sp->count = count; } /* * Finally compute the snake coming from the lower right corner if any. */ count = lrx - ulx; if (count > fc.maxjoin) { sp = allocsnake(); sp->line1 = A + ulx; sp->line2 = B + uly; sp->count = count; } } /* * Routine to generate the D-path list and compute the number * of insertions, deletions and matching lines found. */ static void makesnakes(void) { SNAKE *sp; /* current snake element */ long line1; /* current line in file A */ long line2; /* current line in file B */ if (fc.verbosity > VERBOSE_DEFAULT) error_raw("[Beginning comparisons]"); tablesize = fc.maxlines * 2 + 1; V1 = (long *)cm_alloc_and_check(sizeof(long) * tablesize); V2 = (long *)cm_alloc_and_check(sizeof(long) * tablesize); V1 += fc.maxlines; V2 += fc.maxlines; if ((fc.fileA.f_linecount > 0) && (fc.fileB.f_linecount > 0)) findsnake(0, 0L, fc.fileA.f_linecount, 0L, fc.fileB.f_linecount); /* * End the list with the lower right endpoint */ sp = allocsnake(); sp->line1 = fc.fileA.f_linecount; sp->line2 = fc.fileB.f_linecount; sp->count = 0; if (fc.verbosity > VERBOSE_DEFAULT) error_raw("[Comparisons complete]"); if (fc.debugflag) { error_raw("%8s%8s%8s", "line1", "line2", "count"); for (sp = fc.snakelist; sp; sp = sp->next) error_raw("%8ld%8ld%8ld", sp->line1, sp->line2, sp->count); } /* * Scan the snake list and calculate the number of inserted, * deleted, and matching lines. */ line1 = 0; line2 = 0; for (sp = fc.snakelist; sp; sp = sp->next) { fc.deletes += (sp->line1 - line1); fc.inserts += (sp->line2 - line2); fc.matches += sp->count; line1 = sp->line1 + sp->count; line2 = sp->line2 + sp->count; } } /* * Print the specified range of line numbers for both files. * The given string is also typed as part of the message. * This routine handles both full and line number output. * The real line numbers in each file are typed. */ static void printrange(FILE *fp, const char *msg, long line1, long count1, long line2, long count2) { long beg1; long end1; long beg2; long end2; /* real beginning and ending line numbers */ string_ty *buf1; string_ty *buf2; end1 = line1 + count1 - 1; end2 = line2 + count2 - 1; if (line1 >= fc.fileA.f_linecount) { beg1 = fc.fileA.f_linestotal + 1; end1 = beg1; } else { beg1 = fc.fileA.f_lnums[line1]; end1 = fc.fileA.f_lnums[end1]; } if (line2 >= fc.fileB.f_linecount) { beg2 = fc.fileB.f_linestotal + 1; end2 = beg2; } else { beg2 = fc.fileB.f_lnums[line2]; end2 = fc.fileB.f_lnums[end2]; } if (beg1 == end1) { if (fc.hexify_flag) buf1 = str_format("0x%lX", beg1 - 1); else buf1 = str_format("%ld", beg1); } else { if (fc.hexify_flag) buf1 = str_format("0x%lX-0x%lX", beg1 - 1, end1 - 1); else buf1 = str_format("%ld-%ld", beg1, end1); } if (beg2 == end2) { if (fc.hexify_flag) buf2 = str_format("0x%lX", beg2 - 1); else buf2 = str_format("%ld", beg2); } else { if (fc.hexify_flag) buf2 = str_format("0x%lX-0x%lX", beg2 - 1, end2 - 1); else buf2 = str_format("%ld-%ld", beg2, end2); } if (fc.editscriptflag) { fprintf(fp, "%c %s %s\n", *msg, buf1->str_text, buf2->str_text); } else { fprintf ( fp, "\n******************** %s [A %s, B %s]:\n", msg, buf1->str_text, buf2->str_text ); } str_free(buf1); str_free(buf2); } /* * Translate all tabs to the appropriate number of spaces in a line. * This is used when the line is not output at a nice tab boundary, * so that the output still looks correct. Returns the new converted * string, which is only valid until the next call. */ static char * detab(const char *str) { int pos; /* current character position */ int ch; /* current character */ char *destcp; /* destination pointer */ static char *strbuf; /* string buffer */ static int maxlen; /* maximum size of string buffer */ if (!maxlen) { maxlen = DETABALLOCSIZE; strbuf = r_alloc_and_check(maxlen + TABSIZE + 1); } destcp = strbuf; pos = 0; for (;;) { ch = *str++; if (!ch) break; if (pos >= maxlen) { maxlen += DETABALLOCSIZE; strbuf = r_realloc_and_check(strbuf, maxlen + TABSIZE + 1); destcp = strbuf + pos; } if (ch != '\t') { *destcp++ = ch; pos++; } else { for (;;) { *destcp++ = ' '; pos++; if ((pos % TABSIZE) == 0) break; } } } *destcp = '\0'; return strbuf; } /* * Print the specified number of lines of a file beginning at the * specified line number. This prints imbedded blank lines too. * The lines can be preceeded by line number if desired. Context * lines can be added also. Tabs are converted to the appropriate * number of spaces if line numbering or tags are supplied. */ static void printlines(FILE *fp, FILEINFO *fi, long line, long count, const char *tagstr) { LINE **lines; /* data of file */ long *lnum; /* line numbers */ char *data; /* current data line */ long curlnum; /* current line number */ line = line - fc.context - 1; count += (2 * fc.context); if (line < 0) { count += line; line = 0; } if ((line + count) > fi->f_linecount) count = fi->f_linecount - line; lines = fi->f_lines + line; lnum = fi->f_lnums + line; curlnum = *lnum; while (count-- > 0) { while (curlnum < *lnum) { if (fc.whatflag) fprintf(fp, "%s\n", tagstr); else if (fc.numflag) fprintf(fp, "%c%ld\n", fi->f_tag, curlnum); else putc('\n', fp); curlnum++; } if (fc.whatflag) fprintf(fp, "%s ", tagstr); else if (fc.numflag) fprintf(fp, "%c%-7ld ", fi->f_tag, curlnum); data = (*lines)->l_data; if (fc.whatflag) data = detab(data); fputs(data, fp); lines++; lnum++; curlnum++; } } /* * Dump lines which match, either just the line numbers or with the text. */ void dumpmatch(char *outputname) { FILE *fp; SNAKE *sp; if ((fc.verbosity > VERBOSE_DEFAULT) && outputname) error_raw("[Writing matching lines to \"%s\"]", outputname); if (outputname) { fp = fopen_and_check(outputname, "w"); } else { fp = stdout; outputname = gettext("standard output"); } if (fc.editscriptflag) fprintf(fp, "A %s\nB %s\n", fc.fileA.f_name, fc.fileB.f_name); else { fprintf ( fp, "FILE A: %s\nFILE B: %s\n", fc.fileA.f_name, fc.fileB.f_name ); fprintf ( fp, "TOTALS: %ld inserted %ld deleted %ld matched\n", fc.inserts, fc.deletes, fc.matches ); } for (sp = fc.snakelist; sp; sp = sp->next) { if (sp->count <= 0) continue; printrange(fp, "MATCH", sp->line1, sp->count, sp->line2, sp->count); if (!fc.editscriptflag) printlines(fp, &fc.fileB, sp->line2 + 1, sp->count, ""); } if (fc.editscriptflag) fprintf(fp, "T %ld %ld %ld\n", fc.inserts, fc.deletes, fc.matches); fflush_and_check(fp, outputname); fclose_and_check(fp, outputname); } /* * Dump the edit script in the normal manner, showing changed line * numbers along with the relevent text. */ void dumpnormal(char *outputname) { FILE *fp; /* output file */ SNAKE *sp; /* current snake */ long line1; long line2; /* current line numbers */ long count1; long count2; /* line counts */ if ((fc.verbosity > VERBOSE_DEFAULT) && outputname) error_raw("[Writing differences to \"%s\"]", outputname); if (outputname) { fp = fopen_and_check(outputname, "w"); } else { fp = stdout; outputname = gettext("standard output"); } if (fc.quickflag) { fprintf ( fp, "Files \"%s\" and \"%s\":\n", fc.fileA.f_name, fc.fileB.f_name ); fprintf ( fp, "%ld inserted %ld deleted %ld matched\n", fc.inserts, fc.deletes, fc.matches ); goto done; } if ((fc.inserts == 0) && (fc.deletes == 0)) { if (fc.verbosity) { fprintf ( fp, "Files \"%s\" and \"%s\" are identical\n", fc.fileA.f_name, fc.fileB.f_name ); } goto done; } fprintf ( fp, "FILE A: %s\nFILE B: %s\nTOTALS: %ld inserted %ld deleted %ld matched\n", fc.fileA.f_name, fc.fileB.f_name, fc.inserts, fc.deletes, fc.matches ); line1 = 0; line2 = 0; for (sp = fc.snakelist; sp; sp = sp->next) { count1 = sp->line1 - line1; count2 = sp->line2 - line2; if (count1 && count2) { printrange(fp, "REPLACE", line1, count1, line2, count2); printlines(fp, &fc.fileA, line1 + 1, count1, ""); fputs("******************** WITH:\n", fp); printlines(fp, &fc.fileB, line2 + 1, count2, ""); } else if (count1) { printrange(fp, "DELETE", line1, count1, line2, 1L); printlines(fp, &fc.fileA, line1 + 1, count1, ""); } else if (count2) { printrange(fp, "INSERT", line1, 1L, line2, count2); printlines(fp, &fc.fileB, line2 + 1, count2, ""); } line1 = sp->line1 + sp->count; line2 = sp->line2 + sp->count; } done: fflush_and_check(fp, outputname); fclose_and_check(fp, outputname); } /* * Dump all of both files showing what happened to each line. */ void dumpwhat(char *outputname) { FILE *fp; SNAKE *sp; long line1; long line2; /* current line numbers */ long count1; long count2; /* line counts */ if ((fc.verbosity > VERBOSE_DEFAULT) && outputname) error_raw("[Writing what changes were made to \"%s\"]", outputname); if (outputname) { fp = fopen_and_check(outputname, "w"); } else { fp = stdout; outputname = "(stdandard output)"; } fprintf(fp, "FILE A: %s\n", fc.fileA.f_name); fprintf(fp, "FILE B: %s\n", fc.fileB.f_name); fprintf ( fp, "TOTALS: %ld inserted %ld deleted %ld matched\n", fc.inserts, fc.deletes, fc.matches ); line1 = 0; line2 = 0; for (sp = fc.snakelist; sp; sp = sp->next) { count1 = sp->line1 - line1; count2 = sp->line2 - line2; if (count1 && count2) { printlines(fp, &fc.fileA, line1 + 1, count1, "|-"); printlines(fp, &fc.fileB, line2 + 1, count2, "|+"); } else if (count1) printlines(fp, &fc.fileA, line1 + 1, count1, "|-"); else if (count2) printlines(fp, &fc.fileB, line2 + 1, count2, "|+"); printlines(fp, &fc.fileB, sp->line2 + 1, sp->count, " "); line1 = sp->line1 + sp->count; line2 = sp->line2 + sp->count; } fflush_and_check(fp, outputname); fclose_and_check(fp, outputname); } /* * Dump only the line numbers which have changed. * This is useful for machine processing of the differences. */ void dumplines(char *outputname) { FILE *fp; /* output file */ SNAKE *sp; /* current snake */ long line1; long line2; /* previous line numbers */ long count1; long count2; /* count of line numbers */ if ((fc.verbosity > VERBOSE_DEFAULT) && outputname) error_raw("[Writing edit script to \"%s\"]", outputname); if (outputname) { fp = fopen_and_check(outputname, "w"); } else { fp = stdout; outputname = gettext("standard output"); } line1 = 0; line2 = 0; fprintf(fp, "A %s\nB %s\n", fc.fileA.f_name, fc.fileB.f_name); for (sp = fc.snakelist; sp; sp = sp->next) { count1 = sp->line1 - line1; count2 = sp->line2 - line2; if (count1 && count2) printrange(fp, "R", line1, count1, line2, count2); else if (count1) printrange(fp, "D", line1, count1, line2, 1L); else if (count2) printrange(fp, "I", line1, 1L, line2, count2); line1 = sp->line1 + sp->count; line2 = sp->line2 + sp->count; } fprintf(fp, "T %ld %ld %ld\n", fc.inserts, fc.deletes, fc.matches); fflush_and_check(fp, outputname); fclose_and_check(fp, outputname); } /* * Reinitialize for a new file comparison. * This zeroes out our static variables so that another * file comparison will work correctly. */ void fcompreset(void) { tablesize = 0; snakecount = 0; availchars = 0; fc.inserts = 0; fc.deletes = 0; fc.matches = 0; fc.snakelist = NULL; nextchar = NULL; V1 = NULL; V2 = NULL; nextsnake = NULL; lastsnake = NULL; endsnake = NULL; hashtable = NULL; } void binary_warning(const char *filename) { sub_context_ty *scp; scp = sub_context_new(); sub_var_set_charstar(scp, "File_Name", filename); error_intl(scp, i18n("warning: $filename is binary")); sub_context_delete(scp); } void binary_fatal(const char *filename) { sub_context_ty *scp; scp = sub_context_new(); sub_var_set_charstar(scp, "File_Name", filename); fatal_intl(scp, i18n("$filename is binary")); /* NOTREACHED */ sub_context_delete(scp); } /* * Routine to do the comparison of two files. * If either of the input filenames is NULL, then this indicates * that the file has already been read by an earlier call. */ void fcomp(char *nameA, char *nameB) { long changes; /* total number of changes */ trace(("fcomp(nameA = \"%s\", nameB = \"%s\")\n{\n", nameA, nameB)); fc.fileA.f_tag = 'A'; fc.fileB.f_tag = 'B'; if (nameA) { fc.fileA.f_name = nameA; if (fc.hexify_flag) { fc.fileA.f_file = input_hexify(input_file_open(nameA), 1); } else if (fc.binary) { fc.fileA.f_file = input_quoted_printable_encode(input_file_open(nameA), 1); } else fc.fileA.f_file = input_file_text_open(nameA); } if (nameB) { fc.fileB.f_name = nameB; if (fc.hexify_flag) { fc.fileB.f_file = input_hexify(input_file_open(nameB), 1); } else fc.fileB.f_file = input_file_text_open(nameB); } if (!nameA && !nameB) { fatal_intl(0, i18n("input file names not supplied")); } if (!hashtable) { int j; hashtable = (LINE **)cm_alloc_and_check(HASHSIZE * sizeof(LINE *)); for (j = 0; j < HASHSIZE; ++j) hashtable[j] = 0; } if (nameA) { readfile(&fc.fileA, fc.fileAskip, fc.fileAmodify); if (fc.fileA.is_binary) { binary_warning(nameA); if (fc.cant_do_binary) return; } } if (nameB) { readfile(&fc.fileB, fc.fileBskip, fc.fileBmodify); if (fc.fileB.is_binary) { binary_warning(nameB); if (fc.cant_do_binary) return; } } changes = fc.fileA.f_linecount - fc.fileB.f_linecount; if (changes < 0) changes = -changes; if (changes > fc.maxchanges) { sub_context_ty *scp; scp = sub_context_new(); sub_var_set_long(scp, "Number", fc.maxchanges); fatal_intl(scp, i18n("More than $number changes required")); /* NOTREACHED */ sub_context_delete(scp); } makesnakes(); trace(("}\n")); } void modifyline_register(modifyline_type func) { modifyline = func; } fhist-1.18/common/compare.h 644 0 0 1317611265752627 151270ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1991-1994, 1998-2002, 2008 Peter Miller * * Derived from a work * Copyright (C) 1990 David I. Bell. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . * * Common definitions for talking to the fcomp module. * These are the variables which control its actions. */ #ifndef COMPARE_H #define COMPARE_H #include #define INFINITY (long)(~(unsigned long)0 >> 1) /* maximum number */ #define VERBOSE_NONE 0 /* least verbosity level */ #define VERBOSE_DEFAULT 1 /* default verbosity level */ #define VERBOSE_FULL 2 /* full verbosity level */ /* * Structure which traces an optimal D-path through the edit path * for the two files. The linked list of these structures lists the * snakes which define the path, where a snake is a region of multiple * line matchings. */ typedef struct snake SNAKE; struct snake { SNAKE *next; /* next snake in path */ long line1; /* line number in file1 */ long line2; /* line number in file2 */ long count; /* number of matching lines */ }; /* * Data about a line. * Each line is placed on an appropriate hash chain. * For any two entries, the two l_hash values match if and only if * the two lines match, so that the data never needs to be examined * once the original comparisons are complete. In the extremely rare * cases where the hash would incorrectly match, it is modified. */ typedef struct line LINE; struct line { LINE *l_next; /* next line on same hash chain */ long l_hash; /* hash value for line */ char *l_canon; char l_data[4]; /* chars (variable length, MUST BE LAST) */ }; #define LINE_SIZE(chars) (sizeof(LINE) + (chars) - 2) /* * Data about the files being compared. */ typedef struct FILEINFO FILEINFO; struct FILEINFO { LINE **f_lines; /* pointer to data lines */ long *f_lnums; /* line number of each saved line */ long f_linecount; /* number of saved lines in file */ long f_linestotal; /* total number of lines in file */ char *f_name; /* file name */ struct input_ty *f_file; /* file structure for input */ char f_tag; /* tag character for file */ int is_binary; }; /* * Global data for file comparisons. */ typedef struct FCOMP_DATA FCOMP_DATA; struct FCOMP_DATA { /* * Input arguments */ long maxjoin; /* maximum number of lines to join */ long maxchanges; /* maximum changes to allow */ long maxlines; /* maximum number of lines */ long context; /* lines of context in output */ long fileAskip; /* lines to skip for first file */ long fileBskip; /* lines to skip for second file */ long fileAmodify; /* lines to be modified for first file */ long fileBmodify; /* lines to be modified for second file */ long verbosity; /* verbosity level */ short numflag; /* show line numbers */ short spaceflag; /* ignore extra spaces in lines */ short blankflag; /* ignore blank lines in files */ short hexify_flag; /* turn binary files into byte-per-line text */ short upcaseflag; /* ignore case differences in lines */ short quickflag; /* only show quick summary */ short whatflag; /* show both files showing what changed */ short editscriptflag; /* output an edit script */ short matchflag; /* output lines which match */ short debugflag; /* tell some debugging info */ /* * Output arguments */ long inserts; /* number of lines inserted into first file */ long deletes; /* number of lines deleted from first file */ long matches; /* number of lines unchanged between files */ SNAKE *snakelist; /* snake list describing matching lines */ FILEINFO fileA; /* first file being compared */ FILEINFO fileB; /* second file being compared */ int binary; /* -binary cmd line option */ int cant_do_binary; /* -no-binary cmd line option */ }; extern FCOMP_DATA fc; /* all data defined in here */ /* * for prototypes */ struct INFO; /* * Function prototypes */ void *allocstr(long); void fcomp(char *fileA, char *fileB); void dumpmatch(char *outfile); void dumpnormal(char *outfile); void dumpwhat(char *outfile); void dumplines(char *outfile); void fcompreset(void); void binary_warning(const char *); void binary_fatal(const char *); /* * the modifyline calls are used to alter line between reading them * and comparing them. */ typedef char *(*modifyline_type)(char *, long *, struct INFO *); void modifyline_register(modifyline_type); #endif /* COMPARE_H */ fhist-1.18/common/config.h.in 644 0 0 1343411265752627 153500ustar PeterMiller 0 0/* common/config.h.in. Generated from etc/configure.ac by autoheader. */ #ifndef COMMON_CONFIG_H #define COMMON_CONFIG_H /* Set this to be the absolute path of a Bourne shell which understands functions. */ #undef CONF_SHELL /* Set this to a suitable argument for the getpgrp function to discover the process group of the current process. */ #undef CONF_getpgrp_arg /* Define to 1 if you have the `atexit' function. */ #undef HAVE_ATEXIT /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_DIRENT_H /* Define to 1 if you have the `getpgrp' function. */ #undef HAVE_GETPGRP /* Define to 1 if you have the `gettext' function. */ #undef HAVE_GETTEXT /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_ISO646_H /* Define to 1 if you have the `iswctype' function. */ #undef HAVE_ISWCTYPE /* Define this symbol of your system has iswprint() AND it works. (GNU libc v2 had a bug.) */ #undef HAVE_ISWPRINT /* Define to 1 if you have the header file. */ #undef HAVE_LIBGETTEXT_H /* Define to 1 if you have the `intl' library (-lintl). */ #undef HAVE_LIBINTL /* Define to 1 if you have the header file. */ #undef HAVE_LIBINTL_H /* Define to 1 if you have the `w' library (-lw). */ #undef HAVE_LIBW /* Define to 1 if you have the `w32' library (-lw32). */ #undef HAVE_LIBW32 /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if you have the header file. */ #undef HAVE_LOCALE_H /* Define to 1 if you support file names longer than 14 characters. */ #undef HAVE_LONG_FILE_NAMES /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* Define to 1 if you have the `rename' function. */ #undef HAVE_RENAME /* Define to 1 if you have the `setlocale' function. */ #undef HAVE_SETLOCALE /* Define to 1 if you have the `sighold' function. */ #undef HAVE_SIGHOLD /* Define to 1 if you have the `sigprocmask' function. */ #undef HAVE_SIGPROCMASK /* Define to 1 if you have the header file. */ #undef HAVE_STDDEF_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strcasecmp' function. */ #undef HAVE_STRCASECMP /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the `strftime' function. */ #undef HAVE_STRFTIME /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strsignal' function. */ #undef HAVE_STRSIGNAL /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_DIR_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the `tcgetpgrp' function. */ #undef HAVE_TCGETPGRP /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the header file. */ #undef HAVE_WCHAR_H /* Define to 1 if you have the `wcslen' function. */ #undef HAVE_WCSLEN /* Define to 1 if you have the header file. */ #undef HAVE_WCTYPE_H /* Define to 1 if you have the header file. */ #undef HAVE_WIDEC_H /* Define this symbol of your system has the wint_t type defined. It is usually in or */ #undef HAVE_WINT_T /* Define this symbol if your system as AND it defines TIOCGWINSZ and struct winsize. */ #undef HAVE_winsize_SYS_IOCTL_H /* Define this symbol if your system as AND it defines TIOCGWINSZ and struct winsize. */ #undef HAVE_winsize_TERMIOS_H /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define as the return type of signal handlers (`int' or `void'). */ #undef RETSIGTYPE /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if you can safely include both and . */ #undef TIME_WITH_SYS_TIME /* Enable extensions on AIX 3, Interix. */ #ifndef _ALL_SOURCE # undef _ALL_SOURCE #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # undef _GNU_SOURCE #endif /* Enable threading extensions on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # undef _POSIX_PTHREAD_SEMANTICS #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # undef _TANDEM_SOURCE #endif /* Enable general extensions on Solaris. */ #ifndef __EXTENSIONS__ # undef __EXTENSIONS__ #endif /* Define to 1 if on MINIX. */ #undef _MINIX /* Define to 2 if the system does not provide POSIX.1 features except with this defined. */ #undef _POSIX_1_SOURCE /* Define to 1 if you need to in order for `stat' and other things to work. */ #undef _POSIX_SOURCE /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `unsigned int' if does not define. */ #undef size_t #include #endif /* COMMON_CONFIG_H */ fhist-1.18/common/config.messy.h 644 0 0 436611265752627 160660ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1999, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . * * This file is included by the generated ``common/config.h'' file. * These actions are performed ehre, to insulate them from the attentions * of ./configure (config.status) which is a little over-0zealous about * nuking the #undef lines. */ #ifndef COMMON_CONFIG_MESSY_H #define COMMON_CONFIG_MESSY_H /* * Make sure Solaris includes POSIX extensions. */ #if (defined(__sun) || defined(__sun__) || defined(sun)) && \ (defined(__svr4__) || defined(svr4)) #ifndef _POSIX_C_SOURCE #define _POSIX_C_SOURCE 1 #endif #ifndef __EXTENSIONS__ #define __EXTENSIONS__ 1 #endif /* * fix a glitch in Solaris's * which only show's up when you turn __EXTENSIONS__ on */ #define _timespec timespec /* fix 2.4 */ #define _tv_sec tv_sec /* fix 2.5.1 */ #endif /* Solaris */ /* * normalize the wide character support */ #if defined(HAVE_WCTYPE_H) && !defined(HAVE_ISWPRINT) # undef HAVE_WCTYPE_H # ifdef HAVE_ISWCTYPE # undef HAVE_ISWCTYPE # endif #endif #if !defined(HAVE_WCTYPE_H) && defined(HAVE_ISWPRINT) # undef HAVE_ISWPRINT #endif #if defined(HAVE_WIDEC_H) && !defined(HAVE_WCTYPE_H) # undef HAVE_WIDEC_H #endif /* * Need to define _POSIX_SOURCE on Linux, in order to get the fdopen, * fileno, popen and pclose function prototypes. */ #ifdef __linux__ #ifndef _POSIX_SOURCE #define _POSIX_SOURCE #endif #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #ifndef _BSD_SOURCE #define _BSD_SOURCE #endif #endif #endif /* COMMON_CONFIG_MESSY_H */ fhist-1.18/common/env.c 644 0 0 1106611265752627 142600ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include #include extern char **environ; static size_t nenvirons; static int initialized; /* * NAME * env_initialize - start up environment * * SYNOPSIS * void env_initialize(void); * * DESCRIPTION * The env_initialize function is used to copy all of the environment * variables into dynamic memory, so that they may be altered by the * setenv and unsetenv commands. */ static void env_initialize(void) { int j; char **old; if (initialized) return; initialized = 1; nenvirons = 0; for (j = 0; environ[j]; ++j) ++nenvirons; old = environ; environ = mem_alloc((nenvirons + 1) * sizeof(char *)); for (j = 0; j < nenvirons; ++j) { char *cp; char *was; was = old[j]; cp = mem_alloc(strlen(was) + 1); strcpy(cp, was); environ[j] = cp; } environ[nenvirons] = 0; env_set("SHELL", "/bin/sh"); } /* * NAME * setenv - set environment variable * * SYNOPSIS * void setenv(char *name, char *value); * * DESCRIPTION * The setenv function is used to set the given environment variable to * the given value. * * CAVEAT * Assumes that the env_initialize function has already been called. */ void env_set(char *name, char *value) { size_t name_len; int j; char *cp; if (!initialized) env_initialize(); cp = 0; name_len = strlen(name); for (j = 0; j < nenvirons; ++j) { cp = environ[j]; /* assert(cp); */ if ( name_len <= strlen(cp) && (cp[name_len] == '=' || !cp[name_len]) && !memcmp(cp, name, name_len) ) break; } if (environ[j]) { environ[j] = 0; if (cp) mem_free(cp); } else { size_t nbytes; nbytes = (nenvirons + 2) * sizeof(char *); environ = mem_change_size(environ, nbytes); environ[++nenvirons] = 0; } cp = mem_alloc(name_len + strlen(value) + 2); strcpy(cp, name); cp[name_len] = '='; strcpy(cp + name_len + 1, value); environ[j] = cp; } /* * NAME * unsetenv - remove environment variable * * SYNOPSIS * void unsetenv(char *name); * * DESCRIPTION * The unsetenv function is used to remove the named variable from the * environment. * * RETURNS * void * * CAVEAT * Assumes that the env_initialize function has been called already. */ void env_unset(char *name) { size_t name_len; int j; char *cp; if (!initialized) env_initialize(); name_len = strlen(name); cp = 0; for (j = 0; j < nenvirons; ++j) { cp = environ[j]; /* assert(cp); */ if ( (cp[name_len] == '=' || !cp[name_len]) && !strncmp(cp, name, name_len) ) break; } if (!environ[j]) return; environ[j] = 0; if (cp) mem_free(cp); --nenvirons; for ( ; j < nenvirons; ++j) environ[j] = environ[j + 1]; } fhist-1.18/common/env.h 644 0 0 171411265752627 142440ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_ENV_H #define COMMON_ENV_H #include void env_set(char *name, char *value); void env_unset(char *name); #endif /* COMMON_ENV_H */ fhist-1.18/common/error.c 644 0 0 2247311265752627 146250ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1991-1994, 1998-2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include #include #include #include #include #include #include #include /* * NAME * wrap - wrap s string over lines * * SYNOPSIS * void wrap(char *); * * DESCRIPTION * The wrap function is used to print error messages onto stderr * wrapping ling lines. * * CAVEATS * Line length is assumed to be 80 characters. */ #define PAGE_WIDTH 79 static void wrap(char *s) { static char escapes[] = "\rr\nn\ff\bb\tt"; char tmp[PAGE_WIDTH + 2]; int first_line; char *tp; int bomb_later; char *progname; /* * Flush stdout so that errors are in sync with the output. * If you get an error doing this, whinge about it _after_ reporting * the originating error. Also, clear the error on stdout to * avoid getting caught in an infinite loop. */ if (fflush(stdout) || ferror(stdout)) { bomb_later = errno; clearerr(stdout); } else bomb_later = 0; progname = progname_get(); first_line = 1; while (*s) { char *ep; int ocol; /* * Work out how many characters fit on the line. */ if (first_line) ocol = strlen(progname) + 2; else ocol = 8; for (ep = s; *ep; ++ep) { int cw; int c; c = (unsigned char)*ep; if (isprint(c)) cw = 1 + (c == '\\'); else cw = (strchr(escapes, c) ? 2 : 4); if (ocol + cw > PAGE_WIDTH) break; ocol += cw; } /* * see if there is a better place to break the line */ if (*ep && *ep != ' ') { char *mp; for (mp = ep; mp > s; --mp) { if (strchr(" /", mp[-1])) { ep = mp; break; } } } /* * ignore trailing blanks */ while (ep > s && ep[-1] == ' ') ep--; /* * print the line */ if (first_line) sprintf(tmp, "%.*s: ", (int)(sizeof(tmp) - 3), progname); else strcpy(tmp, "\t"); tp = tmp + strlen(tmp); while (s < ep) { int c; c = (unsigned char)*s++; if (isprint(c)) { if (c == '\\') *tp++ = '\\'; *tp++ = c; } else { char *esc; esc = strchr(escapes, c); if (esc) { *tp++ = '\\'; *tp++ = esc[1]; } else { sprintf(tp, "\\%3.3o", c); tp += strlen(tp); } } } *tp++ = '\n'; *tp = 0; fputs(tmp, stderr); if (ferror(stderr)) break; /* * skip leading spaces for subsequent lines */ while (*s == ' ') s++; first_line = 0; } if (fflush(stderr) || ferror(stderr)) { /* don't print why, there is no point! */ quit(1); } if (bomb_later) { errno = bomb_later; nfatal_raw("(stdout)"); } } static void double_jeopardy(void) { char buffer[200]; sprintf ( buffer, "while attempting to construct an error message: %.100s (fatal)", strerror(errno) ); wrap(buffer); quit(1); } static char * copy_string(char *s) { char *cp; errno = 0; cp = malloc(strlen(s) + 1); if (!cp) { if (!errno) errno = ENOMEM; double_jeopardy(); } strcpy(cp, s); return cp; } /* * NAME * error - place a message on the error stream * * SYNOPSIS * void error(char *s, ...); * * DESCRIPTION * Error places a message on the error output stream. * The first argument is a printf-like format string, * optionally followed by other arguments. * The message will be prefixed by the program name and a colon, * and will be terminated with a newline, automatically. * * CAVEAT * Things like "error(filename)" blow up if the filename * contains a '%' character. */ void error_raw(char *s, ...) { va_list ap; char *buffer; va_start(ap, s); buffer = vmprintf_errok(s, ap); if (!buffer) double_jeopardy(); va_end(ap); wrap(buffer); } /* * NAME * nerror - place a system fault message on the error stream * * SYNOPSIS * void nerror(char *s, ...); * * DESCRIPTION * Nerror places a message on the error output stream. * The first argument is a printf-like format string, * optionally followed by other arguments. * The message will be prefixed by the program name and a colon, * and will be terminated with a text description of the error * indicated by the 'errno' global variable, automatically. * * CAVEAT * Things like "nerror(filename)" blow up if the filename * contains a '%' character. */ void nerror_raw(char *s, ...) { va_list ap; int n; char *buf1; char *buf2; n = errno; va_start(ap, s); buf1 = vmprintf_errok(s, ap); if (!buf1) double_jeopardy(); va_end(ap); buf1 = copy_string(buf1); buf2 = mprintf_errok("%s: %s", buf1, strerror(n)); if (!buf2) double_jeopardy(); free(buf1); wrap(buf2); } /* * NAME * nfatal - place a system fault message on the error stream and exit * * SYNOPSIS * void nfatal(char *s, ...); * * DESCRIPTION * Nfatal places a message on the error output stream and exits. * The first argument is a printf-like format string, * optionally followed by other arguments. * The message will be prefixed by the program name and a colon, * and will be terminated with a text description of the error * indicated by the 'errno' global variable, automatically. * * CAVEAT * Things like "nfatal(filename)" blow up if the filename * contains a '%' character. * * This function does NOT return. */ void nfatal_raw(char *s, ...) { va_list ap; int n; char *buf1; char *buf2; n = errno; va_start(ap, s); buf1 = vmprintf_errok(s, ap); if (!buf1) double_jeopardy(); va_end(ap); buf1 = copy_string(buf1); buf2 = mprintf_errok("%s: %s", buf1, strerror(n)); if (!buf2) double_jeopardy(); wrap(buf2); quit(1); } /* * NAME * fatal - place a message on the error stream and exit * * SYNOPSIS * void fatal(char *s, ...); * * DESCRIPTION * Fatal places a message on the error output stream and exits. * The first argument is a printf-like format string, * optionally followed by other arguments. * The message will be prefixed by the program name and a colon, * and will be terminated with a newline, automatically. * * CAVEAT * Things like "error(filename)" blow up if the filename * contains a '%' character. * * This function does NOT return. */ void fatal_raw(char *s, ...) { va_list ap; char *buffer; va_start(ap, s); buffer = vmprintf_errok(s, ap); if (!buffer) double_jeopardy(); va_end(ap); wrap(buffer); quit(1); } /* * NAME * assert - make an assertion * * SYNOPSIS * void assert(int condition); * * DESCRIPTION * Assert is a handy tool for a programmer to guarantee the internal * consistency of their program. If "-DDEBUG" is specified on * the compiler's command line, then assert will generate code to verify * the assertios made. If no DEBUG is defined, assertions will generate * no code. * * CAVEAT * If the assertion fails, a fatal diagnostic is issued. * * The #define's which control the compilation may be found in "error.h". * */ #ifdef my_assert #undef my_assert #endif void my_assert(int c, char *s, char *file, int line) { if (c) return; error_raw("%s: %d: assertion \"%s\" failed (bug)", file, line, s); abort(); } fhist-1.18/common/error.h 644 0 0 275311265752627 146110ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1991-1994, 1998-2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_ERROR_H #define COMMON_ERROR_H #include #include #define error @/@/@ #define nerror @/@/@ #define fatal @/@/@ #define nfatal @/@/@ void error_raw(char *, ...) ATTRIBUTE_FORMAT_1_2; void fatal_raw(char *, ...) ATTRIBUTE_FORMAT_1_2 ATTR_NORETURN; void nerror_raw(char *, ...) ATTRIBUTE_FORMAT_1_2; void nfatal_raw(char *, ...) ATTRIBUTE_FORMAT_1_2 ATTR_NORETURN; void my_assert(int, char *, char *, int); #ifdef DEBUG # ifdef __STDC__ # define assert(c) my_assert((c) != 0, #c, __FILE__, __LINE__) # else # define assert(c) my_assert((c) != 0, "c", __FILE__, __LINE__) # endif #else # define assert(c) #endif #endif /* COMMON_ERROR_H */ fhist-1.18/common/error_intl.c 644 0 0 4522311265752627 156510ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include #include #include #include #include #include #include #include #include /* * NAME * column_width - determine column width of a wide character * * SYNOPSIS * int column_width(wchar_t); * * DESCRIPTION * The column_width function is used to determine the column width * if a wide character. This is particularly hard to do, * especially if you have read the ISO C standard ammendments. * * WEASEL WORDS * This is the phrase used by P.J. Plauger in his CUJ columns about * standard C and C++, specially when the standard dances all * around the issue, rather than actually solving anything. Take a * squiz at these classic weasel words... * * In the original standard, ISO/IEC 9899:1990, 7.3 Character * handling reads as follows (3rd paragraph): * * The term printing character refers to a member of * an implemntation defined set of characters, each of * which occupies one printing position on a display * device; the term control character refers to a * member of an implementation defined set of characters * that are not printing characters. * * The following 2 sections are from ISO/IEC 9899:1990/Amd. 1:1995 (E): * * 7.15.2 Wide-character classification utilities (2nd paragraph) * * The term printing wide character refers to a * member of a locale-specific set of wide characters, each * of which occupies at least one printing position on a * display device; the term control wide character * refers to a member of a locale-specific set of wide * characters that are not printing wide characters. * * [ Notice how they weasel out by not-quite contradicting 7.3: a * printing char is exactly one printing position wide, but * a printing wchar_t is one or more printing positions * wide. ] * * H.14 Column width * * The number of characters to be read or written can be * specified in existing formatted i/o functions. On a * traditional display device that displays characters with * fixed pitch, the number of characters is directly * proportional to the width occupied by the characters. * So the display format can be specified through the field * width and/or the precision. * * In formatted wide-character i/o functions, the field * width and the precision specify the number of wide * characters to be read or written. The number of wide * characters is not always directly proportional to the * width of their display. For example, with Japanese * traditional display devices, a single-byte character * such as an ASCII character has half the width of a Kanji * character, even though each of them is treated as one * wide character. To control the display format for wide * characters, a set of formatted wide-character i/o * functions were proposed whose metric was the column * width instead of the character count. * * This proposal was supported only by Japan. Critics * observed that the proposal was based on such traditional * display devices with a fixed width of characters, while * many modern display devices support a broad assortment * of proportional pitch type faces. Hence, it was * questioned whether the extra i/o functions in this * proposal were really needed or were sufficiently * general. Also considered were another set of functions * that return the column width for any kind of display * devices for a given wide-character string; but these * seemed to be beyond the scope of the C language. Thus * all proposals regarding column width were withdrawn. * * [ Notice how 7.15.2 specifically states that each printing * character has a non-zero width measurable in printing * positions. Why is this metric is unavailable to the * C programmer? Presumably it is OK for an informational appendix * to contradict the body of the standard. ] * * [ The section ends with a compliant-but-non-standard way a * standard C library implementor may choose to do this. You can't * reply on it being there, and you can't reply on the suggested * semantics being used, so don't even bother having ./configure go * look for it. ] * * SO FAKE IT * Since there is no standard way to determine character width, we * will have to fake it. Hopefully, locales that need it will * define something useful. If you know of any, please let me * know. */ static int column_width(wchar_t wc) { #ifdef HAVE_ISWCTYPE static int kanji_set; static wctype_t kanji; if (!kanji_set) { kanji = wctype("kanji"); kanji_set = 1; } if (kanji && iswctype(kanji, wc)) return 2; #endif return 1; } static int wcs_column_width(wchar_t *wcs) { int result; result = 0; while (*wcs) result += column_width(*wcs++); return result; } /* * NAME * wrap - wrap s string over lines * * SYNOPSIS * void wrap(wstring_ty *); * * DESCRIPTION * The wrap function is used to print error messages onto stderr * wrapping ling lines. Be very careful of multi-byte characters * in international character sets. * * CAVEATS * Line length is assumed to be 80 characters. */ static void wrap(const wchar_t *s) { char *progname; int page_width; char tmp[(MAX_PAGE_WIDTH + 2) * MB_LEN_MAX]; int first_line; char *tp; int nbytes; static int progname_width; int midway; /* * flush any pending output, * so the error message appears in a sensible place. */ if (fflush(stdout) || ferror(stdout)) nfatal_raw("standard output"); /* * Ask the system how wide the terminal is. * Don't use last column, many terminals are dumb. */ page_width = page_width_get() - 1; midway = (page_width + 8) / 2; /* * Because it must be a legal UNIX file name, it is unlikely to * be stupid - unprintable characters are hard to type, and most * file systems don't allow high-bit-on characters in file * names. Thus, assume progname is all legal characters. */ progname = progname_get(); if (!progname_width) { wstring_ty *ws; ws = wstr_from_c(progname); progname_width = wcs_column_width(ws->wstr_text); wstr_free(ws); } /* * the message is for a human, so * use the human's locale */ language_human(); /* * Emit the message a line at a time, wrapping as we go. The * first line starts with the program name, subsequent lines are * indented by a tab. */ first_line = 1; while (*s) { const wchar_t *ep; int ocol; const wchar_t *break_space; int break_space_col; const wchar_t *break_punct; int break_punct_col; /* * Work out how many characters fit on the line. */ if (first_line) ocol = progname_width + 2; else ocol = 8; wctomb(NULL, 0); ep = s; break_space = 0; break_space_col = 0; break_punct = 0; break_punct_col = 0; while (*ep) { char dummy[MB_LEN_MAX]; int cw; wchar_t c; /* * Keep printing characters. Use a dummy * character for unprintable sequences (which * should not happen). */ c = *ep; if (!iswprint(c)) c = '?'; nbytes = wctomb(dummy, c); cw = column_width(c); if (nbytes <= 0) { /* * This should not happen! All * unprintable characters should have * been turned into C escapes inside the * common/wstr.c file when converting from C * string to wide strings. * * Replace invalid wide characters with * a C escape. */ cw = 4; nbytes = 4; /* * The wctomb state will be ``error'', * so reset it and brave the worst. No * need to reset the wctomb state, it is * not broken. */ wctomb(NULL, 0); } /* * Keep track of good places to break the line, * but try to avoid runs of white space. There * is a pathological case where the line is * entirely composed of white space, but it does * not happen often. */ if (c == ' ') { break_space = ep; break_space_col = ocol; while (break_space > s && break_space[-1] == ' ') { --break_space; --break_space_col; } } if (iswpunct(c) && ocol + cw <= page_width) { break_punct = ep + 1; break_punct_col = ocol + cw; } /* * if we have run out of room, break here */ if (ocol + cw > page_width) break; ocol += cw; ++ep; } /* * see if there is a better place to break the line * * Break the line at space characters, otherwise break * at punctuator characters. If it is possible to break * on either a space or a punctuator, choose the space. * * However, if the space is in the left half of the * line, things look very unbalanced, so break on a * punctuator in that case. */ if (*ep && *ep != ' ') { if (break_space == s) break_space = 0; if ( break_space && break_punct && break_space_col < midway && break_punct_col >= midway ) ep = break_punct; else if (break_space) ep = break_space; else if (break_punct) ep = break_punct; } /* * print the line */ if (first_line) { strcpy(tmp, progname); strcat(tmp, ": "); } else strcpy(tmp, "\t"); tp = tmp + strlen(tmp); /* * Turn the input into a multi bytes chacacters. */ wctomb(NULL, 0); while (s < ep) { wchar_t c; /* * Keep printing characters. Use a dummy * character for unprintable sequences (which * should not happen). */ c = *s++; if (!iswprint(c)) c = '?'; nbytes = wctomb(tp, c); if (nbytes <= 0) { /* * This should not happen! All * unprintable characters should have * been turned into C escapes inside the * wstring.c file when converting from C * string to wide strings. * * Replace invalid wide characters with * a C escape. */ nbytes = 4; tp[0] = '\\'; tp[1] = '0' + ((c >> 6) & 7); tp[2] = '0' + ((c >> 3) & 7); tp[3] = '0' + ( c & 7); /* * The wctomb state will be ``error'', * so reset it and brave the worst. No * need to reset the wctomb state, it is * not broken. */ wctomb(NULL, 0); } tp += nbytes; } /* * Add a newline and end any outstanding shift state and * add a NUL character. */ nbytes = wctomb(tp, (wchar_t)'\n'); if (nbytes > 0) tp += nbytes; nbytes = wctomb(tp, (wchar_t)0); if (nbytes > 0) tp += nbytes; /* * Emit the line to stderr. It is important to do this * a whole line at a time, otherwise performance is * terrible - stderr by default is character buffered. */ fputs(tmp, stderr); if (ferror(stderr)) break; /* * skip leading spaces for subsequent lines */ while (*s == ' ') ++s; first_line = 0; } /* * done with humans */ language_C(); /* * make sure nothing went wrong */ if (fflush(stderr) || ferror(stderr)) nfatal_raw("standard error"); } void error_intl(sub_context_ty *scp, const char *s) { wstring_ty *message; int need_to_delete; if (scp) need_to_delete = 0; else { scp = sub_context_new(); need_to_delete = 1; } message = subst_intl_wide(scp, s); wrap(message->wstr_text); wstr_free(message); if (need_to_delete) sub_context_delete(scp); } void fatal_intl(sub_context_ty *scp, const char *s) { wstring_ty *message; static const char *double_jeopardy; /* * Make sure that there isn't an infinite loop, * if there is a problem with a substitution * in an error message. */ if (double_jeopardy) { /* * this error message can't be internationalized */ fatal_raw ( "a fatal_intl error (\"%s\") happened while \ attempting to report an earlier fatal_intl error (\"%s\"). \ This is a probably bug.", s, double_jeopardy ); } double_jeopardy = s; if (!scp) scp = sub_context_new(); message = subst_intl_wide(scp, s); wrap(message->wstr_text); double_jeopardy = 0; quit(1); } /* * These are extra messages generated by various tools, but which must * be translated all the same. */ #if 0 static void bogus(void) { /* bison */ i18n("parse error"); i18n("parse error; also virtual memory exceeded"); i18n("parser stack overflow"); /* yacc */ i18n("syntax error"); } #endif fhist-1.18/common/error_intl.h 644 0 0 227611265752627 156370ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_ERROR_INTL_H #define COMMON_ERROR_INTL_H #include /* always needed */ /* * internationalized error messages * (also the keywords necessary to pull out the msgid strings) */ void error_intl(sub_context_ty *, const char *); void fatal_intl(sub_context_ty *, const char *) ATTR_NORETURN; void verbose_intl(sub_context_ty *, const char *); #endif /* COMMON_ERROR_INTL_H */ fhist-1.18/common/fcheck.c 644 0 0 513711265752627 146750ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include FILE * fopen_and_check(const char *filename, const char *mode) { FILE *fp; if (!filename) return (strchr(mode, 'r') ? stdin : stdout); fp = fopen(filename, mode); if (!fp) { sub_context_ty *scp; scp = sub_context_new(); sub_errno_set(scp); sub_var_set_charstar(scp, "File_Name", filename); fatal_intl(scp, i18n("open \"$filename\": $errno")); } return fp; } void fflush_and_check(FILE *fp, const char *filename) { if (fflush(fp)) { sub_context_ty *scp; scp = sub_context_new(); sub_errno_set(scp); sub_var_set_charstar(scp, "File_Name", filename); fatal_intl(scp, i18n("write \"$filename\": $errno")); } } void fclose_and_check(FILE *fp, const char *filename) { if (fp == stdout || fp == stdin) return; if (fclose(fp)) { sub_context_ty *scp; scp = sub_context_new(); sub_errno_set(scp); sub_var_set_charstar(scp, "File_Name", filename); fatal_intl(scp, i18n("close \"$filename\": $errno")); } } void fatal_with_filename(const char *filename, sub_context_ty *scp, const char *text) { string_ty *s; if (!scp) scp = sub_context_new(); s = subst_intl(scp, (char *)text); sub_var_set_charstar(scp, "File_Name", filename); sub_var_set_string(scp, "MeSsaGe", s); str_free(s); fatal_intl(scp, i18n("$filename: $message")); } void warning_last_line_unterminated(const char *filename) { sub_context_ty *scp; scp = sub_context_new(); sub_var_set_charstar(scp, "File_Name", filename); error_intl(scp, i18n("$filename: warning: last line unterminated")); sub_context_delete(scp); } fhist-1.18/common/fcheck.h 644 0 0 232011265752627 146710ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_FCHECK_H #define COMMON_FCHECK_H #include #include FILE *fopen_and_check(const char *, const char *); void fflush_and_check(FILE *, const char *); void fclose_and_check(FILE *, const char *); void warning_last_line_unterminated(const char *); struct sub_context_ty; void fatal_with_filename(const char *, struct sub_context_ty *, const char *); #endif /* COMMON_FCHECK_H */ fhist-1.18/common/fileio.c 644 0 0 2131111265752627 147310ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1991-1994, 1998-2000, 2002, 2008 Peter Miller * * Derived from a work * Copyright (C) 1990 David I. Bell. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . * * Functions to position within an ascii file and read lines from it. */ #include #include #include #include #include #include #include #include #include #include #include #include #define LINEALLOCSIZE 132 /* allocation size for line buffer */ /* * Position absolutely within a file to the indicated byte position, * returns a negative value if failed. */ void seekf(FILE *fp, long pos, const char *filename) { if (fseek(fp, pos, SEEK_SET) == -1) { sub_context_ty *scp; scp = sub_context_new(); sub_errno_set(scp); sub_var_set_charstar(scp, "File_Name", filename); sub_var_set_long(scp, "Number", pos); fatal_intl(scp, i18n("fseek(\"$filename\", $number): $errno")); } } /* * Skip forwards through a file by the specified number of lines. * Returns nonzero on end of file or any error. */ int skipf(FILE *fp, long count, const char *filename) { int c; while (count > 0) { c = getc(fp); if (c == EOF) { if (ferror(fp)) { sub_context_ty *scp; scp = sub_context_new(); sub_errno_set(scp); sub_var_set_charstar(scp, "File_Name", filename); fatal_intl(scp, i18n("read \"$filename\": $errno")); } return -1; } if (c == '\n') --count; } return 0; } /* * Function to read in the next line from a file, no matter how long it is. * This returns a pointer to the string, and also indirectly its length. * The string is normally returned from a static string, which is reused * for each call. But if keep is non-zero, then the returned string * belongs to the caller and must later be freed. The returned line * is ended with a newline and null character, but the returned length * does not count the null character. Returns 0 on an error, with the * error stored in the fp structure. */ char * readlinef(FILE *fp, long *retlen, int keep, const char *filename, int *is_bin_file) { char *cp; /* pointer to character string */ char *dp; /* destination pointer */ long cursize; /* current size */ long count; /* length of data read from file */ long totallen; /* total length of data */ static char *linebuffer; /* common line buffer */ static long linelength; /* total length of line */ totallen = 0; if (linelength == 0) { /* allocate line buffer */ linebuffer = r_alloc_and_check(LINEALLOCSIZE + 1); linelength = LINEALLOCSIZE; } cp = linebuffer; cursize = linelength; for (;;) { count = readf(fp, cp, cursize, filename, is_bin_file); if (count <= 0) { if (totallen == 0) return 0; warning_last_line_unterminated(filename); count = 1; cp[0] = '\n'; } totallen += count; if (cp[count - 1] == '\n') break; linebuffer = r_realloc_and_check(linebuffer, linelength + LINEALLOCSIZE + 1); cp = linebuffer + totallen; linelength += LINEALLOCSIZE; cursize = LINEALLOCSIZE; } if (retlen) *retlen = totallen; if (!keep) dp = linebuffer; else { dp = cm_alloc_and_check(totallen + 1); memcpy(dp, linebuffer, (size_t)totallen); } dp[totallen] = 0; return dp; } /* * Read data from the current position in a file until a newline is found * or the supplied buffer is full. These two cases can be distinguished by * checking the last character of the returned data. Returns the number of * characters in the line (including the newline), or -1 if an error or end * of file in the middle of the line is found. Line is terminated by a null * character if space allows. Returns zero if the end of file occurs at * the front of the line. */ long readf(FILE *fp, char *buf, long size, const char *filename, int *is_bin_file) { char *bp; char *ep; int c; bp = buf; ep = buf + size; while (bp < ep) { c = getc(fp); if (c == EOF) { if (ferror(fp)) { sub_context_ty *scp; scp = sub_context_new(); sub_errno_set(scp); sub_var_set_charstar(scp, "File_Name", filename); fatal_intl(scp, i18n("read \"$filename\": $errno")); } if (bp != buf) break; return -1; } if (c == 0) { c = 0x80; *is_bin_file = 1; } *bp++ = c; if (c == '\n') break; } return (bp - buf); } /* * Write data at the current position in a file. * This buffers the data in the current block, thus flushing is needed later. * Prints a fatal error message and exits on errors. */ void writefx(FILE *fp, char *buf, long size, const char *filename) { fwrite(buf, 1, size, fp); if (ferror(fp)) { sub_context_ty *scp; scp = sub_context_new(); sub_errno_set(scp); sub_var_set_charstar(scp, "File_Name", filename); fatal_intl(scp, i18n("write \"$filename\": $errno")); } } /* * Function to copy data from one file to another. Data is copied from * the current position of the input file to the current position of the * output file until end of file is reached on the input file, or until * the specified number of characters has been read. Minus one means * there is no limit to the amount to be copied. Line boundaries and * space expansions are ignored. Returns nonzero on errors. */ int copyf(FILE *ip, FILE *op, long count, const char *ifn, const char *ofn) { char buffer[1 << 10]; long len; while (count) { if (count < 0 || count > sizeof(buffer)) len = sizeof(buffer); else len = count; len = fread(buffer, 1, len, ip); if (len < 0) return EOF; if (len == 0) break; fwrite(buffer, 1, len, op); if (ferror(op)) return EOF; if (count >= 0) count -= len; } return 0; } void copyfx(FILE *ip, FILE *op, long count, const char *ifn, const char *ofn) { char buffer[1 << 10]; long len; sub_context_ty *scp; while (count) { if (count < 0 || count > sizeof(buffer)) len = sizeof(buffer); else len = count; len = fread(buffer, 1, len, ip); if (len < 0) { scp = sub_context_new(); sub_errno_set(scp); sub_var_set_charstar(scp, "File_Name", ifn); fatal_intl(scp, i18n("read \"$filename\": $errno")); } if (len == 0) break; fwrite(buffer, 1, len, op); if (ferror(op)) { scp = sub_context_new(); sub_errno_set(scp); sub_var_set_charstar(scp, "File_Name", ofn); fatal_intl(scp, i18n("write \"$filename\": $errno")); } if (count >= 0) count -= len; } fflush_and_check(op, ofn); } /* * Function to type out the rest of an input file to the terminal. * It is assumed that we are positioned at the beginning of a line. */ int typef(FILE *fp, const char *filename) { return copyf(fp, stdout, -1L, filename, gettext("standard output")); } void typefx(FILE *fp, const char *filename) { copyfx(fp, stdout, -1L, filename, gettext("standard output")); } fhist-1.18/common/fileio.h 644 0 0 276311265752627 147300ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1991-1994, 1998-2000, 2002, 2008 Peter Miller * * Derived from a work * Copyright (C) 1990 David I. Bell. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . * * Definitions for local file handling routines. */ #ifndef FILEIO_H #define FILEIO_H #include #include /* * Function Prototypes */ void seekf(FILE *, long, const char *); int skipf(FILE *, long, const char *); char *readlinef(FILE *, long *, int, const char *, int *); long readf(FILE *, char *, long, const char *, int *); void writefx(FILE *, char *, long, const char *); int copyf(FILE *, FILE *, long, const char *, const char *); void copyfx(FILE *, FILE *, long, const char *, const char *); int typef(FILE *, const char *); void typefx(FILE *, const char *); #endif /* FILEIO_H */ fhist-1.18/common/help.c 644 0 0 1454111265752627 144210ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1991-2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include #include #include #include #include #include #include #include #include static void help_env(void) { char *cp; string_list_ty manpath; string_ty *s; string_list_ty lib; string_list_ty lang; size_t j, k; string_list_ty wl; /* * Honour any existing MANPATH setting by appending only. * Read the MANPATH to set the initial path. */ cp = getenv("MANPATH"); if (cp) { s = str_from_c(cp); str2wl(&manpath, s, ":", 0); str_free(s); } else { string_list_constructor(&manpath); s = str_from_c("/usr/man"); string_list_append(&manpath, s); str_free(s); s = str_from_c("/usr/share/man"); string_list_append(&manpath, s); str_free(s); } /* * The list of library directories to look in. */ string_list_constructor(&lib); s = str_from_c(configured_datadir()); string_list_append_unique(&lib, s); str_free(s); cp = getenv("FHIST_MESSAGE_LIBRARY"); if (cp) { s = str_from_c(cp); str2wl(&wl, s, ":", 0); for (j = 0; j < wl.nstrings; ++j) string_list_append_unique(&lib, wl.string[j]); string_list_destructor(&wl); } /* * Use the LANGUAGE (or LANG) environment * variables to know which languages to add. * Default to "en" if not set. */ string_list_constructor(&lang); cp = getenv("LANGUAGE"); if (cp) { s = str_from_c(cp); str2wl(&wl, s, ":", 0); for (j = 0; j < wl.nstrings; ++j) string_list_append_unique(&lang, wl.string[j]); string_list_destructor(&wl); } cp = getenv("LANG"); if (cp) { s = str_from_c(cp); str2wl(&wl, s, ":", 0); for (j = 0; j < wl.nstrings; ++j) string_list_append_unique(&lang, wl.string[j]); string_list_destructor(&wl); } if (!lang.nstrings) { s = str_from_c("en"); string_list_append(&lang, s); str_free(s); } /* * convolve the lib and lang lists and append them to the manpath */ for (j = 0; j < lib.nstrings; ++j) { string_list_append_unique(&manpath, lib.string[j]); for (k = 0; k < lang.nstrings; ++k) { s = str_format("%S/%S", lib.string[j], lang.string[k]); string_list_append_unique(&manpath, s); str_free(s); } } string_list_destructor(&lib); string_list_destructor(&lang); s = str_from_c(configured_mandir()); string_list_append_unique(&lib, s); str_free(s); /* * set the MANPATH environment variable */ s = wl2str(&manpath, 0, manpath.nstrings, ":"); string_list_destructor(&manpath); env_set("MANPATH", s->str_text); str_free(s); } void help(char *progname, void (*usage)(void)) { char *argv[3]; sub_context_ty *scp; /* * collect the rest of the command line, * if necessary */ if (usage) { arglex(); while (arglex_token != arglex_token_eoln) bad_argument(usage); } if (!progname) progname = progname_get(); /* * set the MANPATH environment variable * to point into the libraries */ help_env(); /* * Invoke the appropriate ``man'' command. This will find the * right language on the search path, and it already knows how * to translate the *roff into text. */ argv[0] = "man"; argv[1] = progname; argv[2] = 0; error_raw("%s %s", argv[0], argv[1]); execvp(argv[0], argv); scp = sub_context_new(); sub_errno_set(scp); sub_var_set_charstar(scp, "File_Name", argv[0]); fatal_intl(scp, i18n("exec \"$filename\": $errno")); /* NOTREACHED */ } void bad_argument(void (*usage)(void)) { sub_context_ty *scp; trace(("bad_argument()\n{\n")); switch (arglex_token) { case arglex_token_string: scp = sub_context_new(); sub_var_set_charstar(scp, "File_Name", arglex_value.alv_string); error_intl(scp, i18n("misplaced file name (\"$filename\")")); sub_context_delete(scp); break; case arglex_token_number: scp = sub_context_new(); sub_var_set_charstar(scp, "Number", arglex_value.alv_string); error_intl(scp, i18n("misplaced number ($number)")); sub_context_delete(scp); break; case arglex_token_option: scp = sub_context_new(); sub_var_set_charstar(scp, "Name", arglex_value.alv_string); error_intl(scp, i18n("unknown \"$name\" option")); sub_context_delete(scp); break; case arglex_token_eoln: error_intl(0, i18n("command line too short")); break; default: scp = sub_context_new(); sub_var_set_charstar(scp, "Name", arglex_token_name(arglex_token)); error_intl(scp, i18n("misplaced \"$name\" option")); sub_context_delete(scp); break; } usage(); trace(("}\n")); quit(1); /* NOTREACHED */ } void mutually_exclusive(int arg1, int arg2, void (*usage)(void)) { sub_context_ty *scp; scp = sub_context_new(); sub_var_set_charstar(scp, "Name1", arglex_token_name(arg1)); sub_var_set_charstar(scp, "Name2", arglex_token_name(arg2)); error_intl(scp, i18n("$name1 and $name2 mutually exclusive")); sub_context_delete(scp); usage(); quit(1); } fhist-1.18/common/help.h 644 0 0 224011265752627 143770ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1991-1994, 1998, 2002, 2005, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef HELP_H #define HELP_H #include void help(char *, void (*usage)(void)); void bad_argument(void(*)(void)); /** * The mutually_exclusive function is used to complain abut the user * specifying two mutually exclusive command line options. */ void mutually_exclusive(int arg1, int arg2, void (*usage)(void)); #endif /* HELP_H */ fhist-1.18/common/input.c 644 0 0 1556511265752627 146370ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2000-2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include #include #include #ifdef input_name #undef input_name #endif const char * input_name(input_ty *fp) { const char *result; trace(("input_name(fp = %8.8lX)\n{\n", (long)fp)); result = fp->vptr->name(fp); trace(("return \"%s\";\n", result)); trace(("}\n")); return result; } #ifdef input_length #undef input_length #endif long input_length(input_ty *fp) { long result; trace(("input_length(fp = %8.8lX)\n{\n", (long)fp)); result = fp->vptr->length(fp); trace(("return %ld;\n", result)); trace(("}\n")); return result; } #ifdef input_ftell #undef input_ftell #endif long input_ftell(input_ty *fp) { long result; trace(("input_ftell(fp = %8.8lX)\n{\n", (long)fp)); result = fp->vptr->ftell(fp) - fp->pushback_len; trace(("return %ld;\n", result)); trace(("}\n")); return result; } #ifdef input_read #undef input_read #endif long input_read(input_ty *fp, void *data, long len) { long result; trace(("input_read(fp = %8.8lX, data = %8.8lX, len = %8.8lX)\n{\n", (long)fp, (long)data, len)); if (len <= 0) { result = 0; } else { if (fp->pushback_len > 0) { fp->pushback_len--; *(char *)data = fp->pushback_buf[fp->pushback_len]; result = 1; } else { result = fp->vptr->read(fp, data, len); } } trace(("return %ld;\n", result)); trace(("}\n")); return result; } #ifdef DEBUG static char * unctrl(int c) { static char buffer[10]; if (c < 0 || c >= 256) { snprintf(buffer, sizeof(buffer), "%d", c); return buffer; } switch (c) { case '\'': case '\\': escape: buffer[0] = '\''; buffer[1] = '\\'; buffer[2] = c; buffer[3] = '\''; buffer[4] = 0; break; case '\b': c = 'b'; goto escape; case '\f': c = 'f'; goto escape; case '\n': c = 'n'; goto escape; case '\r': c = 'r'; goto escape; case '\t': c = 't'; goto escape; default: if (isprint((unsigned char)c)) { buffer[0] = '\''; buffer[1] = c; buffer[2] = '\''; buffer[3] = 0; } else snprintf(buffer, sizeof(buffer), "'\\%o'", c); break; } return buffer; } #endif #ifdef input_getc #undef input_getc #endif int input_getc(input_ty *fp) { int result; trace(("input_getc(fp = %8.8lX)\n{\n", (long)fp)); if (fp->pushback_len > 0) { fp->pushback_len--; result = fp->pushback_buf[fp->pushback_len]; } else result = fp->vptr->get(fp); trace(("return %s;\n", unctrl(result))); trace(("}\n")); return result; } #ifdef input_ungetc #undef input_ungetc #endif void input_ungetc(input_ty *fp, int c) { trace(("input_ungetc(fp = %8.8lX, c = %s)\n{\n", (long)fp, unctrl(c))); if (c >= 0) { if (fp->pushback_len >= fp->pushback_max) { fp->pushback_max = 16 + 2 * fp->pushback_max; fp->pushback_buf = mem_change_size(fp->pushback_buf, fp->pushback_max); } fp->pushback_buf[fp->pushback_len++] = c; } trace(("}\n")); } void input_delete(input_ty *fp) { trace(("input_delete(fp = %8.8lX)\n{\n", (long)fp)); if (fp->vptr->destruct) fp->vptr->destruct(fp); if (fp->pushback_buf) mem_free(fp->pushback_buf); fp->pushback_buf = 0; fp->pushback_len = 0; fp->pushback_max = 0; fp->vptr = 0; /* paranoia */ mem_free(fp); trace(("}\n")); } #include /* * Routine to read in the next line from a file, no matter how long it is. * This returns a pointer to the string, and also indirectly its length. * The string is normally returned from a static string, which is reused * for each call. But if keep is non-zero, then the returned string * belongs to the caller and must later be freed. The returned line * is ended with a newline and null character, but the returned length * does not count the null character. Returns 0 on an error, with the * error stored in the fp structure. */ char * input_readline(input_ty *fp, long *retlen, int keep, int *is_bin_file) { char *dp; /* destination pointer */ size_t totallen; /* total length of data */ static char *linebuffer; /* common line buffer */ static size_t linelength; /* total length of line */ trace(("input_readline(fp = %8.8lX, retlen = %8.8lX, keep = %d)\n{\n", (long)fp, (long)retlen, keep)); if (linelength == 0) { /* allocate line buffer */ linelength = 16; linebuffer = r_alloc_and_check(linelength + 1); } totallen = 0; for (;;) { int c = input_getc(fp); if (c < 0) { if (totallen == 0) return 0; warning_last_line_unterminated(input_name(fp)); c = '\n'; } if (c == 0) { *is_bin_file = 1; c = 0x80; } if (totallen >= linelength) { /* * doubling gives O(1) behaviour * over the life of the prog */ linelength = linelength * 2 + 16; linebuffer = r_realloc_and_check(linebuffer, linelength + 1); } linebuffer[totallen++] = c; if (c == '\n') break; } linebuffer[totallen] = 0; if (retlen) *retlen = totallen; if (!keep) dp = linebuffer; else { dp = cm_alloc_and_check(totallen + 1); memcpy(dp, linebuffer, (size_t)totallen); } trace(("return %8.8lX;\n", (long)dp)); trace(("}\n")); return dp; } void input_skip_lines(input_ty *fp, int numlines) { while (numlines > 0) { int c = input_getc(fp); if (c < 0) break; if (c == '\n') --numlines; } } fhist-1.18/common/input.h 644 0 0 601111265752627 146060ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_INPUT_H #define COMMON_INPUT_H #include typedef struct input_ty input_ty; struct input_ty { struct input_vtbl_ty *vptr; /* private: */ unsigned char *pushback_buf; int pushback_len; int pushback_max; }; /* * This structure is *not* to be accessed by clients of this interface. * It is only present to permit optimizations. */ typedef struct input_vtbl_ty input_vtbl_ty; struct input_vtbl_ty { int size; void (*destruct)(input_ty *); long (*read)(input_ty *, void *, long); int (*get)(input_ty *); long (*ftell)(input_ty *); const char *(*name)(input_ty *); long (*length)(input_ty *); }; long input_read(input_ty *, void *, long); int input_getc(input_ty *); void input_ungetc(input_ty *, int); const char *input_name(input_ty *); void input_delete(input_ty *); long input_length(input_ty *); long input_ftell(input_ty *); void input_format_error(input_ty *); char *input_readline(input_ty *, long *retlen, int keep, int *bin); void input_skip_lines(input_ty *, int); struct output_ty; /* existence */ void input_to_output(input_ty *, struct output_ty *); struct string_ty *input_one_line(input_ty *); #ifdef __GNUC__ extern __inline long input_read(input_ty *fp, void *data, long len) { if (len <= 0) return 0; if (fp->pushback_len > 0) { fp->pushback_len--; *(char *)data = fp->pushback_buf[ fp->pushback_len ]; return 1; } return fp->vptr->read(fp, data, len); } extern __inline int input_getc(input_ty *fp) { if (fp->pushback_len > 0) { fp->pushback_len--; return fp->pushback_buf[ fp->pushback_len ]; } return fp->vptr->get(fp); } extern __inline const char *input_name(input_ty *fp) { return fp->vptr->name(fp); } extern __inline long input_length(input_ty *fp) { return fp->vptr->length(fp); } extern __inline long input_ftell(input_ty *fp) { return fp->vptr->ftell(fp) - fp->pushback_len; } #else /* !__GNUC__ */ #ifndef DEBUG #define input_name(fp) ((fp)->vptr->name(fp)) #define input_length(fp) ((fp)->vptr->length(fp)) #define input_ftell(fp) ((fp)->vptr->ftell(fp) - (fp)->pushback_len) #endif /* DEBUG */ #endif /* !__GNUC__ */ #endif /* COMMON_INPUT_H */ fhist-1.18/common/input/crlf.c 644 0 0 635611265752627 155430ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include typedef struct input_crlf_ty input_crlf_ty; struct input_crlf_ty { input_ty inherited; input_ty *fp; long pos; int delete_on_close; }; static void destruct(input_ty *p) { input_crlf_ty *this; trace(("input_crlf::destruct()\n{\n")); this = (input_crlf_ty *)p; input_pushback_transfer(this->fp, p); if (this->delete_on_close) input_delete(this->fp); this->fp = 0; /* paranoia */ trace(("}\n")); } static int get(input_ty *p) { input_crlf_ty *this; int c; trace(("input_crlf::get()\n{\n")); this = (input_crlf_ty *)p; c = input_getc(this->fp); if (c == '\r') { c = input_getc(this->fp); if (c != '\n') { input_ungetc(this->fp, c); c = '\r'; } } if (c >= 0) this->pos++; #ifdef DEBUG if (c < 0) trace(("return EOF;\n")); else if (c >= ' ' && c <= '~') trace(("return '%c';\n", c)); else trace(("return 0x%02X;\n", c)); #endif trace(("}\n")); return c; } static long itell(input_ty *fp) { input_crlf_ty *this; this = (input_crlf_ty *)fp; trace(("input_crlf::tell => %ld\n", this->pos)); return this->pos; } static const char * name(input_ty *p) { input_crlf_ty *this; trace(("input_crlf::name\n")); this = (input_crlf_ty *)p; return input_name(this->fp); } static long length(input_ty *p) { trace(("input_crlf::length => -1\n")); return -1; } static input_vtbl_ty vtbl = { sizeof(input_crlf_ty), destruct, input_generic_read, get, itell, name, length, }; input_ty * input_crlf(input_ty *fp, int delete_on_close) { input_ty *result; input_crlf_ty *this; trace(("input_crlf(fp = %08lX)\n{\n", (long)fp)); result = input_new(&vtbl); this = (input_crlf_ty *)result; this->fp = fp; this->pos = 0; this->delete_on_close = delete_on_close; trace(("return %08lX\n", (long)result)); trace(("}\n")); return result; } fhist-1.18/common/input/crlf.h 644 0 0 170611265752627 155420ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_INPUT_CRLF_H #define COMMON_INPUT_CRLF_H #include input_ty *input_crlf(input_ty *, int); #endif /* COMMON_INPUT_CRLF_H */ fhist-1.18/common/input/file.c 644 0 0 1060611265752627 155450ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include #include #include #include #include #include typedef struct input_file_ty input_file_ty; struct input_file_ty { input_ty inherited; FILE *fp; string_ty *fn; int unlink_on_close; long pos; }; static void destruct(input_ty *p) { input_file_ty *this; this = (input_file_ty *)p; fclose_and_check(this->fp, this->fn->str_text); if (this->unlink_on_close) unlink(this->fn->str_text); str_free(this->fn); this->fp = 0; this->fn = 0; } static long iread(input_ty *p, void *data, long len) { input_file_ty *this; long result; if (len < 0) return 0; this = (input_file_ty *)p; result = fread(data, (size_t)1, (size_t)len, this->fp); if (result <= 0 && ferror(this->fp)) { sub_context_ty *scp; scp = sub_context_new(); sub_errno_set(scp); sub_var_set_string(scp, "File_Name", this->fn); fatal_intl(scp, i18n("read \"$filename\": $errno")); /* NOTREACHED */ } this->pos += result; return result; } static int get(input_ty *p) { input_file_ty *this; int c; this = (input_file_ty *)p; c = getc(this->fp); if (c == EOF && ferror(this->fp)) { sub_context_ty *scp; scp = sub_context_new(); sub_errno_set(scp); sub_var_set_string(scp, "File_Name", this->fn); fatal_intl(scp, i18n("read \"$filename\": $errno")); /* NOTREACHED */ } if (c != EOF) this->pos++; return c; } static long itell(input_ty *p) { input_file_ty *this; this = (input_file_ty *)p; return this->pos; } static const char * name(input_ty *p) { input_file_ty *this; this = (input_file_ty *)p; return this->fn->str_text; } static long length(input_ty *p) { input_file_ty *this; struct stat st; int err; this = (input_file_ty *)p; #ifdef S_IFLNK err = lstat(this->fn->str_text, &st); #else err = stat(this->fn->str_text, &st); #endif if (err < 0) { sub_context_ty *scp; scp = sub_context_new(); sub_errno_set(scp); sub_var_set_string(scp, "File_Name", this->fn); fatal_intl(scp, i18n("stat \"$filename\": $errno")); /* NOTREACHED */ } return st.st_size; } static input_vtbl_ty vtbl = { sizeof(input_file_ty), destruct, iread, get, itell, name, length, }; input_ty * input_file_open(const char *fn) { input_ty *result; input_file_ty *this; if (!fn || !*fn) return input_stdin(); result = input_new(&vtbl); this = (input_file_ty *)result; this->fp = fopen_and_check(fn, "rb"); this->fn = str_from_c(fn); this->unlink_on_close = 0; this->pos = 0; return result; } void input_file_unlink_on_close(input_ty *fp) { input_file_ty *this; if (fp->vptr != &vtbl) return; this = (input_file_ty *)fp; this->unlink_on_close = 1; } fhist-1.18/common/input/file.h 644 0 0 205411265752627 155300ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2000, 2002, 2004, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_INPUT_FILE_H #define COMMON_INPUT_FILE_H #include #include #include input_ty *input_file_open(const char *); void input_file_unlink_on_close(input_ty *); #endif /* COMMON_INPUT_FILE_H */ fhist-1.18/common/input/file_text.c 644 0 0 174211265752627 165720ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include input_ty * input_file_text_open(const char *fn) { return input_crlf(input_file_open(fn), 1); } fhist-1.18/common/input/file_text.h 644 0 0 173411265752627 166000ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_INPUT_FILE_TEXT_H #define COMMON_INPUT_FILE_TEXT_H #include input_ty *input_file_text_open(const char *); #endif /* COMMON_INPUT_FILE_TEXT_H */ fhist-1.18/common/input/hexify.c 644 0 0 737511265752627 161130ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include /* for sprintf */ #include #include #include #include typedef struct input_hexify_ty input_hexify_ty; struct input_hexify_ty { input_ty inherited; input_ty *deeper; int delete_on_close; int buf_pos; char buffer[16]; }; static void destruct(input_ty *p) { input_hexify_ty *this; trace(("input_hexify::destruct()\n{\n")); this = (input_hexify_ty *)p; input_pushback_transfer(this->deeper, p); if (this->delete_on_close) input_delete(this->deeper); this->deeper = 0; /* paranoia */ trace(("}\n")); } static int get(input_ty *p) { input_hexify_ty *this; int c; trace(("input_hexify::get()\n{\n")); this = (input_hexify_ty *)p; if (this->buffer[this->buf_pos] == 0) { char *ctrl = ""; char *meta = ""; int c2; c = input_getc(this->deeper); if (c < 0) { trace(("return EOF;\n")); return -1; } c2 = c; if (c2 & 0x80) { meta = "M-"; c2 &= 0x7F; } if (!isprint(c2)) { ctrl = "^"; c2 ^= 0x40; } sprintf(this->buffer, "0x%02X %s%s%c\n", c, meta, ctrl, c2); this->buf_pos = 0; } c = this->buffer[this->buf_pos++]; trace(("return %d;\n", c)); trace(("}\n")); return c; } static long itell(input_ty *fp) { input_hexify_ty *this; this = (input_hexify_ty *)fp; trace(("input_hexify::tell => %ld\n", this->buf_pos)); return input_ftell(this->deeper); } static const char * name(input_ty *p) { input_hexify_ty *this; trace(("input_hexify::name\n")); this = (input_hexify_ty *)p; return input_name(this->deeper); } static long length(input_ty *p) { trace(("input_hexify::length => -1\n")); return -1; } static input_vtbl_ty vtbl = { sizeof(input_hexify_ty), destruct, input_generic_read, get, itell, name, length, }; input_ty * input_hexify(input_ty *deeper, int delete_on_close) { input_ty *result; input_hexify_ty *this; trace(("input_hexify(fp = %08lX)\n{\n", (long)deeper)); result = input_new(&vtbl); this = (input_hexify_ty *)result; this->deeper = deeper; this->delete_on_close = delete_on_close; this->buf_pos = 0; this->buffer[0] = 0; trace(("return %08lX\n", (long)result)); trace(("}\n")); return result; } fhist-1.18/common/input/hexify.h 644 0 0 171611265752627 161110ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_INPUT_HEXIFY_H #define COMMON_INPUT_HEXIFY_H #include input_ty *input_hexify(input_ty *, int); #endif /* COMMON_INPUT_HEXIFY_H */ fhist-1.18/common/input/private.c 644 0 0 264011265752627 162570ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include input_ty * input_new(input_vtbl_ty *vptr) { input_ty *result; result = mem_alloc(vptr->size); result->vptr = vptr; result->pushback_buf = 0; result->pushback_len = 0; result->pushback_max = 0; return result; } long input_generic_read(input_ty *fp, void *data_v, long len) { char *data; long result; int c; data = data_v; for (result = 0; result < len; ++result) { c = fp->vptr->get(fp); if (c < 0) break; *data++ = c; } return result; } fhist-1.18/common/input/private.h 644 0 0 206711265752627 162670ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_INPUT_PRIVATE_H #define COMMON_INPUT_PRIVATE_H #include input_ty *input_new(input_vtbl_ty *); long input_generic_read(input_ty *, void *, long); void input_pushback_transfer(input_ty *, input_ty *); #endif /* COMMON_INPUT_PRIVATE_H */ fhist-1.18/common/input/pushba_trans.c 644 0 0 203611265752627 172750ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include void input_pushback_transfer(input_ty *to, input_ty *from) { int j; for (j = 0; j < from->pushback_len; ++j) input_ungetc(to, from->pushback_buf[j]); from->pushback_len = 0; } fhist-1.18/common/input/quotprinenco.c 644 0 0 1447511265752627 173640ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include typedef struct input_quoted_printable_encode_ty input_quoted_printable_encode_ty; struct input_quoted_printable_encode_ty { input_ty inherited; input_ty *fp; int state; int c1; int column; int delete_on_close; }; static void destruct(input_ty *p) { input_quoted_printable_encode_ty *this; trace(("input_quoted_printable_encode::destruct()\n{\n")); this = (input_quoted_printable_encode_ty *)p; input_pushback_transfer(this->fp, p); if (this->delete_on_close) input_delete(this->fp); this->fp = 0; /* paranoia */ trace(("}\n")); } static int hex(int n) { return "0123456789ABCDEF"[n & 15]; } static int get(input_ty *p) { input_quoted_printable_encode_ty *this; int c; trace(("input_quoted_printable_encode::get()\n{\n")); this = (input_quoted_printable_encode_ty *)p; switch (this->state) { case 1: /* * we have given half of a '=' '\n' sequence. * Give the secoind byte, and resume normal */ c = '\n'; this->column = 0; this->state = 0; break; case 3: /* * we have seen end of file without a newline * we have sent '=', now send '\n' */ c = '\n'; this->state = 4; break; case 4: /* * we have seen end of file */ c = -1; break; case 5: /* * we have seen a newline * following end of file does NOT need a '=' '\n' sequence */ c = input_getc(this->fp); if (c < 0) { this->state = 4; break; } this->state = 0; goto normal; case 6: /* * we have seen an unprintable character * we have sent the '=' synbol * now send the first hex byte */ c = hex(this->c1 >> 4); this->state = 7; break; case 7: /* * we have seen an unprintable character * we have sent the '=' synbol * we have sent the first hex byte * now send the second hex byte * and the resume normal processing */ c = hex(this->c1); this->state = 0; break; default: /* * Normal processing. * Actually case 0, but this cobvers a multitude of sins. */ if (this->column >= 500) { c = '='; this->state = 1; break; } c = input_getc(this->fp); if (c < 0) { this->state = 3; this->column = 0; c = '='; break; } normal: if (c == '\n') { this->column = 0; this->state = 5; break; } if (c == '\t') { this->column = (this->column + 8) & 7; break; } if (c == 0 || c == '=' || c == '\r') { this->column += 3; this->c1 = c; this->state = 6; c = '='; break; } this->column++; break; } trace(("}\n")); return c; } static long itell(input_ty *fp) { input_quoted_printable_encode_ty *this; this = (input_quoted_printable_encode_ty *)fp; return input_ftell(this->fp); } static const char * name(input_ty *p) { input_quoted_printable_encode_ty *this; trace(("input_quoted_printable_encode::name\n")); this = (input_quoted_printable_encode_ty *)p; return input_name(this->fp); } static long length(input_ty *p) { trace(("input_quoted_printable_encode::length => -1\n")); return -1; } static input_vtbl_ty vtbl = { sizeof(input_quoted_printable_encode_ty), destruct, input_generic_read, get, itell, name, length, }; input_ty * input_quoted_printable_encode(input_ty *fp, int delete_on_close) { input_ty *result; input_quoted_printable_encode_ty *this; trace(("input_quoted_printable_encode(fp = %08lX)\n{\n", (long)fp)); result = input_new(&vtbl); this = (input_quoted_printable_encode_ty *)result; this->fp = fp; this->column = 0; this->state = 0; this->c1 = 0; this->delete_on_close = delete_on_close; trace(("return %08lX\n", (long)result)); trace(("}\n")); return result; } fhist-1.18/common/input/quotprinenco.h 644 0 0 176111265752627 173430ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_INPUT_QUOTPRINENCO_H #define COMMON_INPUT_QUOTPRINENCO_H #include input_ty *input_quoted_printable_encode(input_ty *, int); #endif /* COMMON_INPUT_QUOTPRINENCO_H */ fhist-1.18/common/input/stdin.c 644 0 0 560211265752627 157270ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2000, 2002, 2004, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include #include #include static string_ty * standard_input(void) { static string_ty *name; sub_context_ty *scp; if (!name) { scp = sub_context_new(); name = subst_intl(scp, i18n("standard input")); sub_context_delete(scp); } return name; } static void destruct(input_ty *this) { } static long iread(input_ty *this, void *data, long len) { long result; if (len <= 0) return 0; result = fread(data, 1, len, stdin); if (result <= 0 && ferror(stdin)) { sub_context_ty *scp; scp = sub_context_new(); sub_errno_set(scp); sub_var_set_string(scp, "File_Name", standard_input()); fatal_intl(scp, i18n("read \"$filename\": $errno")); /* NOTREACHED */ } return result; } static int get(input_ty *this) { int c; c = getchar(); if (c == EOF && ferror(stdin)) { sub_context_ty *scp; scp = sub_context_new(); sub_errno_set(scp); sub_var_set_string(scp, "File_Name", standard_input()); fatal_intl(scp, i18n("read \"$filename\": $errno")); /* NOTREACHED */ } return c; } static long itell(input_ty *this) { return ftell(stdin); } static const char * name(input_ty *this) { return standard_input()->str_text; } static long length(input_ty *this) { struct stat st; if (fstat(fileno(stdin), &st) < 0) return -1; if (!S_ISREG(st.st_mode)) return -1; return st.st_size; } static input_vtbl_ty vtbl = { sizeof(input_ty), destruct, iread, get, itell, name, length, }; input_ty * input_stdin(void) { return input_new(&vtbl); } fhist-1.18/common/input/stdin.h 644 0 0 167711265752627 157440ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_INPUT_STDIN_H #define COMMON_INPUT_STDIN_H #include input_ty *input_stdin(void); #endif /* COMMON_INPUT_STDIN_H */ fhist-1.18/common/isdir.c 644 0 0 213511265752627 145570ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1999, 2002, 2004, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include /* * Determine if an argument is a directory. * Returns 1 if so, or 0 if non-existent or not. */ int isdir(const char *pathname) { struct stat buf; if (stat(pathname, &buf) < 0) return 0; return S_ISDIR(buf.st_mode); } fhist-1.18/common/isdir.h 644 0 0 165011265752627 145650ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1999, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_ISDIR_H #define COMMON_ISDIR_H #include int isdir(const char *); #endif /* COMMON_ISDIR_H */ fhist-1.18/common/language.c 644 0 0 1102311265752627 152440ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2004, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include #include #include #include #include enum state_ty { state_uninitialized, state_C, state_human }; typedef enum state_ty state_ty; static state_ty state; /* * NAME * language_init - initialize language functions * * DESCRIPTION * The language_init function must be called at the start of the * program, to set the various locale features. * * This function must be called after the setuid initialization. * If you forget to call me, all bets are off. */ void language_init(void) { const char *lib; const char *package; if (state != state_uninitialized) return; state = state_C; /* * Default the error message language to English if not set. * Since we expect to be using GNU Gettext, only set the LANGUAGE * environment variable. */ if (!getenv("LANGUAGE") && !getenv("LANG")) env_set("LANGUAGE", "en"); /* * Set the locale to the default (as defined by the environment * variables) and set the message domain information. */ package = progname_get(); #ifdef DEBUG if (!package || !*package) fatal_raw("you must call progname_set before language_init (bug)"); #endif lib = getenv("FHIST_MESSAGE_LIBRARY"); if (!lib || !*lib) lib = configured_nlsdir(); #ifdef HAVE_SETLOCALE #ifdef HAVE_GETTEXT setlocale(LC_ALL, ""); bindtextdomain(package, lib); textdomain(package); #endif /* HAVE_GETTEXT */ /* * set the main body of the program use use the C locale */ setlocale(LC_ALL, "C"); #endif /* HAVE_SETLOCALE */ } /* * NAME * language_human - set for human conversation * * DESCRIPTION * The language_human function must be called to change the general * mode over to the default locale (usually dictated by the LANG * environment variable, et al). * * The language_human and language_C functions MUST bracket human * interactions, otherwise the mostly-english C locale will be * used. The default locale through-out the program is otherwise * assumed to be C. */ void language_human(void) { #ifdef DEBUG switch (state) { case state_uninitialized: fatal_raw("you must call language_init() in main (bug)"); case state_human: fatal_raw("unbalanced language_human() call (bug)"); case state_C: break; } #endif state = state_human; #ifdef HAVE_SETLOCALE #ifdef HAVE_GETTEXT /* * only need to flap the locale about like this * if we are using the gettext function */ setlocale(LC_ALL, ""); #endif /* HAVE_GETTEXT */ #endif /* HAVE_SETLOCALE */ } /* * NAME * language_C - set for program conversation * * DESCRIPTION * The language_C function must be called to restore the locale to * C, so that all the non-human stuff will work. * * The language_human and language_C functions MUST bracket human * interactions, otherwise the mostly-english C locale will be * used. The default locale through-out the program is otherwise * assumed to be C. */ void language_C(void) { #ifdef DEBUG switch (state) { case state_uninitialized: fatal_raw("you must call language_init() in main (bug)"); case state_C: fatal_raw("unbalanced language_C() call (bug)"); case state_human: break; } #endif state = state_C; #ifdef HAVE_SETLOCALE #ifdef HAVE_GETTEXT /* * only need to flap the locale about like this * if we are using the gettext function */ setlocale(LC_ALL, "C"); #endif /* HAVE_GETTEXT */ #endif /* HAVE_SETLOCALE */ } fhist-1.18/common/language.h 644 0 0 174411265752627 152420ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_LANGUAGE_H #define COMMON_LANGUAGE_H #include void language_init(void); void language_human(void); void language_C(void); #endif /* COMMON_LANGUAGE_H */ fhist-1.18/common/libdir.c 644 0 0 213711265752627 147140ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2004, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include <../etc/libdir-h> #include const char * configured_libdir(void) { return LIBDIR; } const char * configured_datadir(void) { return DATADIR; } const char * configured_mandir(void) { return MANDIR; } const char * configured_nlsdir(void) { return NLSDIR; } fhist-1.18/common/libdir.h 644 0 0 205511265752627 147200ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2004, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_LIBDIR_H #define COMMON_LIBDIR_H #include const char *configured_libdir(void); const char *configured_datadir(void); const char *configured_mandir(void); const char *configured_nlsdir(void); #endif /* COMMON_LIBDIR_H */ fhist-1.18/common/main.h 644 0 0 230711265752627 143770ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1991-1994, 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef MAIN_H #define MAIN_H /* * Function attributes. */ #ifdef __GNUC__ #define ATTR_NORETURN __attribute__((noreturn)) #else #define ATTR_NORETURN #endif /* * array sizes */ #define SIZEOF(a) (sizeof(a) / sizeof(a[0])) #define ENDOF(a) ((a) + SIZEOF(a)) /* * take this define out of comments for debugging functionality * to be turned on. * / #define DEBUG */ #endif /* MAIN_H */ fhist-1.18/common/mem.c 644 0 0 621311265752627 142240ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include #include #include /* * NAME * memory_error - diagnostic * * SYNOPSIS * void memory_error(void); * * DESCRIPTION * The memory_error function is used to report fatal problems with the * memory allocator. * * RETURNS * The memory_error function does not return. */ static void memory_error(void) { #ifdef DEBUG nerror_raw("memory allocator"); abort(); #else nfatal_raw("memory allocator"); #endif } /* * NAME * mem_alloc - allocate and clear memory * * SYNOPSIS * char *mem_alloc(size_t n); * * DESCRIPTION * Mem_alloc uses malloc to allocate the required sized chunk of memory. * If any error is returned from malloc() an fatal diagnostic is issued. * The memory is zeroed befor it is returned. * * CAVEAT * It is the responsibility of the caller to ensure that the space is * freed when finished with, by a call to free(). */ void * mem_alloc(size_t n) { void *p; if (n < 1) n = 1; errno = ENOMEM; p = malloc(n); if (!p) memory_error(); return p; } /* * NAME * mem_alloc_clear - allocate and clear memory * * SYNOPSIS * char *mem_alloc_clear(size_t n); * * DESCRIPTION * Mem_alloc_clear uses malloc to allocate the required sized * chunk of memory. If any error is returned from malloc() an * fatal diagnostic is issued. The memory is zeroed befor it is * returned. * * CAVEAT * It is the responsibility of the caller to ensure that the space is * freed when finished with, by a call to free(). */ void * mem_alloc_clear(size_t n) { void *p; p = mem_alloc(n); memset(p, 0, n); return p; } void * mem_change_size(void *p, size_t n) { if (n < 1) n = 1; errno = ENOMEM; if (!p) p = malloc(n); else p = realloc(p, n); if (!p) memory_error(); return p; } void mem_free(void *p) { free(p); } char * mem_copy_string(const char *s) { char *cp; cp = mem_alloc(strlen(s) + 1); strcpy(cp, s); return cp; } fhist-1.18/common/mem.h 644 0 0 205411265752627 142300ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef MEM_H #define MEM_H #include #include void *mem_alloc(size_t); void *mem_alloc_clear(size_t); void *mem_change_size(void *, size_t); void mem_free(void *); char *mem_copy_string(const char *); #endif /* MEM_H */ fhist-1.18/common/mprintf.c 644 0 0 6255511265752627 151600ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1991-1994, 1998, 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include #include #include #include /* * size to grow memory by */ #define QUANTUM 200 /* * maximum width for numbers */ #define MAX_WIDTH (QUANTUM - 1) /* * the buffer for storing results */ static size_t tmplen; static size_t length; static char *tmp; /* * NAME * bigger - grow dynamic memory buffer * * SYNOPSIS * int bigger(void); * * DESCRIPTION * The bigger function is used to grow the dynamic memory buffer * used by vmprintf to store the formatting results. * The buffer is increased by QUANTUM bytes. * * RETURNS * int; zero if failed to realloc memory, non-zero if successful. * * CAVEATS * The existing buffer is still valid after failure. */ static int bigger(void) { char *hold; size_t nbytes; nbytes = tmplen + QUANTUM; errno = 0; hold = realloc(tmp, nbytes); if (!hold) { if (!errno) errno = ENOMEM; return 0; } tmplen = nbytes; tmp = hold; return 1; } /* * NAME * build fake - construct formatting specifier string * * SYNOPSIS * void build_fake(char *fake, int flag, int width, int prec, int qual, * int spec); * * DESCRIPTION * The build_fake function is used to construct a format * specification string from the arguments presented. This is * used to guarantee exact replication of sprintf behaviour. * * ARGUMENTS * fake - buffer to store results * flag - the flag specified (zero if not) * width - the width specified (zero if not) * prec - the precision specified (zero if not) * qual - the qualifier specified (zero if not) * spec - the formatting specifier specified */ static void build_fake(char *fake, int flag, int width, int precision, int qualifier, int specifier) { char *fp; fp = fake; *fp++ = '%'; if (flag) *fp++ = flag; if (width > 0) { sprintf(fp, "%d", width); fp += strlen(fp); } *fp++ = '.'; sprintf(fp, "%d", precision); fp += strlen(fp); if (qualifier) *fp++ = qualifier; *fp++ = specifier; *fp = 0; } /* * NAME * vmprintf_errok - build a formatted string in dynamic memory * * SYNOPSIS * char *vmprintf_errok(char *fmt, va_list ap); * * DESCRIPTION * The vmprintf_errok function is used to build a formatted string * in memory. It understands all of the ANSI standard sprintf * formatting directives. Additionally, "%S" may be used to * manipulate (string_ty *) strings. * * ARGUMENTS * fmt - string specifying formatting to perform * ap - arguments of types as indicated by the format string * * RETURNS * char *; pointer to buffer containing formatted string * NULL if there is an error (sets errno) * * CAVEATS * The contents of the buffer pointed to will change between calls * to vmprintf_errok. The buffer itself may move between calls to * vmprintf_errok. DO NOT hand the result of vmprintf_errok to * free(). */ char * vmprintf_errok(const char *fmt, va_list ap) { int width; int width_set; int prec; int prec_set; int c; const char *s; int qualifier; int flag; char fake[QUANTUM - 1]; /* * Build the result string in a temporary buffer. * Grow the temporary buffer as necessary. * * It is important to only make one pass across the variable argument * list. Behaviour is undefined for more than one pass. */ if (!tmplen) { tmplen = 500; errno = 0; tmp = malloc(tmplen); if (!tmp) { if (!errno) errno = ENOMEM; return 0; } } length = 0; s = fmt; while (*s) { c = *s++; if (c != '%') { normal: if (length >= tmplen && !bigger()) return 0; tmp[length++] = c; continue; } c = *s++; /* * get optional flag */ switch (c) { case '+': case '-': case '#': case '0': case ' ': flag = c; c = *s++; break; default: flag = 0; break; } /* * get optional width */ width = 0; width_set = 0; switch (c) { case '*': width = va_arg(ap, int); if (width < 0) { flag = '-'; width = -width; } c = *s++; width_set = 1; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': for (;;) { width = width * 10 + c - '0'; c = *s++; switch (c) { default: break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': continue; } break; } width_set = 1; break; default: break; } /* * get optional precision */ prec = 0; prec_set = 0; if (c == '.') { c = *s++; switch (c) { default: prec_set = 1; break; case '*': c = *s++; prec = va_arg(ap, int); if (prec < 0) { prec = 0; break; } prec_set = 1; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': for (;;) { prec = prec * 10 + c - '0'; c = *s++; switch (c) { default: break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': continue; } break; } prec_set = 1; break; } } /* * get the optional qualifier */ switch (c) { default: qualifier = 0; break; case 'l': case 'h': case 'L': qualifier = c; c = *s++; break; } /* * get conversion specifier */ switch (c) { default: errno = EINVAL; return 0; case '%': goto normal; case 'c': { int a; char num[MAX_WIDTH + 1]; size_t len; a = (unsigned char)va_arg(ap, int); if (!prec_set) prec = 1; if (width > MAX_WIDTH) width = MAX_WIDTH; if (prec > MAX_WIDTH) prec = MAX_WIDTH; build_fake(fake, flag, width, prec, 0, c); sprintf(num, fake, a); len = strlen(num); assert(len < QUANTUM); if (length + len > tmplen && !bigger()) return 0; memcpy(tmp + length, num, len); length += len; } break; case 'd': case 'i': { long a; char num[MAX_WIDTH + 1]; size_t len; switch (qualifier) { case 'l': a = va_arg(ap, long); break; case 'h': a = (short)va_arg(ap, int); break; default: a = va_arg(ap, int); break; } if (!prec_set) prec = 1; if (width > MAX_WIDTH) width = MAX_WIDTH; if (prec > MAX_WIDTH) prec = MAX_WIDTH; build_fake(fake, flag, width, prec, 'l', c); sprintf(num, fake, a); len = strlen(num); assert(len < QUANTUM); if (length + len > tmplen && !bigger()) return 0; memcpy(tmp + length, num, len); length += len; } break; case 'e': case 'f': case 'g': case 'E': case 'F': case 'G': { double a; char num[MAX_WIDTH + 1]; size_t len; /* * Ignore "long double" for now, * traditional implementations no grok. */ a = va_arg(ap, double); if (!prec_set) prec = 6; if (width > MAX_WIDTH) width = MAX_WIDTH; if (prec > MAX_WIDTH) prec = MAX_WIDTH; build_fake(fake, flag, width, prec, 0, c); sprintf(num, fake, a); len = strlen(num); assert(len < QUANTUM); if (length + len > tmplen && !bigger()) return 0; memcpy(tmp + length, num, len); length += len; } break; case 'n': switch (qualifier) { case 'l': { long *a; a = va_arg(ap, long *); *a = length; } break; case 'h': { short *a; a = va_arg(ap, short *); *a = length; } break; default: { int *a; a = va_arg(ap, int *); *a = length; } break; } break; case 'u': case 'o': case 'x': case 'X': { unsigned long a; char num[MAX_WIDTH + 1]; size_t len; switch (qualifier) { case 'l': a = va_arg(ap, unsigned long); break; case 'h': a = (unsigned short)va_arg(ap, unsigned int); break; default: a = va_arg(ap, unsigned int); break; } if (!prec_set) prec = 1; if (prec > MAX_WIDTH) prec = MAX_WIDTH; if (width > MAX_WIDTH) width = MAX_WIDTH; build_fake(fake, flag, width, prec, 'l', c); sprintf(num, fake, a); len = strlen(num); assert(len < QUANTUM); if (length + len > tmplen && !bigger()) return 0; memcpy(tmp + length, num, len); length += len; } break; case 's': { char *a; size_t len; a = va_arg(ap, char *); if (prec_set) { char *ep; ep = (char *)memchr(a, 0, prec); if (ep) len = ep - a; else len = prec; } else len = strlen(a); if (!prec_set || len < prec) prec = len; if (!width_set || width < prec) width = prec; len = width; while (length + len > tmplen) { if (!bigger()) return 0; } if (flag != '-') { while (width > prec) { tmp[length++] = ' '; width--; } } memcpy(tmp + length, a, prec); length += prec; width -= prec; if (flag == '-') { while (width > 0) { tmp[length++] = ' '; width--; } } } break; case 'S': { string_ty *a; size_t len; a = va_arg(ap, string_ty *); len = a->str_length; if (!prec_set) prec = len; if (len < prec) prec = len; if (!width_set) width = prec; if (width < prec) width = prec; len = width; while (length + len > tmplen) { if (!bigger()) return 0; } if (flag != '-') { while (width > prec) { tmp[length++] = ' '; width--; } } memcpy(tmp + length, a->str_text, prec); length += prec; width -= prec; if (flag == '-') { while (width > 0) { tmp[length++] = ' '; width--; } } } break; } } /* * append a trailing NUL */ if (length >= tmplen && !bigger()) return 0; tmp[length] = 0; /* * return the temporary string */ return tmp; } /* * NAME * mprintf_errok - build a formatted string in dynamic memory * * SYNOPSIS * char *mprintf_errok(char *fmt, ...); * * DESCRIPTION * The mprintf_errok function is used to build a formatted string * in memory. It understands all of the ANSI standard sprintf * formatting directives. Additionally, "%S" may be used to * manipulate (string_ty *) strings. * * ARGUMENTS * fmt - string spefiifying formatting to perform * ... - arguments of types as indicated by the format string * * RETURNS * char *; pointer to buffer containing formatted string * NULL if there is an error (sets errno) * * CAVEATS * The contents of the buffer pointed to will change between calls * to mprintf_errok. The buffer itself may move between calls to * mprintf_errok. DO NOT hand the result of mprintf_errok to * free(). */ char * mprintf_errok(const char *fmt, ...) { char *result; va_list ap; va_start(ap, fmt); result = vmprintf_errok(fmt, ap); va_end(ap); return result; } /* * NAME * vmprintf - build a formatted string in dynamic memory * * SYNOPSIS * char *vmprintf(char *fmt, va_list ap); * * DESCRIPTION * The vmprintf function is used to build a formatted string in memory. * It understands all of the ANSI standard sprintf formatting directives. * Additionally, "%S" may be used to manipulate (string_ty *) strings. * * ARGUMENTS * fmt - string spefiifying formatting to perform * ap - arguments of types as indicated by the format string * * RETURNS * char *; pointer to buffer containing formatted string * * CAVEATS * On error, prints a fatal error message and exists; does not return. * * The contents of the buffer pointed to will change between calls * to vmprintf. The buffer itself may move between calls to vmprintf. * DO NOT hand the result of vmprintf to free(). */ char * vmprintf(const char *fmt, va_list ap) { char *result; result = vmprintf(fmt, ap); if (!result) nfatal_raw("mprintf \"%s\"", fmt); return result; } /* * NAME * mprintf - build a formatted string in dynamic memory * * SYNOPSIS * char *mprintf(char *fmt, ...); * * DESCRIPTION * The mprintf function is used to build a formatted string in memory. * It understands all of the ANSI standard sprintf formatting directives. * Additionally, "%S" may be used to manipulate (string_ty *) strings. * * ARGUMENTS * fmt - string spefiifying formatting to perform * ... - arguments of types as indicated by the format string * * RETURNS * char *; pointer to buffer containing formatted string * * CAVEATS * On error, prints a fatal error message and exists; does not return. * * The contents of the buffer pointed to will change between calls * to mprintf. The buffer itself may move between calls to mprintf. * DO NOT hand the result of mprintfe to free(). */ char * mprintf(const char *fmt, ...) { char *result; va_list ap; va_start(ap, fmt); result = vmprintf(fmt, ap); va_end(ap); return result; } /* * NAME * vmprintf_str - build a formatted string in dynamic memory * * SYNOPSIS * char *vmprintf_str(char *fmt, va_list ap); * * DESCRIPTION * The vmprintf_str function is used to build a formatted string in memory. * It understands all of the ANSI standard sprintf formatting directives. * Additionally, "%S" may be used to manipulate (string_ty *) strings. * * ARGUMENTS * fmt - string spefiifying formatting to perform * ap - arguments of types as indicated by the format string * * RETURNS * string_ty *; string containing formatted string * * CAVEATS * On error, prints a fatal error message and exists; does not return. * * It is the resposnsibility of the caller to invoke str_free to release * the results when finished with. */ string_ty * vmprintf_str(const char *fmt, va_list ap) { if (!vmprintf_errok(fmt, ap)) nfatal_raw("mprintf \"%s\"", fmt); return str_n_from_c(tmp, length); } fhist-1.18/common/mprintf.h 644 0 0 234011265752627 151270ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1994, 1998, 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_MPRINTF_H #define COMMON_MPRINTF_H #include #include #include char *mprintf(const char *fmt, ...) ATTRIBUTE_FORMAT_1_2; char *mprintf_errok(const char *fmt, ...) ATTRIBUTE_FORMAT_1_2; char *vmprintf(const char *fmt, va_list); char *vmprintf_errok(const char *fmt, va_list); struct string_ty *vmprintf_str(const char *fmt, va_list); #endif /* COMMON_MPRINTF_H */ fhist-1.18/common/output.c 644 0 0 751611265752627 150150ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include /* for assert */ #include #include #include #include #include void output_delete(output_ty *fp) { trace(("output_delete(fp = %08lX)\n{\ntype is output_%s\n", (long)fp, fp->vptr->typename)); if (fp->vptr->destructor) fp->vptr->destructor(fp); mem_free(fp); trace(("}\n")); } #ifdef output_filename #undef output_filename #endif const char * output_filename(output_ty *fp) { const char *result; trace(("output_filename(fp = %08lX)\n{\ntype is output_%s\n", (long)fp, fp->vptr->typename)); assert(fp->vptr->filename); result = fp->vptr->filename(fp); trace(("return \"%s\"\n", result)); trace(("}\n")); return result; } #ifdef output_ftell #undef output_ftell #endif long output_ftell(output_ty *fp) { long result; trace(("output_ftell(fp = %08lX)\n{\ntype is output_%s\n", (long)fp, fp->vptr->typename)); assert(fp->vptr->ftell); result = fp->vptr->ftell(fp); trace(("return %ld;\n", result)); trace(("}\n")); return result; } #ifdef output_fputc #undef output_fputc #endif void output_fputc(output_ty *fp, int c) { trace(("output_fputc(fp = %08lX, c = %d)\n{\ntype is output_%s\n", (long)fp, c, fp->vptr->typename)); assert(fp->vptr->fputc); fp->vptr->fputc(fp, c); trace(("}\n")); } #ifdef output_fputs #undef output_fputs #endif void output_fputs(output_ty *fp, const char *s) { trace(("output_fputs(fp = %08lX, s = \"%s\")\n{\ntype is output_%s\n", (long)fp, s, fp->vptr->typename)); assert(fp->vptr->fputs); fp->vptr->fputs(fp, s); trace(("}\n")); } #ifdef output_write #undef output_write #endif void output_write(output_ty *fp, const void *data, size_t len) { trace(("output_write(fp = %08lX, data = %08lX, len = %ld)\n\ {\ntype is output_%s\n", (long)fp, (long)data, (long)len, fp->vptr->typename)); assert(fp->vptr->write); fp->vptr->write(fp, data, len); trace(("}\n")); } #ifdef output_flush #undef output_flush #endif void output_flush(output_ty *fp) { trace(("output_flusg(fp = %08lX)\n{\ntype is output_%s\n", (long)fp, fp->vptr->typename)); assert(fp->vptr->flush); fp->vptr->flush(fp); trace(("}\n")); } void output_fprintf(output_ty *fp, const char *fmt, ...) { va_list ap; va_start(ap, fmt); output_vfprintf(fp, fmt, ap); va_end(ap); } void output_vfprintf(output_ty *fp, const char *fmt, va_list ap) { char *tmp; tmp = mem_copy_string(vmprintf(fmt, ap)); assert(fp->vptr->fputs); fp->vptr->fputs(fp, tmp); mem_free(tmp); } void output_put_str(output_ty *fp, string_ty *s) { if (!s || !s->str_length) return; output_write(fp, s->str_text, s->str_length); } fhist-1.18/common/output.h 644 0 0 643111265752627 150150ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef LIBAEGIS_OUTPUT_H #define LIBAEGIS_OUTPUT_H #include #include #include #include struct string_ty; /* existence */ struct output_ty; typedef struct output_ty output_ty; struct output_ty { struct output_vtbl_ty *vptr; }; /* * This structure is not to be used by clients of this API. It is only * present to permit macro optimization of the interface. */ typedef struct output_vtbl_ty output_vtbl_ty; struct output_vtbl_ty { int size; void (*destructor)(output_ty *); const char *(*filename)(output_ty *); long (*ftell)(output_ty *); void (*fputc)(output_ty *, int); void (*fputs)(output_ty *, const char *); void (*write)(output_ty *, const void *, size_t); void (*flush)(output_ty *); /* * By putting this last, we catch many cases where a method * pointer has been left out. */ const char *typename; }; void output_delete(output_ty *); const char *output_filename(output_ty *); long output_ftell(output_ty *); void output_fputc(output_ty *, int); void output_fputs(output_ty *, const char *); void output_put_str(output_ty *, struct string_ty *); void output_write(output_ty *, const void *, size_t); void output_flush(output_ty *); void output_fprintf(output_ty *, const char *, ...) ATTRIBUTE_FORMAT_2_3; void output_vfprintf(output_ty *, const char *, va_list); #ifndef DEBUG #ifdef __GNUC__ extern __inline const char *output_filename(output_ty *fp) { return fp->vptr->filename(fp); } extern __inline long output_ftell(output_ty *fp) { return fp->vptr->ftell(fp); } extern __inline void output_fputc(output_ty *fp, int c) { fp->vptr->fputc(fp, c); } extern __inline void output_fputs(output_ty *fp, const char *s) { fp->vptr->fputs(fp, s); } extern __inline void output_write(output_ty *fp, const void *data, size_t len) { fp->vptr->write(fp, data, len); } extern __inline void output_flush(output_ty *fp) { fp->vptr->flush(fp); } #else /* !__GNUC__ */ #define output_filename(fp) ((fp)->vptr->filename(fp)) #define output_ftell(fp) ((fp)->vptr->ftell(fp)) #define output_fputc(fp, c) ((fp)->vptr->fputc((fp), (c))) #define output_fputs(fp, s) ((fp)->vptr->fputs((fp), (s))) #define output_write(fp, data, len) ((fp)->vptr->write((fp), (data), (len))) #define output_flush(fp) ((fp)->vptr->flush(fp)) #endif /* __GNUC__ */ #endif /* DEBUG */ #endif /* LIBAEGIS_OUTPUT_H */ fhist-1.18/common/output/file.c 644 0 0 760711265752627 157350ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include #include #include #include #include typedef struct output_file_ty output_file_ty; struct output_file_ty { output_ty inherited; char *filename; FILE *deeper; }; static void destructor(output_ty *fp) { output_file_ty *this; this = (output_file_ty *)fp; fflush_and_check(this->deeper, this->filename); fclose_and_check(this->deeper, this->filename); mem_free(this->filename); } static const char * filename(output_ty *fp) { output_file_ty *this; this = (output_file_ty *)fp; return this->filename; } static long otell(output_ty *fp) { output_file_ty *this; this = (output_file_ty *)fp; return ftell(this->deeper); } static void oputc(output_ty *fp, int c) { output_file_ty *this; this = (output_file_ty *)fp; if (putc(c, this->deeper) == EOF) { sub_context_ty *scp; scp = sub_context_new(); sub_errno_set(scp); sub_var_set_charstar(scp, "File_Name", this->filename); fatal_intl(scp, i18n("write \"$filename\": $errno")); /* NOTREACHED */ } } static void owrite(output_ty *fp, const void *data, size_t len) { output_file_ty *this; this = (output_file_ty *)fp; if (fwrite(data, 1, len, this->deeper) == EOF) { sub_context_ty *scp; scp = sub_context_new(); sub_errno_set(scp); sub_var_set_charstar(scp, "File_Name", this->filename); fatal_intl(scp, i18n("write \"$filename\": $errno")); /* NOTREACHED */ } } static void oflush(output_ty *fp) { output_file_ty *this; this = (output_file_ty *)fp; if (fflush(this->deeper)) { sub_context_ty *scp; scp = sub_context_new(); sub_errno_set(scp); sub_var_set_charstar(scp, "File_Name", this->filename); fatal_intl(scp, i18n("write \"$filename\": $errno")); /* NOTREACHED */ } } static output_vtbl_ty vtbl = { sizeof(output_file_ty), destructor, filename, otell, oputc, output_generic_fputs, owrite, oflush, "file", }; static output_ty * output_file_open(const char *fn, const char *mode) { output_ty *result; output_file_ty *this; if (!fn || !*fn) return output_stdout(); result = output_new(&vtbl); this = (output_file_ty *)result; this->deeper = fopen_and_check(fn, mode); this->filename = mem_copy_string(fn); return result; } output_ty * output_file_text_open(const char *fn) { return output_file_open(fn, "w"); } output_ty * output_file_binary_open(const char *fn) { return output_file_open(fn, "wb"); } fhist-1.18/common/output/file.h 644 0 0 201311265752627 157240ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef LIBAEGIS_OUTPUT_FILE_H #define LIBAEGIS_OUTPUT_FILE_H #include output_ty *output_file_text_open(const char *); output_ty *output_file_binary_open(const char *); #endif /* LIBAEGIS_OUTPUT_FILE_H */ fhist-1.18/common/output/private.c 644 0 0 267311265752627 164660ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2000-2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include /* for assert */ #include #include output_ty * output_new(output_vtbl_ty *vptr) { output_ty *this; assert(vptr->size > sizeof(output_ty)); this = mem_alloc(vptr->size); this->vptr = vptr; return this; } void output_generic_fputs(output_ty *fp, const char *s) { fp->vptr->write(fp, s, strlen(s)); } void output_generic_write(output_ty *fp, const void *data, size_t len) { const unsigned char *p; p = data; while (len > 0) { fp->vptr->fputc(fp, *p++); --len; } } void output_generic_flush(output_ty *fp) { } fhist-1.18/common/output/private.h 644 0 0 237011265752627 164650ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef LIBAEGIS_OUTPUT_PRIVATE_H #define LIBAEGIS_OUTPUT_PRIVATE_H #include output_ty *output_new(output_vtbl_ty *); long output_generic_ftell(output_ty *); void output_generic_fputs(output_ty *, const char *); void output_generic_write(output_ty *, const void *, size_t); void output_generic_flush(output_ty *); int output_generic_page_width(output_ty *); int output_generic_page_length(output_ty *); #endif /* LIBAEGIS_OUTPUT_PRIVATE_H */ fhist-1.18/common/output/quotprindeco.c 644 0 0 1134211265752627 175410ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include typedef struct output_quoted_printable_decode_ty output_quoted_printable_decode_ty; struct output_quoted_printable_decode_ty { output_ty inherited; output_ty *deeper; int delete_on_delete; int state; int c1; int n1; }; static void destructor(output_ty *fp) { output_quoted_printable_decode_ty *this; this = (output_quoted_printable_decode_ty *)fp; switch (this->state) { case 1: output_fputc(this->deeper, '='); break; case 2: output_fputc(this->deeper, '='); output_fputc(this->deeper, this->c1); break; } this->state = 0; output_flush(this->deeper); if (this->delete_on_delete) output_delete(this->deeper); this->deeper = 0; } static const char * filename(output_ty *fp) { output_quoted_printable_decode_ty *this; this = (output_quoted_printable_decode_ty *)fp; return output_filename(this->deeper); } static long otell(output_ty *fp) { output_quoted_printable_decode_ty *this; this = (output_quoted_printable_decode_ty *)fp; return output_ftell(this->deeper); } static int unhex(int c) { switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return (c - '0'); case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': return (c - 'a' + 10); case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': return (c - 'A' + 10); } return -1; } static void oputc(output_ty *fp, int c) { output_quoted_printable_decode_ty *this; int n; this = (output_quoted_printable_decode_ty *)fp; switch (this->state) { case 0: state0: if (c == '=') { this->state = 1; break; } output_fputc(this->deeper, c); break; case 1: if (c == '\n') { this->state = 0; break; } n = unhex(c); if (n >= 0) { this->n1 = n; this->c1 = c; this->state = 2; break; } output_fputc(this->deeper, '='); this->state = 0; goto state0; case 2: this->state = 0; n = unhex(c); if (n >= 0) { output_fputc(this->deeper, (this->n1 << 4) + n); break; } output_fputc(this->deeper, '='); output_fputc(this->deeper, this->c1); goto state0; } } static void oflush(output_ty *fp) { output_quoted_printable_decode_ty *this; this = (output_quoted_printable_decode_ty *)fp; output_flush(this->deeper); } static output_vtbl_ty vtbl = { sizeof(output_quoted_printable_decode_ty), destructor, filename, otell, oputc, output_generic_fputs, output_generic_write, oflush, "quoted_printable_decode", }; output_ty * output_quoted_printable_decode(output_ty *deeper, int dod) { output_ty *result; output_quoted_printable_decode_ty *this; result = output_new(&vtbl); this = (output_quoted_printable_decode_ty *)result; this->deeper = deeper; this->delete_on_delete = dod; this->state = 0; return result; } fhist-1.18/common/output/quotprindeco.h 644 0 0 177011265752627 175320ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_OUTPUT_QUOTPRINDECO_H #define COMMON_OUTPUT_QUOTPRINDECO_H #include output_ty *output_quoted_printable_decode(output_ty *, int); #endif /* COMMON_OUTPUT_QUOTPRINDECO_H */ fhist-1.18/common/output/stdout.c 644 0 0 633411265752627 163340ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2000, 2002, 2004, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include #include #include #include #include typedef struct output_stdout_ty output_stdout_ty; struct output_stdout_ty { output_ty inherited; }; static const char * standard_output(void) { const char *name; name = "standard output"; return name; } static void destructor(output_ty *this) { fflush_and_check(stdout, standard_output()); } static const char * filename(output_ty *this) { return standard_output(); } static long otell(output_ty *this) { return ftell(stdout); } static void oputc(output_ty *fp, int c) { output_stdout_ty *this; this = (output_stdout_ty *)fp; if (putchar(c) == EOF) { sub_context_ty *scp; scp = sub_context_new(); sub_errno_set(scp); sub_var_set_charstar(scp, "File_Name", standard_output()); fatal_intl(scp, i18n("write \"$filename\": $errno")); /* NOTREACHED */ } } static void owrite(output_ty *fp, const void *data, size_t len) { output_stdout_ty *this; this = (output_stdout_ty *)fp; if (fwrite(data, 1, len, stdout) == EOF) { sub_context_ty *scp; scp = sub_context_new(); sub_errno_set(scp); sub_var_set_charstar(scp, "File_Name", standard_output()); fatal_intl(scp, i18n("write \"$filename\": $errno")); /* NOTREACHED */ } } static void oflush(output_ty *this) { if (fflush(stdout)) { sub_context_ty *scp; scp = sub_context_new(); sub_errno_set(scp); sub_var_set_charstar(scp, "File_Name", standard_output()); fatal_intl(scp, i18n("write \"$filename\": $errno")); /* NOTREACHED */ } } static output_vtbl_ty vtbl = { sizeof(output_stdout_ty), destructor, filename, otell, oputc, output_generic_fputs, owrite, oflush, "stdout", }; output_ty * output_stdout(void) { output_ty *result; output_stdout_ty *this; result = output_new(&vtbl); this = (output_stdout_ty *)result; return result; } fhist-1.18/common/output/stdout.h 644 0 0 171511265752627 163370ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef LIBAEGIS_OUTPUT_STDOUT_H #define LIBAEGIS_OUTPUT_STDOUT_H #include output_ty *output_stdout(void); #endif /* LIBAEGIS_OUTPUT_STDOUT_H */ fhist-1.18/common/page.c 644 0 0 1324611265752627 144060ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include #include #define MIN_PAGE_WIDTH 40 /* MAX_PAGE_WIDTH is defined in common/page.h */ #define DEFAULT_PAGE_WIDTH 80 #define MIN_PAGE_LENGTH 10 #define MAX_PAGE_LENGTH 30000 #define DEFAULT_PAGE_LENGTH 24 static int page_length; static int page_width; static void default_page_sizes(void) { if (!page_width) { char *cp; cp = getenv("COLS"); if (cp) { int n; n = atoi(cp); if (n > 0) { if (n < MIN_PAGE_WIDTH) n = MIN_PAGE_WIDTH; if (n > MAX_PAGE_WIDTH) n = MAX_PAGE_WIDTH; page_width = n; } } } if (!page_length) { char *cp; cp = getenv("LINES"); if (cp) { int n; n = atoi(cp); if (n > 0) { if (n < MIN_PAGE_LENGTH) n = MIN_PAGE_LENGTH; if (n > MAX_PAGE_LENGTH) n = MAX_PAGE_LENGTH; page_length = n; } } } #ifdef TIOCGWINSZ if (!page_width || !page_length) { struct winsize ws; if (ioctl(0, TIOCGWINSZ, &ws) == 0) { if (!page_width && ws.ws_col > 0) { page_width = ws.ws_col; if (page_width < MIN_PAGE_WIDTH) page_width = MIN_PAGE_WIDTH; if (page_width > MAX_PAGE_WIDTH) page_width = MAX_PAGE_WIDTH; } if (!page_length && ws.ws_row > 0) { page_length = ws.ws_row; if (page_length < MIN_PAGE_LENGTH) page_length = MIN_PAGE_LENGTH; if (page_length > MAX_PAGE_LENGTH) page_length = MAX_PAGE_LENGTH; } } } #endif if (!page_width) page_width = DEFAULT_PAGE_WIDTH; if (!page_length) page_length = DEFAULT_PAGE_LENGTH; } #if 0 void page_width_set(int n) { sub_context_ty *scp; if (page_width) { scp = sub_context_new(); sub_var_set ( scp, "Name", "%s", arglex_token_name(arglex_token_page_width) ); fatal_intl(scp, i18n("duplicate \"$name\" option")); /* NOTREACHED */ } if (n < MIN_PAGE_WIDTH || n > MAX_PAGE_WIDTH) { scp = sub_context_new(); sub_var_set(scp, "Number", "%d", n); fatal_intl(scp, i18n("page width $number out of range")); /* NOTREACHED */ } page_width = n; } #endif int page_width_get(void) { /* * must not generate a fatal error in this function, * as it is used by 'error.c' when reporting fatal errors. * * must not put tracing in this function, * because 'trace.c' uses it to determine the width. */ if (!page_width) default_page_sizes(); return page_width; } #if 0 void page_length_set(int n) { sub_context_ty *scp; if (page_length) { scp = sub_context_new(); sub_var_set ( scp, "Name", "%s", arglex_token_name(arglex_token_page_length) ); fatal_intl(scp, i18n("duplicate \"$name\" option")); /* NOTREACHED */ } if (n < MIN_PAGE_LENGTH || n > MAX_PAGE_LENGTH) { scp = sub_context_new(); sub_var_set(scp, "Number", "%d", n); fatal_intl(scp, i18n("page length $number out of range")); /* NOTREACHED */ } page_length = n; } #endif int page_length_get(void) { if (!page_length) default_page_sizes(); return page_length; } fhist-1.18/common/page.h 644 0 0 202311265752627 143620ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_PAGE_H #define COMMON_PAGE_H #include #define MAX_PAGE_WIDTH 2000 void page_width_set(int); int page_width_get(void); void page_length_set(int); int page_length_get(void); #endif /* COMMON_PAGE_H */ fhist-1.18/common/pager.c 644 0 0 1366411265752627 145740ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1992-1994, 1998-2000, 2002, 2004, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include #include #include #include #include #include #include #include #include static FILE *out; static char *pager; static int pid; /* * this stuff is to tell if we are in the background */ #ifdef SIGSTOP #ifndef HAVE_TCGETPGRP #include int tcgetpgrp(int fd) { int result; #ifdef TIOCGETPGRP if (ioctl(fd, TIOCGETPGRP, &result)) result = -1; #else #ifdef TIOCGPGRP if (ioctl(fd, TIOCGPGRP, &result)) result = -1; #else result = -1; #endif #endif return result; } #endif /* !HAVE_TCGETPGRP */ #endif /* SIGSTOP */ /* * NAME * background - test for backgroundness * * SYNOPSIS * int background(void); * * DESCRIPTION * The background function is used to determin e if the curent process is * in the background. * * RETURNS * int: zero if process is not in the background, nonzero if the process * is in the background. * * CAVEAT: * This function has a huge chance of being wrong for your system. * If you need to modify this function, please let the author know. */ static int background(void) { RETSIGTYPE (*x)(int); /* * C shell * puts its children in a different process group. * The process group the terminal in is the forground. * * Only available on systems with job control. */ #ifdef SIGSTOP if (getpgrp(CONF_getpgrp_arg) != tcgetpgrp(0)) return 1; #endif /* * Bourne shell * sets its children to ignore SIGINT */ x = signal(SIGINT, SIG_IGN); if (x == SIG_IGN) return 1; signal(SIGINT, x); /* * probably forground */ return 0; } static FILE * pipe_open(char *prog) { FILE *fp; int fd[2]; char *cmd[4]; sub_context_ty *scp; fp = 0; if (pipe(fd)) { scp = sub_context_new(); sub_errno_set(scp); fatal_intl(scp, i18n("pipe(): $errno")); /* NOTREACHED */ sub_context_delete(scp); } switch (pid = fork()) { case 0: cmd[0] = "sh"; cmd[1] = "-c"; cmd[2] = prog; cmd[3] = 0; close(fd[1]); close(0); if (dup(fd[0]) != 0) { fatal_intl(0, i18n("dup was wrong")); } close(fd[0]); execvp(cmd[0], cmd); scp = sub_context_new(); sub_errno_set(scp); sub_var_set_charstar(scp, "File_Name", prog); fatal_intl(scp, i18n("exec \"$filename\": $errno")); /* NOTREACHED */ sub_context_delete(scp); case -1: scp = sub_context_new(); sub_errno_set(scp); error_intl(scp, i18n("fork(): $errno")); sub_context_delete(scp); fp = 0; break; default: close(fd[0]); fp = fdopen(fd[1], "w"); if (!fp) { scp = sub_context_new(); sub_errno_set(scp); fatal_intl(scp, i18n("fdopen: $errno")); /* NOTREACHED */ sub_context_delete(scp); } break; } return fp; } static void pipe_close(FILE *fp) { int status; int n; fclose(fp); for (;;) { n = wait(&status); if (n < 0 || n == pid) break; } pid = 0; } #ifdef HAVE_ATEXIT static void cleanup(void) { if (!out) return; /* * write the last of the output */ fflush(out); /* * close the paginator */ if (pager) { pipe_close(out); pager = 0; } out = 0; } #endif /* HAVE_ATEXIT */ FILE * pager_open(void) { /* assert(!out); */ /* * if talking to a terminal, * send the output through a paginator */ if (!background() && isatty(0) && isatty(1)) { pager = getenv("PAGER"); if (!pager || !*pager) pager = "more"; } else pager = 0; #ifdef HAVE_ATEXIT /* * register the cleanup function in case of fatal errors */ atexit(cleanup); #endif /* * open the paginator */ if (pager) { out = pipe_open(pager); if (!out) { pager = 0; out = stdout; } } else out = stdout; return out; } void pager_close(FILE *fp) { /* assert(out); */ /* assert(fp == out); */ /* * write the last of the output */ fflush(out); if (ferror(out)) pager_error(out); /* * close the paginator */ if (pager) { pipe_close(out); pager = 0; } out = 0; } void pager_error(FILE *fp) { sub_context_ty *scp; /* assert(out); */ /* assert(fp == out); */ scp = sub_context_new(); sub_errno_set(scp); if (pager) sub_var_set_charstar(scp, "File_Name", pager); else sub_var_set_charstar(scp, "File_Name", gettext("standard input")); fatal_intl(scp, i18n("write \"$filename\": $errno")); /* NOTREACHED */ sub_context_delete(scp); } fhist-1.18/common/pager.h 644 0 0 174711265752627 145600ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1992-1994, 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef PAGER_H #define PAGER_H #include #include FILE *pager_open(void); void pager_close(FILE *); void pager_error(FILE *); #endif /* PAGER_H */ fhist-1.18/common/patchlevel.h 644 0 0 24411265752627 155600ustar PeterMiller 0 0#define PATCHLEVEL "1.18.D001" #define COPYRIGHT_YEARS "1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009" fhist-1.18/common/progname.c 644 0 0 346111265752627 152600ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include static char *progname; void progname_set(char *s) { /* * do NOT put tracing in this function * do NOT put asserts in this function * they both depend on progname, which is not yet set */ for (;;) { progname = strrchr(s, '/'); /* * we were invoked as * progname -args */ if (!progname) { progname = s; break; } /* * we were invoked as * /usr/local/progname -args */ if (progname[1]) { ++progname; break; } /* * this is real nasty: * it is possible to invoke us as * /usr//local///bin////progname///// -args * and it is legal!! */ *progname = 0; } } char * progname_get(void) { /* do NOT put tracing in this function */ return (progname ? progname : ""); } fhist-1.18/common/progname.h 644 0 0 171511265752627 152650ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_PROGNAME_H #define COMMON_PROGNAME_H #include void progname_set(char *); char *progname_get(void); #endif /* COMMON_PROGNAME_H */ fhist-1.18/common/quit.c 644 0 0 165211265752627 144320ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include void quit(int x) { if (x != 0) undo(); exit(x); } fhist-1.18/common/quit.h 644 0 0 212311265752627 144310ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_QUIT_H #define COMMON_QUIT_H #include /** * The quit function is used to exit the program. It shall be used in * preference to the exit() function, because this allows cleanup * actions to take place. */ void quit(int) ATTR_NORETURN; #endif /* COMMON_QUIT_H */ fhist-1.18/common/str.c 644 0 0 3523211265752627 143010ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1991-1994, 1998-2002, 2006, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . * * * A literal pool is maintained. Each string has a reference count. The * string stays in the literal pool for as long as it has a positive * reference count. To determine if a string is already in the literal pool, * linear dynamic hashing is used to guarantee an O(1) search. Making all equal * strings the same item in the literal pool means that string equality is * a pointer test, and thus very fast. */ #include #include #include #include #include #include #include #include #include #include /* * maximum conversion width for numbers */ #define MAX_WIDTH 509 static string_ty **hash_table; static str_hash_ty hash_modulus; static str_hash_ty hash_mask; static str_hash_ty hash_load; #define MAX_HASH_LEN 20 #define is_power_of_two(x) ((x) == ((x) & -(x))) /* * NAME * hash_generate - hash string to number * * SYNOPSIS * str_hash_ty hash_generate(char *s, size_t n); * * DESCRIPTION * The hash_generate function is used to make a number from a string. * * RETURNS * str_hash_ty - the magic number * * CAVEAT * Only the last MAX_HASH_LEN characters are used. * It is important that str_hash_ty be unsigned (int or long). */ static str_hash_ty hash_generate(const char *s, size_t n) { str_hash_ty retval; if (n > MAX_HASH_LEN) { s += n - MAX_HASH_LEN; n = MAX_HASH_LEN; } retval = 0; while (n > 0) { retval = (retval + (retval << 1)) ^ *s++; --n; } return retval; } /* * NAME * str_initialize - start up string table * * SYNOPSIS * void str_initialize(void); * * DESCRIPTION * The str_initialize function is used to create the hash table and * initialize it to empty. * * RETURNS * void * * CAVEAT * This function must be called before any other defined in this file. */ void str_initialize(void) { str_hash_ty j; if (hash_table) return; hash_modulus = 1 << 8; /* MUST be a power of 2 */ hash_mask = hash_modulus - 1; hash_load = 0; hash_table = (string_ty **)mem_alloc(hash_modulus * sizeof(string_ty *)); for (j = 0; j < hash_modulus; ++j) hash_table[j] = 0; assert(is_power_of_two(hash_modulus)); } /* * NAME * split - reduce table loading * * SYNOPSIS * void split(void); * * DESCRIPTION * The split function is used to reduce the load factor on the hash table. * * RETURNS * void * * CAVEAT * A load factor of about 80% is suggested. */ static void split(void) { string_ty **new_hash_table; str_hash_ty new_hash_modulus; str_hash_ty new_hash_mask; str_hash_ty idx; /* * double the modulus * * This is subtle. If we only increase the modulus by one, the load * always hovers around 80%, so we have to do a split for every * insert. I.e. the malloc burden os O(n) for the lifetime of the * program. BUT if we double the modulus, the length of time until * the next split also doubles, making the probablity of a split * halve, and sigma(2**-n)=1, so the malloc burden becomes O(1) for * the lifetime of the program. */ assert(is_power_of_two(hash_modulus)); new_hash_modulus = hash_modulus * 2; new_hash_mask = new_hash_modulus - 1; new_hash_table = mem_alloc(new_hash_modulus * sizeof(string_ty *)); /* * now redistribute the list elements */ for (idx = 0; idx < hash_modulus; ++idx) { string_ty *p; new_hash_table[idx] = 0; new_hash_table[idx + hash_modulus] = 0; p = hash_table[idx]; while (p) { string_ty *p2; str_hash_ty new_idx; p2 = p; p = p->str_next; assert((p2->str_hash & hash_mask) == idx); new_idx = p2->str_hash & new_hash_mask; p2->str_next = new_hash_table[new_idx]; new_hash_table[new_idx] = p2; } } mem_free(hash_table); hash_table = new_hash_table; hash_modulus = new_hash_modulus; hash_mask = new_hash_mask; } /* * NAME * str_from_c - make string from C string * * SYNOPSIS * string_ty *str_from_c(char*); * * DESCRIPTION * The str_from_c function is used to make a string from a null terminated * C string. * * RETURNS * string_ty* - a pointer to a string in dynamic memory. Use str_free when * finished with. * * CAVEAT * The contents of the structure pointed to MUST NOT be altered. */ string_ty * str_from_c(const char *s) { return str_n_from_c(s, strlen(s)); } /* * NAME * str_n_from_c - make string * * SYNOPSIS * string_ty *str_n_from_c(char *s, size_t n); * * DESCRIPTION * The str_n_from_c function is used to make a string from an array of * characters. No null terminator is assumed. * * RETURNS * string_ty* - a pointer to a string in dynamic memory. Use str_free when * finished with. * * CAVEAT * The contents of the structure pointed to MUST NOT be altered. */ string_ty * str_n_from_c(const char *s, size_t length) { str_hash_ty hash; str_hash_ty idx; string_ty *p; hash = hash_generate(s, length); if (!hash_table) str_initialize(); idx = hash & hash_mask; for (p = hash_table[idx]; p; p = p->str_next) { if ( p->str_hash == hash && p->str_length == length && !memcmp(p->str_text, s, length) ) { p->str_references++; return p; } } p = (string_ty *) mem_alloc(sizeof(string_ty) + length); p->str_hash = hash; p->str_length = length; p->str_references = 1; p->str_next = hash_table[idx]; hash_table[idx] = p; memcpy(p->str_text, s, length); p->str_text[length] = 0; hash_load++; if (hash_load * 10 > hash_modulus * 8) split(); return p; } /* * NAME * str_copy - make a copy of a string * * SYNOPSIS * string_ty *str_copy(string_ty *s); * * DESCRIPTION * The str_copy function is used to make a copy of a string. * * RETURNS * string_ty* - a pointer to a string in dynamic memory. Use str_free when * finished with. * * CAVEAT * The contents of the structure pointed to MUST NOT be altered. */ string_ty * str_copy(string_ty *s) { s->str_references++; return s; } /* * NAME * str_free - release a string * * SYNOPSIS * void str_free(string_ty *s); * * DESCRIPTION * The str_free function is used to indicate that a string hash been * finished with. * * RETURNS * void * * CAVEAT * This is the only way to release strings DO NOT use the free function. */ void str_free(string_ty *s) { str_hash_ty idx; string_ty **spp; if (!s) return; if (s->str_references > 1) { s->str_references--; return; } /* * find the hash bucket it was in, * and remove it */ idx = s->str_hash & hash_mask; for (spp = &hash_table[idx]; *spp; spp = &(*spp)->str_next) { if (*spp == s) { *spp = s->str_next; mem_free(s); --hash_load; return; } } /* * should never reach here! */ fatal_raw("attempted to free non-existent string (bug)"); } /* * NAME * str_catenate - join two strings * * SYNOPSIS * string_ty *str_catenate(string_ty *, string_ty *); * * DESCRIPTION * The str_catenate function is used to concatenate two strings to form a * new string. * * RETURNS * string_ty* - a pointer to a string in dynamic memory. Use str_free when * finished with. * * CAVEAT * The contents of the structure pointed to MUST NOT be altered. */ string_ty * str_catenate(string_ty *s1, string_ty *s2) { static char *tmp; static size_t tmplen; string_ty *s; size_t length; length = s1->str_length + s2->str_length; if (tmplen < length) { tmplen = length; tmp = mem_change_size(tmp, tmplen); } memcpy(tmp, s1->str_text, s1->str_length); memcpy(tmp + s1->str_length, s2->str_text, s2->str_length); s = str_n_from_c(tmp, length); return s; } /* * NAME * str_cat_three - join three strings * * SYNOPSIS * string_ty *str_cat_three(string_ty *, string_ty *, string_ty *); * * DESCRIPTION * The str_cat_three function is used to concatenate three strings to form * a new string. * * RETURNS * string_ty* - a pointer to a string in dynamic memory. Use str_free when * finished with. * * CAVEAT * The contents of the structure pointed to MUST NOT be altered. */ string_ty * str_cat_three(string_ty *s1, string_ty *s2, string_ty *s3) { static char *tmp; static size_t tmplen; string_ty *s; size_t length; length = s1->str_length + s2->str_length + s3->str_length; if (tmplen < length) { tmplen = length; tmp = mem_change_size(tmp, tmplen); } memcpy(tmp, s1->str_text, s1->str_length); memcpy(tmp + s1->str_length, s2->str_text, s2->str_length); memcpy(tmp + s1->str_length + s2->str_length, s3->str_text, s3->str_length); s = str_n_from_c(tmp, length); return s; } /* * NAME * str_equal - test equality of strings * * SYNOPSIS * int str_equal(string_ty *, string_ty *); * * DESCRIPTION * The str_equal function is used to test if two strings are equal. * * RETURNS * int; zero if the strings are not equal, nonzero if the strings are * equal. * * CAVEAT * This function is implemented as a macro in strings.h */ #ifndef str_equal int str_equal(string_ty *s1, string_ty *s2) { return (s1 == s2); } #endif /* * NAME * str_upcase - upcase a string * * SYNOPSIS * string_ty *str_upcase(string_ty *); * * DESCRIPTION * The str_upcase function is used to form a string which is an upper case * form of the supplied string. * * RETURNS * string_ty* - a pointer to a string in dynamic memory. Use str_free when * finished with. * * CAVEAT * The contents of the structure pointed to MUST NOT be altered. */ string_ty * str_upcase(string_ty *s) { static char *tmp; static size_t tmplen; string_ty *retval; char *cp1; char *cp2; if (tmplen < s->str_length) { tmplen = s->str_length; tmp = mem_change_size(tmp, tmplen); } for (cp1 = s->str_text, cp2 = tmp; *cp1; ++cp1, ++cp2) { int c; c = *cp1; if (c >= 'a' && c <= 'z') c += 'A' - 'a'; *cp2 = c; } retval = str_n_from_c(tmp, s->str_length); return retval; } /* * NAME * str_downcase - lowercase string * * SYNOPSIS * string_ty *str_downcase(string_ty *); * * DESCRIPTION * The str_downcase function is used to form a string which is a lowercase * form of the supplied string. * * RETURNS * string_ty* - a pointer to a string in dynamic memory. Use str_free when * finished with. * * CAVEAT * The contents of the structure pointed to MUST NOT be altered. */ string_ty * str_downcase(string_ty *s) { static char *tmp; static size_t tmplen; string_ty *retval; char *cp1; char *cp2; if (tmplen < s->str_length) { tmplen = s->str_length; tmp = mem_change_size(tmp, tmplen); } for (cp1 = s->str_text, cp2 = tmp; *cp1; ++cp1, ++cp2) { int c; c = *cp1; if (c >= 'A' && c <= 'Z') c += 'a' - 'A'; *cp2 = c; } retval = str_n_from_c(tmp, s->str_length); return retval; } /* * NAME * str_bool - get boolean value * * SYNOPSIS * int str_bool(string_ty *s); * * DESCRIPTION * The str_bool function is used to determine the boolean value of the * given string. A "false" result is if the string is empty or * 0 or blank, and "true" otherwise. * * RETURNS * int: zero to indicate a "false" result, nonzero to indicate a "true" * result. */ int str_bool(string_ty *s) { char *cp; cp = s->str_text; while (*cp) { if (!isspace((unsigned char)*cp) && *cp != '0') return 1; ++cp; } return 0; } /* * NAME * str_field - extract a field from a string * * SYNOPSIS * string_ty *str_field(string_ty *, char separator, int field_number); * * DESCRIPTION * The str_field functipon is used to erxtract a field from a string. * Fields of the string are separated by ``separator'' characters. * Fields are numbered from 0. * * RETURNS * Asking for a field off the end of the string will result in a null * pointer return. The null string is considered to have one empty field. */ string_ty * str_field(string_ty *s, int sep, int fldnum) { char *cp; char *ep; cp = s->str_text; while (fldnum > 0) { ep = strchr(cp, sep); if (!ep) return 0; cp = ep + 1; --fldnum; } ep = strchr(cp, sep); if (ep) return str_n_from_c(cp, ep - cp); return str_from_c(cp); } void slow_to_fast(char **in, string_ty **out, size_t length) { size_t j; if (out[0]) return; for (j = 0; j < length; ++j) out[j] = str_from_c(in[j]); } string_ty * str_format(const char *fmt, ...) { va_list ap; string_ty *result; va_start(ap, fmt); result = vmprintf_str(fmt, ap); va_end(ap); return result; } string_ty * str_vformat(const char *fmt, va_list ap) { return vmprintf_str(fmt, ap); } fhist-1.18/common/str.h 644 0 0 362711265752627 142710ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1991-1994, 1998, 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_STR_H #define COMMON_STR_H #include #include #include #include typedef unsigned long str_hash_ty; typedef struct string_ty string_ty; struct string_ty { str_hash_ty str_hash; string_ty *str_next; long str_references; size_t str_length; char str_text[1]; }; void str_initialize(void); string_ty *str_from_c(const char *); string_ty *str_n_from_c(const char *, size_t); string_ty *str_copy(string_ty *); void str_free(string_ty *); string_ty *str_catenate(string_ty *, string_ty *); string_ty *str_cat_three(string_ty *, string_ty *, string_ty *); int str_bool(string_ty *); string_ty *str_upcase(string_ty *); string_ty *str_downcase(string_ty *); void str_dump(void); string_ty *str_field(string_ty *str, int sep, int fldnum); void slow_to_fast(char **, string_ty **, size_t); string_ty *str_format(const char *, ...) ATTRIBUTE_FORMAT_1_2; string_ty *str_vformat(const char *, va_list); #define str_equal(s1, s2) ((s1) == (s2)) #endif /* COMMON_STR_H */ fhist-1.18/common/str_list.c 644 0 0 3315711265752627 153400ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2001, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . * * This file contains routines for mainpulating words and word lists. * Much of the functionality of cook uses these routines. */ #include #include #include #include #include #include #include #include /* * NAME * string_list_append - append to a word list * * SYNOPSIS * void string_list_append(string_list_ty *wlp, string_ty *wp); * * DESCRIPTION * Wl_append is used to append to a word list. * * CAVEAT * The word being appended IS copied. */ void string_list_append(string_list_ty *wlp, string_ty *w) { /* assert(wlp); */ /* assert(w); */ if (wlp->nstrings >= wlp->nstrings_max) { size_t nbytes; wlp->nstrings_max = wlp->nstrings_max * 2 + 16; nbytes = wlp->nstrings_max * sizeof(string_ty *); wlp->string = mem_change_size(wlp->string, nbytes); } wlp->string[wlp->nstrings++] = str_copy(w); } /* * NAME * string_list_append_list * * SYNOPSIS * void string_list_append_list(string_list_ty *to, string_list_ty *from); * * DESCRIPTION * The string_list_append_list function is used to append one * string list (from) onto the end of another (to). */ void string_list_append_list(string_list_ty *to, const string_list_ty *from) { size_t j; for (j = 0; j < from->nstrings; ++j) string_list_append(to, from->string[j]); } /* * NAME * string_list_prepend * * SYNOPSIS * void string_list_prepend(string_list_ty *, string_ty *); * * DESCRIPTION * The string_list_prepend function is used to insert a string at * the beginning of a string list. */ void string_list_prepend(string_list_ty *wlp, string_ty *w) { ptrdiff_t j; /* assert(wlp); */ /* assert(w); */ if (wlp->nstrings >= wlp->nstrings_max) { size_t nbytes; wlp->nstrings_max = wlp->nstrings_max * 2 + 16; nbytes = wlp->nstrings_max * sizeof(string_ty *); wlp->string = mem_change_size(wlp->string, nbytes); } wlp->nstrings++; for (j = wlp->nstrings - 1; j > 0; --j) wlp->string[j] = wlp->string[j - 1]; wlp->string[0] = str_copy(w); } /* * NAME * string_list_destructor - free a word list * * SYNOPSIS * void string_list_destructor(string_list_ty *wlp); * * DESCRIPTION * Wl_free is used to free the contents of a word list * when it is finished with. * * CAVEAT * It is assumed that the contents of the word list were all * created using strdup() or similar, and grown using string_list_append(). */ void string_list_destructor(string_list_ty *wlp) { size_t j; for (j = 0; j < wlp->nstrings; j++) str_free(wlp->string[j]); if (wlp->string) mem_free(wlp->string); wlp->nstrings = 0; wlp->nstrings_max = 0; wlp->string = 0; } /* * NAME * string_list_member - word list membership * * SYNOPSIS * int string_list_member(string_list_ty *wlp, string_ty *wp); * * DESCRIPTION * Wl_member is used to determine if the given word is * contained in the given word list. * * RETURNS * A zero if the word is not in the list, * and a non-zero if it is. */ int string_list_member(const string_list_ty *wlp, string_ty *w) { size_t j; for (j = 0; j < wlp->nstrings; j++) if (str_equal(wlp->string[j], w)) return 1; return 0; } /* * NAME * string_list_intersect - word list intersection test * * SYNOPSIS * int string_list_intersect(string_list_ty *wlp, string_list_ty *wp); * * DESCRIPTION * Wl_intersect is used to determine if the given word is * contained in the given word list. * * RETURNS * A zero if the word is not in the list, * and a non-zero if it is. */ int string_list_intersect(const string_list_ty *wl1, const string_list_ty *wl2) { size_t j; if (wl1->nstrings > wl2->nstrings) { for (j = 0; j < wl2->nstrings; j++) if (string_list_member(wl1, wl2->string[j])) return 1; } else { for (j = 0; j < wl1->nstrings; j++) if (string_list_member(wl2, wl1->string[j])) return 1; } return 0; } /* * NAME * string_list_copy_constructor - copy a word list * * SYNOPSIS * void string_list_copy_constructor(string_list_ty *to, * string_list_ty *from); * * DESCRIPTION * Wl_copy is used to copy word lists. * * RETURNS * A copy of the 'to' word list is placed in 'from'. * * CAVEAT * It is the responsibility of the caller to ensure that the * new word list is freed when finished with, by a call to * string_list_destructor(). */ void string_list_copy_constructor(string_list_ty *to, const string_list_ty *from) { size_t j; string_list_constructor(to); for (j = 0; j < from->nstrings; j++) string_list_append(to, str_copy(from->string[j])); } /* * NAME * wl2str - form a string from a word list * * SYNOPSIS * string_ty *wl2str(string_list_ty *wlp, int start, int stop, char *sep); * * DESCRIPTION * Wl2str is used to form a string from a word list. * * RETURNS * A pointer to the newly formed string in dynamic memory. * * CAVEAT * It is the responsibility of the caller to ensure that the * new string is freed when finished with, by a call to str_free(). */ string_ty * wl2str(const string_list_ty *wl, int start, int stop, char *sep) { int j; static char *tmp; static size_t tmplen; size_t length; size_t seplen; char *pos; string_ty *s; if (!sep) sep = " "; seplen = strlen(sep); length = 0; for (j = start; j <= stop && j < wl->nstrings; j++) { s = wl->string[j]; if (s->str_length) { if (length) length += seplen; length += s->str_length; } } if (tmplen < length) { tmplen = length; tmp = mem_change_size(tmp, tmplen); } pos = tmp; for (j = start; j <= stop && j < wl->nstrings; j++) { s = wl->string[j]; if (s->str_length) { if (pos != tmp) { memcpy(pos, sep, seplen); pos += seplen; } memcpy(pos, s->str_text, s->str_length); pos += s->str_length; } } s = str_n_from_c(tmp, length); return s; } /* * NAME * str2wl - string to word list * * SYNOPSIS * void str2wl(string_list_ty *wlp, string_ty *s, char *sep, int ewhite); * * DESCRIPTION * Str2wl is used to form a word list from a string. * wlp - where to put the word list * s - string to break * sep - separators, default to " " if 0 given * ewhite - supress extra white space around separators * * RETURNS * The string is broken on spaces into words, * using strndup() and string_list_append(). * * CAVEAT * Quoting is not understood. */ void str2wl(string_list_ty *slp, string_ty *s, char *sep, int ewhite) { char *cp; int more; if (!sep) { sep = " \t\n\f\r"; ewhite = 1; } string_list_constructor(slp); cp = s->str_text; more = 0; while (*cp || more) { string_ty *w; char *cp1; char *cp2; if (ewhite) while (isspace((unsigned char)*cp)) cp++; if (!*cp && !more) break; more = 0; cp1 = cp; while (*cp && !strchr(sep, *cp)) cp++; if (*cp) { cp2 = cp + 1; more = 1; } else cp2 = cp; if (ewhite) while (cp > cp1 && isspace((unsigned char)cp[-1])) cp--; w = str_n_from_c(cp1, cp - cp1); string_list_append(slp, w); str_free(w); cp = cp2; } } /* * NAME * wl_insert - a insert a word into a list * * SYNOPSIS * void wl_insert(string_list_ty *wlp, string_ty *wp); * * DESCRIPTION * Wl_insert is similar to string_list_append, however it does not * append the word unless it is not already in the list. * * CAVEAT * If the word is inserted it is copied. */ void string_list_append_unique(string_list_ty *wlp, string_ty *wp) { size_t j; for (j = 0; j < wlp->nstrings; j++) if (str_equal(wlp->string[j], wp)) return; string_list_append(wlp, wp); } /* * NAME * string_list_append_list_unique * * SYNOPSIS * void string_list_append_list_unique(string_list_ty *to, * string_list_ty *from); * * DESCRIPTION * The string_list_append_list_unique function is used to append * the contents of one string list (from) to the end of another * tring list (to). Entries which duplicate items already present * will be ignored. */ void string_list_append_list_unique(string_list_ty *to, const string_list_ty *from) { size_t j; for (j = 0; j < from->nstrings; ++j) string_list_append_unique(to, from->string[j]); } /* * NAME * string_list_remove - remove list member * * SYNOPSIS * void string_list_remove(string_list_ty *wlp, string_ty *wp); * * DESCRIPTION * The string_list_remove function is used to delete a member of a * word list. * * RETURNS * void */ void string_list_remove(string_list_ty *wlp, string_ty *wp) { size_t j; size_t k; for (j = 0; j < wlp->nstrings; ++j) { if (str_equal(wlp->string[j], wp)) { wlp->nstrings--; for (k = j; k < wlp->nstrings; ++k) wlp->string[k] = wlp->string[k + 1]; str_free(wp); break; } } } /* * NAME * string_list_remove_list - remove list members * * SYNOPSIS * void string_list_remove_list(string_list_ty *wlp, string_list_ty *wp); * * DESCRIPTION * The string_list_remove_list function is used to delete all the * members of a word list from another word list. * * RETURNS * void */ void string_list_remove_list(string_list_ty *wlp, const string_list_ty *nuke) { size_t j; for (j = 0; j < nuke->nstrings; ++j) string_list_remove(wlp, nuke->string[j]); } /* * NAME * string_list_constructor * * SYNOPSIS * void string_list_constructor(string_list_ty *); * * DESCRIPTION * The string_list_constructor function is used to prepare a string * list for use. It will be empty. * * CAVEAT * This must be called on the string list before any other action * is taken. Use string_list_destructor when you are done. */ void string_list_constructor(string_list_ty *wlp) { wlp->nstrings = 0; wlp->nstrings_max = 0; wlp->string = 0; } /* * NAME * string_list_new * * DESCRIPTION * string_list_ty *string_list_new(void); * * DESCRIPTION * The string_list_new function is used to allocate a new string * list in dynamic memory. It will be empty. * * RETURNS * string_list_ty * * * CAVEAT * Use string_list_delete when you are done. */ string_list_ty * string_list_new(void) { string_list_ty *slp; slp = mem_alloc(sizeof(string_list_ty)); string_list_constructor(slp); return slp; } /* * NAME * string_list_new_copy * * SYNOPSIS * string_list_ty *string_list_new_copy(string_list_ty *); * * DESCRIPTION * The string_list_new_copy function is used to allocate a new copy * of a string list in dynamic memory. * * RETURNS * string_list_ty * * * CAVEAT * Use string_list_delete when you are done. */ string_list_ty * string_list_new_copy(const string_list_ty *from) { string_list_ty *slp; slp = mem_alloc(sizeof(string_list_ty)); string_list_copy_constructor(slp, from); return slp; } /* * NAME * string_list_delete * * SYNOPSIS * void string_list_delete(string_list_ty *); * * DESCRIPTION * The string_list_delete function is used to release the resources * held by a string list in dynamic memory. */ void string_list_delete(string_list_ty *slp) { string_list_destructor(slp); mem_free(slp); } /* * NAME * string_list_bool * * SYNOPSIS * int string_list_bool(string_list_ty *); * * DESCRIPTION * The string_list_bool function is used to perform a boolean * evaluation on a list of strings. If any return str_bool of * true, the list is true. */ int string_list_bool(const string_list_ty *slp) { size_t j; for (j = 0; j < slp->nstrings; ++j) if (str_bool(slp->string[j])) return 1; return 0; } fhist-1.18/common/str_list.h 644 0 0 417411265752627 153220ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_STR_LIST_H #define COMMON_STR_LIST_H #include typedef struct string_list_ty string_list_ty; struct string_list_ty { size_t nstrings; size_t nstrings_max; string_ty **string; }; int string_list_member(const string_list_ty *, string_ty *); int string_list_intersect(const string_list_ty *, const string_list_ty *); string_ty *wl2str(const string_list_ty *, int, int, char *); void str2wl(string_list_ty *, string_ty *, char *, int); void string_list_append(string_list_ty *, string_ty *); void string_list_append_list(string_list_ty *, const string_list_ty *); void string_list_prepend(string_list_ty *, string_ty *); void string_list_append_unique(string_list_ty *, string_ty *); void string_list_append_list_unique(string_list_ty *, const string_list_ty *); void string_list_copy_constructor(string_list_ty *, const string_list_ty *); void string_list_remove(string_list_ty *, string_ty *); void string_list_remove_list(string_list_ty *, const string_list_ty *); void string_list_destructor(string_list_ty *); void string_list_constructor(string_list_ty *); string_list_ty *string_list_new(void); string_list_ty *string_list_new_copy(const string_list_ty *); void string_list_delete(string_list_ty *); int string_list_bool(const string_list_ty *); #endif /* COMMON_STR_LIST_H */ fhist-1.18/common/sub.c 644 0 0 7343111265752627 142650ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include typedef wstring_ty *(*fp) (sub_context_ty *, wstring_list_ty *); typedef struct table_ty table_ty; struct table_ty { const char *name; fp func; int resubstitute; wstring_ty *value; int must_be_used :1; int append_if_unused :1; int override :1; }; typedef struct diversion_ty diversion_ty; struct diversion_ty { long pos; wstring_ty *text; diversion_ty *prev; int resubstitute; }; typedef struct collect_ty collect_ty; struct collect_ty { size_t pos; size_t size; wchar_t *buf; }; /* typedef struct sub_context_ty sub_context_ty; */ struct sub_context_ty { diversion_ty *diversion; table_ty *sub_var_list; size_t sub_var_size; size_t sub_var_pos; char *suberr; int errno_sequester; }; static void collect_constructor(collect_ty * cp) { cp->buf = 0; cp->size = 0; cp->pos = 0; } static void collect_destructor(collect_ty * cp) { if (cp->buf) mem_free(cp->buf); cp->buf = 0; cp->size = 0; cp->pos = 0; } /* * NAME * collect * * SYNOPSIS * void collect(collect_ty *, int c); * * DESCRIPTION * The collect function is used to accumulate a string * one character at a time. No size limit. * * ARGUMENTS * c - the character being collected */ static void collect(collect_ty *cp, wchar_t c) { if (cp->pos >= cp->size) { size_t nbytes; cp->size += (1L << 10); nbytes = cp->size * sizeof(wchar_t); cp->buf = mem_change_size(cp->buf, nbytes); } cp->buf[cp->pos++] = c; } static void collect_n(collect_ty *cp, wchar_t *s, size_t n) { while (n > 0) { collect(cp, *s++); --n; } } /* * NAME * collect_end * * SYNOPSIS * wstring_ty *collect_end(collect_ty *); * * DESCRIPTION * The collect_end function is used to fetch the string * accumulated with the collect function. * The bufferer for the collect function is cleared. * * RETURNS * wstring_ty *; pointer to the string in dynamic memory. */ static wstring_ty * collect_end(collect_ty *cp) { wstring_ty *result; result = wstr_n_from_wc(cp->buf, cp->pos); cp->pos = 0; return result; } static void sub_context_constructor(sub_context_ty *scp) { trace(("sub_context_constructor()\n{\n")); scp->diversion = 0; scp->sub_var_list = 0; scp->sub_var_size = 0; scp->sub_var_pos = 0; scp->suberr = 0; scp->errno_sequester = 0; trace(("}\n")); } sub_context_ty * sub_context_new(void) { sub_context_ty *scp; int hang_on_a_second; hang_on_a_second = errno; scp = mem_alloc(sizeof(sub_context_ty)); errno = hang_on_a_second; sub_context_constructor(scp); return scp; } static void sub_context_destructor(sub_context_ty *scp) { size_t j; for (j = 0; j < scp->sub_var_pos; ++j) wstr_free(scp->sub_var_list[j].value); if (scp->sub_var_list) mem_free(scp->sub_var_list); scp->diversion = 0; scp->sub_var_list = 0; scp->sub_var_size = 0; scp->sub_var_pos = 0; scp->suberr = 0; scp->errno_sequester = 0; } void sub_context_delete(sub_context_ty * scp) { sub_context_destructor(scp); mem_free(scp); } void sub_context_error_set(sub_context_ty * scp, char *s) { scp->suberr = s; } static table_ty table[] = { { "Basename", sub_basename }, { "DAte", sub_date }, { "Dirname", sub_dirname }, { "DownCase", sub_downcase }, { "ERrno", sub_errno }, { "EXpression", sub_expression }, /* File_Name */ /* Guess */ { "IDentifier", sub_identifier }, { "LEFt", sub_left }, { "LENgth", sub_length }, /* Name */ /* Number */ { "PLural", sub_plural }, { "PROGname", sub_progname }, { "RIght", sub_right }, { "UpCase", sub_upcase }, /* Value */ { "Zero_Pad", sub_zero_pad }, }; /* * NAME * sub_diversion * * SYNOPSIS * void sub_diversion(wstring_ty *s, int resub); * * DESCRIPTION * The sub_diversion function is used to divert input * to a string, until that string is exhausted. * When the string is exhausted, input will resume * from the previous string. * * ARGUMENTS * s - string to take as input */ static void sub_diversion(sub_context_ty *scp, wstring_ty *s, int resubstitute) { diversion_ty *dp; trace(("sub_diversion(s = %8.8lX, resub = %d)\n{\n", (long)s, resubstitute)); dp = (diversion_ty *) mem_alloc(sizeof(diversion_ty)); dp->text = wstr_copy(s); dp->pos = 0; dp->resubstitute = resubstitute; dp->prev = scp->diversion; scp->diversion = dp; trace(("}\n")); } /* * NAME * sub_diversion_close * * SYNOPSIS * void sub_diversion_close(void); * * DESCRIPTION * The sub_diversion_close function is used to * release a diversion when it has been exhausted. */ static void sub_diversion_close(sub_context_ty *scp) { diversion_ty *dp; trace(("sub_diversion_close()\n{\n")); assert(scp->diversion); dp = scp->diversion; scp->diversion = dp->prev; wstr_free(dp->text); mem_free((char *)dp); trace(("}\n")); } /* * NAME * execute * * SYNOPSIS * void execute(wstring_list_ty *args); * * DESCRIPTION * The execute function is used to perform the substitution * described by the argument list. * * ARGUMENTS * args - the name and arguments of the substitution */ static void execute(sub_context_ty *scp, wstring_list_ty *arg) { string_ty *cmd; wstring_ty *s; table_ty *hit[20]; int nhits; table_ty *tp; long j; trace(("execute(scp = %08lX, arg = %08lX)\n{\n", (long)scp, (long)arg)); if (arg->nitems == 0) { sub_context_ty *scp2; scp2 = sub_context_new(); fatal_intl(scp2, i18n("empty $${} substitution")); /* NOTREACHED */ sub_context_delete(scp2); } /* * scan the variables */ nhits = 0; cmd = wstr_to_str(arg->item[0]); trace_string(cmd->str_text); for (j = 0; j < scp->sub_var_pos; ++j) { tp = &scp->sub_var_list[j]; trace(("tp = %08lX\n", (long)tp)); trace_string(tp->name); if (arglex_compare(tp->name, cmd->str_text)) { if (nhits < SIZEOF(hit)) hit[nhits++] = tp; } } /* * scan the functions */ for (tp = table; tp < ENDOF(table); ++tp) { if (arglex_compare(tp->name, cmd->str_text)) { if (tp->override) goto override; if (nhits < SIZEOF(hit)) hit[nhits++] = tp; } } str_free(cmd); /* * figure what to do */ switch (nhits) { case 0: scp->suberr = i18n("unknown substitution name"); s = 0; break; case 1: tp = hit[0]; override: if (tp->value) { /* * flag that the variable has been used */ tp->must_be_used = 0; s = wstr_copy(tp->value); } else { wstr_free(arg->item[0]); arg->item[0] = wstr_from_c(tp->name); s = tp->func(scp, arg); } break; default: scp->suberr = i18n("ambiguous substitution name"); s = 0; break; } /* * deal with the result */ if (s) { sub_diversion(scp, s, tp->resubstitute); wstr_free(s); } else { wstring_ty *s2; string_ty *s3; sub_context_ty *scp2; char *the_error; assert(scp->suberr); s2 = wstring_list_to_wstring(arg, 0, arg->nitems, (char *)0); s3 = wstr_to_str(s2); wstr_free(s2); the_error = scp->suberr ? scp->suberr : "this is a bug"; scp2 = sub_context_new(); sub_var_set_string(scp2, "Name", s3); sub_var_set_charstar(scp2, "Message", gettext(the_error)); fatal_intl(scp2, i18n("substitution $${$name} failed: $message")); /* NOTREACHED */ sub_context_delete(scp2); str_free(s3); } trace(("}\n")); } /* * NAME * sub_getc_meta * * SYNOPSIS * void sub_getc_meta(void); * * DESCRIPTION * The sub_getc_meta function is used to get a character from * the current input string. When the current string is exhaused, * the previous string is resumed. * * RETURNS * int - the chacater, or NUL to indicate end of input */ static wchar_t sub_getc_meta(sub_context_ty *scp) { wchar_t result; diversion_ty *dp; trace(("sub_getc_meta()\n{\n")); dp = scp->diversion; if (!dp) result = 0; else if (dp->pos >= dp->text->wstr_length) result = 0; else result = dp->text->wstr_text[dp->pos++]; #ifdef DEBUG if (iswprint(result) && result >= CHAR_MIN && result <= CHAR_MAX) trace(("return '%c';\n", (char)result)); else trace(("return %4.4lX;\n", (long)result)); #endif trace(("}\n")); return result; } /* * NAME * sub_getc_meta_undo * * SYNOPSIS * void sub_getc_meta_undo(int c); * * DESCRIPTION * The sub_getc_meta_undo function is used to give back * a character output by sub_getc_meta. * * ARGUMENTS * c - character being given back * * CAVEAT * Only push back what was read. */ static void sub_getc_meta_undo(sub_context_ty *scp, wchar_t c) { diversion_ty *dp; trace(("sub_getc_meta_undo(%ld)\n{\n", (long)c)); #ifdef DEBUG if (iswprint(c) && c >= CHAR_MIN && c <= CHAR_MAX) trace(("c = '%c'\n", (char)c)); #endif dp = scp->diversion; assert(dp); if (!c) { assert(dp->pos == dp->text->wstr_length); } else { assert(dp->pos >= 1); dp->pos--; assert(c == dp->text->wstr_text[dp->pos]); } trace(("}\n")); } /* * NAME * dollar * * SYNOPSIS * wchar_t dollar(void); * * DESCRIPTION * The dollar function is used to perform dollar ($) substitutions. * On entry, the $ is expected to have been consumed. * * The substitution is usually achieved as a side-effect, * by using the sub_diversion function. * * RETURNS * wchar_t a character to deliver as output, * or NUL if none. */ static wchar_t sub_getc(sub_context_ty *); /* forward */ static wchar_t dollar(sub_context_ty *scp) { wstring_list_ty arg; int result; wchar_t c; wstring_ty *s; wchar_t quoted; collect_ty tmp; trace(("dollar()\n{\n")); collect_constructor(&tmp); wstring_list_zero(&arg); result = 0; c = sub_getc_meta(scp); switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': for (;;) { collect(&tmp, c); c = sub_getc_meta(scp); switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': continue; default: sub_getc_meta_undo(scp, c); break; } break; } s = collect_end(&tmp); trace(("push arg\n")); wstring_list_append(&arg, s); wstr_free(s); execute(scp, &arg); wstring_list_free(&arg); break; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': for (;;) { collect(&tmp, c); c = sub_getc_meta(scp); switch (c) { case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '_': case '-': continue; default: sub_getc_meta_undo(scp, c); break; } break; } s = collect_end(&tmp); trace(("push arg\n")); wstring_list_append(&arg, s); wstr_free(s); execute(scp, &arg); wstring_list_free(&arg); break; case '{': c = sub_getc(scp); for (;;) { /* * look for terminator */ if (c == '}') break; /* * watch out for unterminated substitutions */ if (!c) { sub_context_ty *scp2; scp2 = sub_context_new(); fatal_intl(scp2, i18n("unterminated $${} substitution")); /* NOTREACHED */ sub_context_delete(scp2); break; } /* * skip white space separating the arguments */ if (iswspace(c)) { c = sub_getc(scp); continue; } /* * collect the argument * any run of non-white-space characters */ quoted = 0; for (;;) { if (!c) { if (quoted) { sub_context_ty *scp2; scp2 = sub_context_new(); fatal_intl(scp2, i18n("unterminated $${} quotes")); /* NOTREACHED */ sub_context_delete(scp2); } break; } if (!quoted && (iswspace(c) || c == '}')) break; if (c == quoted) { assert(quoted); quoted = 0; } else if (c == '\'') { assert(!quoted); quoted = c; } else if (c == '\\') { c = sub_getc(scp); if (!c) { sub_context_ty *scp2; scp2 = sub_context_new(); fatal_intl(scp2, i18n("unterminated $${} \\ sequence")); /* NOTREACHED */ sub_context_delete(scp2); } collect(&tmp, c); } else collect(&tmp, c); c = sub_getc(scp); } s = collect_end(&tmp); trace(("push arg\n")); wstring_list_append(&arg, s); wstr_free(s); } execute(scp, &arg); wstring_list_free(&arg); break; case '$': result = '$'; break; default: sub_getc_meta_undo(scp, c); result = '$'; break; } collect_destructor(&tmp); #ifdef DEBUG if (iswprint(result) && result >= CHAR_MIN && result <= CHAR_MAX) trace(("return '%c';\n", (char)result)); else trace(("return %4.4lX;\n", (long)result)); #endif trace(("}\n")); return result; } /* * NAME * sub_getc * * SYNOPSIS * wchar_t sub_getc(void); * * DESCRIPTION * The sub_getc function is used to get a character from * the substitution stream. This is used both for the final output * and for fetching arguments to dollar ($) substitutions. * * RETURNS * wchar_t a character from the stream, * or NUL to indicate end of input. */ static wchar_t sub_getc(sub_context_ty *scp) { wchar_t c; trace(("sub_getc()\n{\n")); for (;;) { c = sub_getc_meta(scp); switch (c) { default: break; case 0: if (!scp->diversion) break; sub_diversion_close(scp); continue; case '$': if (!scp->diversion->resubstitute) break; c = dollar(scp); if (!c) continue; break; } break; } #ifdef DEBUG if (iswprint(c) && c >= CHAR_MIN && c <= CHAR_MAX) trace(("return '%c';\n", (char)c)); else trace(("return %4.4lX;\n", (long)c)); #endif trace(("}\n")); return c; } static wstring_ty * subst(sub_context_ty *scp, wstring_ty *s) { collect_ty buf; wchar_t c; wstring_ty *result; table_ty *tp; table_ty *the_end; int error_count; trace(("subst(scp = %08lX, s = %8.8lX)\n{\n", (long)scp, (long)s)); collect_constructor(&buf); sub_diversion(scp, s, 1); for (;;) { /* * get the next character */ c = sub_getc(scp); if (!c) break; /* * save the character */ collect(&buf, c); } /* * find any unused variables marked "append if unused" */ the_end = scp->sub_var_list + scp->sub_var_pos; for (tp = scp->sub_var_list; tp < the_end; ++tp) { if (!tp->append_if_unused) continue; if (!tp->must_be_used) continue; assert(tp->value); /* * flag that the variable has been used */ tp->must_be_used = 0; if (!tp->value->wstr_length) continue; /* * append to the buffer, separated by a space */ collect(&buf, (wchar_t) ' '); collect_n(&buf, tp->value->wstr_text, tp->value->wstr_length); } /* * find any unused variables * and complain about them */ error_count = 0; for (tp = scp->sub_var_list; tp < the_end; ++tp) { sub_context_ty *scp2; string_ty *tmp; if (!tp->must_be_used) continue; /* * Make sure the variables of this message are optional, * to avoid infinite loops if there is a mistake in the * translation string. */ scp2 = sub_context_new(); tmp = wstr_to_str(s); sub_var_set_string(scp2, "Message", tmp); sub_var_optional(scp2, "Message"); sub_var_set_format(scp2, "Name", "$%s", tp->name); sub_var_optional(scp2, "Name"); error_intl (scp2, i18n("in substitution \"$message\" variable \"$name\" unused")); sub_context_delete(scp2); str_free(tmp); ++error_count; } if (error_count > 0) { string_ty *tmp; sub_context_ty *scp2; /* * Make sure the variables of this message are optional, * to avoid infinite loops if there is a mistake in the * translation string. */ scp2 = sub_context_new(); tmp = wstr_to_str(s); sub_var_set_string(scp2, "Message", tmp); sub_var_optional(scp2, "Message"); sub_var_set_format(scp2, "Number", "%d", error_count); sub_var_optional(scp2, "Number"); fatal_intl (scp2, i18n("in substitution \"$message\" found unused variables")); /* NOTREACHED */ str_free(tmp); sub_context_delete(scp2); } /* * clear the slate, ready for the next run */ sub_var_clear(scp); result = collect_end(&buf); collect_destructor(&buf); trace(("return %8.8lX;\n", (long)result)); trace(("}\n")); return result; } wstring_ty * subst_intl_wide(sub_context_ty *scp, const char *msg) { char *tmp; wstring_ty *s; wstring_ty *result; trace(("subst_intl_wide(scp = %08lX, msg = \"%s\")\n{\n", (long)scp, msg)); language_human(); tmp = gettext(msg); language_C(); #ifdef DEBUG #ifdef HAVE_GETTEXT if (tmp == msg) error_raw("warning: message \"%s\" has no translation", msg); #endif /* HAVE_GETTEXT */ #endif /* DEBUG */ s = wstr_from_c(tmp); result = subst(scp, s); wstr_free(s); trace(("return %8.8lX;\n", (long)result)); trace(("}\n")); return result; } string_ty * subst_intl(sub_context_ty *scp, const char *s) { wstring_ty *result_wide; string_ty *result; trace(("subst_intl(scp = %08lX, s = \"%s\")\n{\n", (long)scp, s)); result_wide = subst_intl_wide(scp, s); result = wstr_to_str(result_wide); wstr_free(result_wide); trace(("return \"%s\";\n", result->str_text)); trace(("}\n")); return result; } /* * NAME * substitute * * SYNOPSIS * string_ty *substitute(string_ty *s); * * DESCRIPTION * The substitute function is used to perform substitutions on * strings. Usually command strings, but not always. * * The format of substitutions, and the commonly available * substitutions, are described in aesub(5). * * ARGUMENTS * cp - the aegis change involved with the command * This may never be NULL. * s - the string to be substituted. * * RETURNS * string_ty *; pointer to string in dynamic memory */ string_ty * substitute(sub_context_ty *scp, string_ty *s) { wstring_ty *ws; wstring_ty *result_wide; string_ty *result; assert(s); trace(("substitute(scp = %08lX, s = \"%s\")\n{\n", (long)scp, s->str_text)); ws = str_to_wstr(s); result_wide = subst(scp, ws); wstr_free(ws); result = wstr_to_str(result_wide); wstr_free(result_wide); trace(("return \"%s\";\n", result->str_text)); trace(("}\n")); return result; } /* * NAME * sub_var_clear * * SYNOPSIS * void sub_var_clear(void); * * DESCRIPTION * The sub_var_clear function is used to clear all of * the substitution variables. Not usually needed manually, * as this is done automatically at the end of every substitute(). */ void sub_var_clear(sub_context_ty *scp) { size_t j; trace(("sub_var_clear()\n{\n")); for (j = 0; j < scp->sub_var_pos; ++j) wstr_free(scp->sub_var_list[j].value); scp->sub_var_pos = 0; scp->errno_sequester = 0; trace(("}\n")); } /* * NAME * sub_var_set * * SYNOPSIS * void sub_var_set(char *name, char *fmt, ...); * * DESCRIPTION * The sub_var_set function is used to set the value of a * substitution variable. These variables are command specific, * as opposed to the functions which are always present. * The user documentation does NOT make this distinction by * using the names "variable" and "function", they are always referred * to as "substitutions". * * ARGUMENTS * name - the name of the variable * fmt,... - a format string and arguments to construct the value. * Handed to str_vformat to make a (string_ty *) out of it. * * CAVEAT * remains in scope until the next invokation of sub_var_clear, * or until the end of the next invokation of substitute. */ void sub_var_set_string(sub_context_ty *scp, const char *name, string_ty *value) { table_ty *svp; trace(("sub_var_set_string(scp = %08lX, name = \"%s\", " "value = \"%s\")\n{\n", (long)scp, name, value->str_text)); if (scp->sub_var_pos >= scp->sub_var_size) { size_t nbytes; scp->sub_var_size += 10; nbytes = scp->sub_var_size * sizeof(scp->sub_var_list[0]); scp->sub_var_list = mem_change_size(scp->sub_var_list, nbytes); } svp = &scp->sub_var_list[scp->sub_var_pos++]; svp->name = name; svp->func = 0; svp->value = str_to_wstr(value); svp->must_be_used = 1; svp->append_if_unused = 0; svp->override = 0; svp->resubstitute = !svp->must_be_used; trace(("}\n")); } void sub_var_set_format(sub_context_ty *scp, const char *name, const char *fmt, ...) { va_list ap; string_ty *s; trace(("sub_var_set_format(scp = %08lX, name = \"%s\")\n{\n", (long)scp, name)); va_start(ap, fmt); s = str_vformat(fmt, ap); va_end(ap); sub_var_set_string(scp, name, s); str_free(s); trace(("}\n")); } void sub_var_set_long(sub_context_ty *scp, const char *name, long value) { sub_var_set_format(scp, name, "%ld", value); } void sub_var_set_charstar(sub_context_ty *scp, const char *name, const char *value) { string_ty *s; trace(("sub_var_set_charstar(scp = %08lX, name = \"%s\")\n{\n", (long)scp, name)); s = str_from_c(value); sub_var_set_string(scp, name, s); str_free(s); trace(("}\n")); } void sub_var_resubstitute(sub_context_ty *scp, const char *name) { table_ty *the_end; table_ty *svp; the_end = scp->sub_var_list + scp->sub_var_pos; for (svp = scp->sub_var_list; svp < the_end; ++svp) if (!strcmp(svp->name, name)) break; assert(svp < the_end); if (svp < the_end) svp->resubstitute = 1; } void sub_var_override(sub_context_ty *scp, const char *name) { table_ty *the_end; table_ty *svp; the_end = scp->sub_var_list + scp->sub_var_pos; for (svp = scp->sub_var_list; svp < the_end; ++svp) if (!strcmp(svp->name, name)) break; assert(svp < the_end); if (svp < the_end) svp->override = 1; } void sub_var_optional(sub_context_ty *scp, const char *name) { table_ty *the_end; table_ty *svp; the_end = scp->sub_var_list + scp->sub_var_pos; for (svp = scp->sub_var_list; svp < the_end; ++svp) if (!strcmp(svp->name, name)) break; assert(svp < the_end); if (svp < the_end) svp->must_be_used = 0; } void sub_var_append_if_unused(sub_context_ty *scp, const char *name) { table_ty *the_end; table_ty *svp; the_end = scp->sub_var_list + scp->sub_var_pos; for (svp = scp->sub_var_list; svp < the_end; ++svp) if (!strcmp(svp->name, name)) break; assert(svp < the_end); if (svp < the_end) { svp->must_be_used = 1; svp->append_if_unused = 1; } } void sub_errno_setx(sub_context_ty *scp, int x) { scp->errno_sequester = x; } void sub_errno_set(sub_context_ty *scp) { sub_errno_setx(scp, errno); } int sub_context_errno_get(sub_context_ty *scp) { if (scp->errno_sequester == 0) scp->errno_sequester = errno; return scp->errno_sequester; } fhist-1.18/common/sub.h 644 0 0 415511265752627 142470ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_SUB_H #define COMMON_SUB_H #include #include struct string_ty; typedef struct sub_context_ty sub_context_ty; sub_context_ty *sub_context_new(void); void sub_context_delete(sub_context_ty *); void sub_var_clear(sub_context_ty *); void sub_var_set_format(sub_context_ty *, const char *name, const char *fmt, ...) ATTRIBUTE_FORMAT_3_4; void sub_var_set_charstar(sub_context_ty *, const char *name, const char *value); void sub_var_set_string(sub_context_ty *, const char *name, struct string_ty *value); void sub_var_set_long(sub_context_ty *, const char *name, long value); void sub_var_optional(sub_context_ty *, const char *); void sub_var_append_if_unused(sub_context_ty *, const char *); void sub_var_override(sub_context_ty *, const char *); void sub_var_resubstitute(sub_context_ty *, const char *); void sub_errno_set(sub_context_ty *); void sub_errno_setx(sub_context_ty *, int); struct string_ty *substitute(sub_context_ty *, struct string_ty *); struct string_ty *subst_intl(sub_context_ty *, const char *); struct wstring_ty *subst_intl_wide(sub_context_ty *, const char *); /* * This macro does nothing by itself, but it serves as a keyword for the * xgettext program, when extracting internationalized msgid keys. */ #define i18n(x) (x) #endif /* COMMON_SUB_H */ fhist-1.18/common/sub/basename.c 644 0 0 724611265752627 160210ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include #include static wstring_ty * entryname(wstring_ty *s) { wchar_t *start; wchar_t *finish; wchar_t *cp; wchar_t prev; start = s->wstr_text; finish = s->wstr_text; prev = '/'; cp = s->wstr_text; for (;;) { if (prev == '/') { if (*cp != '/' && *cp != 0) start = cp; } else { if (*cp == '/' || *cp == 0) finish = cp; } if (!*cp) break; prev = *cp++; } return wstr_n_from_wc(start, finish - start); } /* * NAME * sub_basename - the basename substitution * * SYNOPSIS * wstring_ty *sub_basename(wstring_list_ty *arg); * * DESCRIPTION * The sub_basename function implements the basename substitution. * The basename substitution is replaced by the basename of * the argument path, similar to the basename(1) command. * * ARGUMENTS * arg - list of arguments, including the function name as [0] * * RETURNS * a pointer to a string in dynamic memory; * or NULL on error, setting suberr appropriately. */ wstring_ty * sub_basename(sub_context_ty *scp, wstring_list_ty *arg) { wstring_ty *result; wstring_ty *suffix; wstring_ty *s1; long len; trace(("sub_basename()\n{\n")); switch (arg->nitems) { default: sub_context_error_set ( scp, i18n("requires one or two arguments") ); result = 0; break; case 2: result = entryname(arg->item[1]); break; case 3: s1 = entryname(arg->item[1]); suffix = arg->item[2]; len = (long)s1->wstr_length - (long)suffix->wstr_length; if ( len > 0 && !memcmp ( s1->wstr_text + len, suffix->wstr_text, suffix->wstr_length * sizeof(wchar_t) ) ) { result = wstr_n_from_wc(s1->wstr_text, len); wstr_free(s1); } else result = s1; break; } trace(("return %8.8lX;\n", (long)result)); trace(("}\n")); return result; } fhist-1.18/common/sub/basename.h 644 0 0 212011265752627 160100ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_SUB_BASENAME_H #define COMMON_SUB_BASENAME_H #include struct sub_context_ty; /* existence */ struct wstring_list_ty; /* existence */ struct wstring_ty *sub_basename(struct sub_context_ty *, struct wstring_list_ty *); #endif /* COMMON_SUB_BASENAME_H */ fhist-1.18/common/sub/date.c 644 0 0 524511265752627 151600ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include #include #include #include /* * NAME * sub_date - the date substitution * * SYNOPSIS * wstring_ty *sub_date(wstring_list_ty *arg); * * DESCRIPTION * The sub_date function implements the date substitution. * The date substitution is replaced by the current date. * The optional arguments may construct format string, * similar to the date(1) command. * * ARGUMENTS * arg - list of arguments, including the function name as [0] * * RETURNS * a pointer to a string in dynamic memory; * or NULL on error, setting suberr appropriately. */ wstring_ty * sub_date(sub_context_ty *scp, wstring_list_ty *arg) { wstring_ty *result; time_t now; trace(("sub_date()\n{\n")); time(&now); if (arg->nitems < 2) { char *time_string; time_string = ctime(&now); result = wstr_n_from_c(time_string, 24); } else { struct tm *tm; char buf[1000]; size_t nbytes; wstring_ty *wfmt; string_ty *fmt; wfmt = wstring_list_to_wstring(arg, 1, 32767, (char *)0); fmt = wstr_to_str(wfmt); wstr_free(wfmt); tm = localtime(&now); /* * The strftime is locale dependent. */ language_human(); nbytes = strftime(buf, sizeof(buf) - 1, fmt->str_text, tm); language_C(); if (!nbytes && fmt->str_length) { sub_context_error_set(scp, i18n("strftime output too large")); result = 0; } else result = wstr_n_from_c(buf, nbytes); str_free(fmt); } trace(("return %8.8lX;\n", (long)result)); trace(("}\n")); return result; } fhist-1.18/common/sub/date.h 644 0 0 210011265752627 151500ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_SUB_DATE_H #define COMMON_SUB_DATE_H #include struct sub_context_ty; /* existence */ struct wstring_list_ty; /* existence */ struct wstring_ty *sub_date(struct sub_context_ty *, struct wstring_list_ty *); #endif /* COMMON_SUB_DATE_H */ fhist-1.18/common/sub/dirname.c 644 0 0 570111265752627 156570ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include static wstring_ty * wdirname(wstring_ty *s) { wchar_t *the_end; /* * strip trailing slashes */ the_end = s->wstr_text + s->wstr_length; while (the_end > s->wstr_text && the_end[-1] == '/') --the_end; /* * strip trailing filename */ while (the_end > s->wstr_text && the_end[-1] != '/') --the_end; /* * strip trailing slashes */ while (the_end > s->wstr_text && the_end[-1] == '/') --the_end; /* * If there is anything left, that's the answer. */ if (the_end > s->wstr_text) return wstr_n_from_wc(s->wstr_text, the_end - s->wstr_text); /* * If there is nothing left, but we were given an absolute path, * root is the answer. */ if (s->wstr_text[0] == '/') return wstr_from_c("/"); /* * Otherwise, the current dirtectory is the answer. */ return wstr_from_c("."); } /* * NAME * sub_dirname - the dirname substitution * * SYNOPSIS * wstring_ty *sub_dirname(wstring_list_ty *arg); * * DESCRIPTION * The sub_dirname function implements the dirname substitution. * The dirname substitution is replaced by the dirname of * the argument path, similar to the dirname(1) command. * * ARGUMENTS * arg - list of arguments, including the function name as [0] * * RETURNS * a pointer to a string in dynamic memory; * or NULL on error, setting suberr appropriately. */ wstring_ty * sub_dirname(sub_context_ty *scp, wstring_list_ty *arg) { wstring_ty *result; trace(("sub_dirname()\n{\n")); if (arg->nitems != 2) { sub_context_error_set(scp, i18n("requires one argument")); result = 0; } else result = wdirname(arg->item[1]); trace(("return %8.8lX;\n", (long)result)); trace(("}\n")); return result; } fhist-1.18/common/sub/dirname.h 644 0 0 211411265752627 156570ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_SUB_DIRNAME_H #define COMMON_SUB_DIRNAME_H #include struct sub_context_ty; /* existence */ struct wstring_list_ty; /* existence */ struct wstring_ty *sub_dirname(struct sub_context_ty *, struct wstring_list_ty *); #endif /* COMMON_SUB_DIRNAME_H */ fhist-1.18/common/sub/downcase.c 644 0 0 354211265752627 160440ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include /* * NAME * sub_downcase - the downcase substitution * * SYNOPSIS * wstring_ty *sub_downcase(wstring_list_ty *arg); * * DESCRIPTION * The sub_downcase function implements the downcase substitution. * The downcase substitution is replaced by the single argument * mapped to lower case. * * Requires exactly one argument. * * ARGUMENTS * arg - list of arguments, including the function name as [0] * * RETURNS * a pointer to a string in dynamic memory; * or NULL on error, setting suberr appropriately. */ wstring_ty * sub_downcase(sub_context_ty *scp, wstring_list_ty *arg) { wstring_ty *result; trace(("sub_downcase()\n{\n")); if (arg->nitems != 2) { sub_context_error_set(scp, i18n("requires one argument")); result = 0; } else result = wstr_to_lower(arg->item[1]); trace(("return %8.8lX;\n", (long)result)); trace(("}\n")); return result; } fhist-1.18/common/sub/downcase.h 644 0 0 212311265752627 160430ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_SUB_DOWNCASE_H #define COMMON_SUB_DOWNCASE_H #include struct sub_context_ty; /* existence */ struct wstring_list_ty; /* existence */ struct wstring_ty *sub_downcase(struct sub_context_ty *, struct wstring_list_ty *arg); #endif /* COMMON_SUB_DOWNCASE_H */ fhist-1.18/common/sub/errno.c 644 0 0 617111265752627 153670ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include #include #include #include #include #include #include /* * NAME * sub_errno - the errno substitution * * SYNOPSIS * wstring_ty *sub_errno(wstring_list_ty *arg); * * DESCRIPTION * The sub_errno function implements the errno substitution. The * errno substitution is replaced by the value if th errno variable * provided by the system, as mapped through the strerror function. * * Requires exactly zero arguments. * * The sub_errno_set() function may be used to remember errno, * and thus isolate the error from subsequest system calls. * * ARGUMENTS * arg - list of arguments, including the function name as [0] * * RETURNS * a pointer to a string in dynamic memory; * or NULL on error, setting suberr appropriately. */ wstring_ty * sub_errno(sub_context_ty *scp, wstring_list_ty *arg) { wstring_ty *result; trace(("sub_errno()\n{\n")); if (arg->nitems != 1) { sub_context_error_set(scp, i18n("requires zero arguments")); result = 0; } else { int n; n = sub_context_errno_get(scp); if (n == EPERM || n == EACCES) { int uid; struct passwd *pw; string_ty *uidn; int gid; struct group *gr; string_ty *gidn; string_ty *s; uid = geteuid(); pw = getpwuid(uid); if (pw) uidn = str_format("user \"%.8s\"", pw->pw_name); else uidn = str_format("uid %d", uid); gid = getegid(); gr = getgrgid(gid); if (gr) gidn = str_format("group \"%.8s\"", gr->gr_name); else gidn = str_format("gid %d", gid); s = str_format("%s [%S, %S]", strerror(n), uidn, gidn); str_free(uidn); str_free(gidn); result = str_to_wstr(s); str_free(s); } else result = wstr_from_c(strerror(n)); } trace(("return %8.8lX;\n", (long)result)); trace(("}\n")); return result; } fhist-1.18/common/sub/errno.h 644 0 0 210411265752627 153640ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_SUB_ERRNO_H #define COMMON_SUB_ERRNO_H #include struct sub_context_ty; /* existence */ struct wstring_list_ty; /* existence */ struct wstring_ty *sub_errno(struct sub_context_ty *, struct wstring_list_ty *); #endif /* COMMON_SUB_ERRNO_H */ fhist-1.18/common/sub/expr.c 644 0 0 405011265752627 152120ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include #include #include wstring_ty * sub_expression(sub_context_ty *scp, wstring_list_ty *arg) { wstring_ty *ws; string_ty *s1; string_ty *s2; wstring_ty *result; /* * Check the number of arguments */ trace(("sub_expression()\n{\n")); if (arg->nitems < 2) { sub_context_error_set(scp, i18n("requires at least one argument")); trace(("return NULL;\n")); trace(("}\n")); return 0; } /* * Fold all of the arguments into a single string, * and parse that string for an expression. */ ws = wstring_list_to_wstring(arg, 1, arg->nitems, " "); s1 = wstr_to_str(ws); trace(("s1 = \"%s\";\n", s1->str_text)); wstr_free(ws); s2 = sub_expr_gram(scp, s1); str_free(s1); if (!s2) { trace(("return NULL;\n")); trace(("}\n")); return 0; } /* * Turn the result of the parse into a wide string. */ trace(("result = \"%s\";\n", s2->str_text)); result = str_to_wstr(s2); str_free(s2); trace(("return %8.8lX;\n", (long)result)); trace(("}\n")); return result; } fhist-1.18/common/sub/expr.h 644 0 0 210611265752627 152170ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_SUB_EXPR_H #define COMMON_SUB_EXPR_H #include struct sub_context_ty; /* existence */ struct wstring_list_ty; /* existence */ struct wstring_ty *sub_expression(struct sub_context_ty *, struct wstring_list_ty *); #endif /* COMMON_SUB_EXPR_H */ fhist-1.18/common/sub/expr_gram.h 644 0 0 204511265752627 162270ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_SUB_EXPR_GRAM_H #define COMMON_SUB_EXPR_GRAM_H #include struct sub_context_ty; /* existence */ struct string_ty *sub_expr_gram(struct sub_context_ty *, struct string_ty *); #endif /* COMMON_SUB_EXPR_GRAM_H */ fhist-1.18/common/sub/expr_gram.y 644 0 0 723311265752627 162540ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 1999, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ %{ #include #include #include #include #include #include #include #include #include #ifdef DEBUG #define YYDEBUG 1 #endif %} %token DIV %token JUNK %token LP %token MINUS %token MUL %token NUMBER %token PLUS %token RP %union { long lv_number; } %type NUMBER expr %left PLUS MINUS %left MUL DIV %right UNARY %{ static long result; static sub_context_ty *scp; string_ty * sub_expr_gram(sub_context_ty *p, string_ty *s) { int bad; extern int yyparse(void); #ifdef DEBUG extern int yydebug; #endif trace(("sub_expr_gram()\n{\n")); scp = p; #ifdef DEBUG yydebug = trace_pretest_; #endif sub_expr_lex_open(s); bad = yyparse(); sub_expr_lex_close(); trace(("bad = %d\n", bad)); scp = 0; trace(("}\n")); if (bad) return 0; return str_format("%ld", result); } static void yyerror(char *s) { trace(("yyerror(\"%s\")\n{\n", s)); sub_context_error_set(scp, s); trace(("}\n")); } #ifdef DEBUG /* * jiggery-pokery for yacc * * Replace all calls to printf with a call to trace_printf. The * trace_where_ is needed to set the location, and is safe, because * yacc only invokes the printf with an if (be careful, the printf * is not in a compound statement). */ #define printf trace_where_, trace_printf /* * jiggery-pokery for bison * * Replace all calls to fprintf with a call to yydebugger. Ignore * the first argument, it will be ``stderr''. The trace_where_ is * needed to set the location, and is safe, because bison only * invokes the printf with an if (be careful, the fprintf is not in * a compound statement). */ #define fprintf trace_where_, yydebugger void yydebugger(void *junk, char *fmt, ...) { va_list ap; string_ty *s; sva_init(ap, fmt); s = str_vformat(fmt, ap); va_end(ap); trace_printf("%s", s->str_text); str_free(s); } #endif %} %% grammar: expr { result = $1; } ; expr : LP expr RP { $$ = $2; trace(("$$ = %ld;\n", $$)); } | NUMBER { $$ = $1; trace(("$$ = %ld;\n", $$)); } | MINUS expr %prec UNARY { $$ = -$2; trace(("$$ = %ld;\n", $$)); } | expr PLUS expr { $$ = $1 + $3; trace(("$$ = %ld;\n", $$)); } | expr MINUS expr { $$ = $1 - $3; trace(("$$ = %ld;\n", $$)); } | expr MUL expr { $$ = $1 * $3; trace(("$$ = %ld;\n", $$)); } | expr DIV expr { $$ = $3 ? $1 / $3 : 0; trace(("$$ = %ld;\n", $$)); } ; fhist-1.18/common/sub/expr_lex.c 644 0 0 625411265752627 160720ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include static string_ty *text; static size_t pos; void sub_expr_lex_open(string_ty *s) { text = s; pos = 0; } void sub_expr_lex_close(void) { text = 0; pos = 0; } static int lex_getc(void) { int c; if (!text || pos >= text->str_length) c = 0; else c = (unsigned char)text->str_text[pos]; ++pos; return c; } static void lex_getc_undo(int c) { if (pos > 0) --pos; } int sub_expr_gram_lex(void) { int c; long n; for (;;) { c = lex_getc(); switch (c) { case 0: return 0; case '(': return LP; case ')': return RP; case '-': return MINUS; case '+': return PLUS; case '*': return MUL; case '/': return DIV; case ' ': case '\t': case '\n': case '\f': break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': n = 0; for (;;) { n = n * 10 + c - '0'; c = lex_getc(); switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': continue; default: break; } lex_getc_undo(c); break; } sub_expr_gram_lval.lv_number = n; return NUMBER; default: return JUNK; } } } fhist-1.18/common/sub/expr_lex.h 644 0 0 205511265752627 160720ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_SUB_EXPR_LEX_H #define COMMON_SUB_EXPR_LEX_H #include struct string_ty; /* forward */ void sub_expr_lex_open(struct string_ty *); void sub_expr_lex_close(void); int sub_expr_gram_lex(void); #endif /* COMMON_SUB_EXPR_LEX_H */ fhist-1.18/common/sub/ident.c 644 0 0 371711265752627 153500ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include /* * NAME * sub_identifier - the identifier substitution * * SYNOPSIS * string_ty *sub_identifier(wstring_list_ty *arg); * * DESCRIPTION * The sub_identifier function implements the identifier substitution. * The identifier substitution is replaced by the single argument * mapped to a C identifier. All characters which are not legal in * a C identifier are replaced by an underscore. * * Requires exactly one argument. * * ARGUMENTS * arg - list of arguments, including the function name as [0] * * RETURNS * a pointer to a string in dynamic memory; * or NULL on error, setting suberr appropriately. */ wstring_ty * sub_identifier(sub_context_ty *scp, wstring_list_ty *arg) { wstring_ty *result; trace(("sub_identifier()\n{\n")); if (arg->nitems != 2) { sub_context_error_set(scp, i18n("requires one argument")); result = 0; } else result = wstr_to_ident(arg->item[1]); trace(("return %8.8lX;\n", (long)result)); trace(("}\n")); return result; } fhist-1.18/common/sub/ident.h 644 0 0 211111265752627 153400ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_SUB_IDENT_H #define COMMON_SUB_IDENT_H #include struct sub_context_ty; /* existence */ struct wstring_list_ty; /* existence */ struct wstring_ty *sub_identifier(struct sub_context_ty *, struct wstring_list_ty *); #endif /* COMMON_SUB_IDENT_H */ fhist-1.18/common/sub/left.c 644 0 0 326511265752627 151750ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include #include #include wstring_ty * sub_left(sub_context_ty *scp, wstring_list_ty *arg) { wstring_ty *result; string_ty *s; long n; trace(("sub_left()\n{\n")); if (arg->nitems != 3) { sub_context_error_set(scp, i18n("requires two arguments")); trace(("return NULL;\n")); trace(("}\n")); return 0; } s = wstr_to_str(arg->item[2]); n = atol(s->str_text); trace(("n = %ld\n", n)); str_free(s); if (n <= 0) result = wstr_from_c(""); else if (n > arg->item[1]->wstr_length) result = wstr_copy(arg->item[1]); else result = wstr_n_from_wc(arg->item[1]->wstr_text, (size_t)n); trace(("return %8.8lX;\n", (long)result)); trace(("}\n")); return result; } fhist-1.18/common/sub/left.h 644 0 0 210011265752627 151650ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_SUB_LEFT_H #define COMMON_SUB_LEFT_H #include struct sub_context_ty; /* existence */ struct wstring_list_ty; /* existence */ struct wstring_ty *sub_left(struct sub_context_ty *, struct wstring_list_ty *); #endif /* COMMON_SUB_LEFT_H */ fhist-1.18/common/sub/length.c 644 0 0 274311265752627 155240ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include #include wstring_ty * sub_length(sub_context_ty *scp, wstring_list_ty *arg) { wstring_ty *result; string_ty *s; trace(("sub_length()\n{\n")); if (arg->nitems != 2) { sub_context_error_set(scp, i18n("requires one argument")); trace(("return NULL;\n")); trace(("}\n")); return 0; } s = str_format("%ld", (long)arg->item[1]->wstr_length); trace(("result = \"%s\";\n", s->str_text)); result = str_to_wstr(s); str_free(s); trace(("return %8.8lX;\n", (long)result)); trace(("}\n")); return result; } fhist-1.18/common/sub/length.h 644 0 0 211011265752627 155150ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_SUB_LENGTH_H #define COMMON_SUB_LENGTH_H #include struct sub_context_ty; /* existence */ struct wstring_list_ty; /* existence */ struct wstring_ty *sub_length(struct sub_context_ty *, struct wstring_list_ty *); #endif /* COMMON_SUB_LENGTH_H */ fhist-1.18/common/sub/plural.c 644 0 0 326611265752627 155430ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include #include #include wstring_ty * sub_plural(sub_context_ty *scp, wstring_list_ty *arg) { string_ty *s; wstring_ty *result; long n; trace(("sub_plural()\n{\n")); switch (arg->nitems) { default: sub_context_error_set(scp, i18n("requires two or three arguments")); result = 0; break; case 3: wstring_list_append(arg, wstr_from_c("")); /* fall through... */ case 4: s = wstr_to_str(arg->item[1]); n = atol(s->str_text); str_free(s); if (n != 1) result = wstr_copy(arg->item[2]); else result = wstr_copy(arg->item[3]); break; } trace(("return %8.8lX;\n", (long)result)); trace(("}\n")); return result; } fhist-1.18/common/sub/plural.h 644 0 0 211011265752627 155330ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_SUB_PLURAL_H #define COMMON_SUB_PLURAL_H #include struct sub_context_ty; /* existence */ struct wstring_list_ty; /* existence */ struct wstring_ty *sub_plural(struct sub_context_ty *, struct wstring_list_ty *); #endif /* COMMON_SUB_PLURAL_H */ fhist-1.18/common/sub/private.h 644 0 0 200311265752627 157070ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_SUB_PRIVATE_H #define COMMON_SUB_PRIVATE_H #include void sub_context_error_set(sub_context_ty *, char *); int sub_context_errno_get(sub_context_ty *); #endif /* COMMON_SUB_PRIVATE_H */ fhist-1.18/common/sub/progname.c 644 0 0 355211265752627 160520ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include #include /* * NAME * sub_progname - the progname substitution * * SYNOPSIS * wstring_ty *sub_progname(wstring_list_ty *arg); * * DESCRIPTION * The sub_progname function implements the progname substitution. * The progname substitution is replaced by the name of the * currently executing program. Takes zero arguments. * * ARGUMENTS * arg - list of arguments, including the function name as [0] * * RETURNS * a pointer to a string in dynamic memory; * or NULL on error, setting suberr appropriately. */ wstring_ty * sub_progname(sub_context_ty *scp, wstring_list_ty *arg) { wstring_ty *result; trace(("sub_progname()\n{\n")); if (arg->nitems != 1) { sub_context_error_set(scp, i18n("requires zero arguments")); result = 0; } else result = wstr_from_c(progname_get()); trace(("return %8.8lX;\n", (long)result)); trace(("}\n")); return result; } fhist-1.18/common/sub/progname.h 644 0 0 212011265752627 160450ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_SUB_PROGNAME_H #define COMMON_SUB_PROGNAME_H #include struct sub_context_ty; /* existence */ struct wstring_list_ty; /* existence */ struct wstring_ty *sub_progname(struct sub_context_ty *, struct wstring_list_ty *); #endif /* COMMON_SUB_PROGNAME_H */ fhist-1.18/common/sub/right.c 644 0 0 332011265752627 153500ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include #include wstring_ty * sub_right(sub_context_ty *scp, wstring_list_ty *arg) { wstring_ty *result; string_ty *s; wstring_ty *ws; long n; trace(("sub_right()\n{\n")); if (arg->nitems != 3) { sub_context_error_set(scp, i18n("requires two arguments")); trace(("return NULL;\n")); trace(("}\n")); return 0; } s = wstr_to_str(arg->item[2]); n = atol(s->str_text); str_free(s); if (n <= 0) result = wstr_from_c(""); else if (n > arg->item[1]->wstr_length) result = wstr_copy(arg->item[1]); else { ws = arg->item[1]; result = wstr_n_from_wc(ws->wstr_text + ws->wstr_length - n, (size_t)n); } trace(("return %8.8lX;\n", (long)result)); trace(("}\n")); return result; } fhist-1.18/common/sub/right.h 644 0 0 210411265752627 153540ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_SUB_RIGHT_H #define COMMON_SUB_RIGHT_H #include struct sub_context_ty; /* existence */ struct wstring_list_ty; /* existence */ struct wstring_ty *sub_right(struct sub_context_ty *, struct wstring_list_ty *); #endif /* COMMON_SUB_RIGHT_H */ fhist-1.18/common/sub/upcase.c 644 0 0 351711265752627 155230ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include /* * NAME * sub_upcase - the upcase substitution * * SYNOPSIS * string_ty *sub_upcase(wstring_list_ty *arg); * * DESCRIPTION * The sub_upcase function implements the upcase substitution. * The upcase substitution is replaced by the single argument * mapped to upper case. * * Requires exactly one argument. * * ARGUMENTS * arg - list of arguments, including the function name as [0] * * RETURNS * a pointer to a string in dynamic memory; * or NULL on error, setting suberr appropriately. */ wstring_ty * sub_upcase(sub_context_ty *scp, wstring_list_ty *arg) { wstring_ty *result; trace(("sub_upcase()\n{\n")); if (arg->nitems != 2) { sub_context_error_set(scp, i18n("requires one argument")); result = 0; } else result = wstr_to_upper(arg->item[1]); trace(("return %8.8lX;\n", (long)result)); trace(("}\n")); return result; } fhist-1.18/common/sub/upcase.h 644 0 0 211011265752627 155140ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_SUB_UPCASE_H #define COMMON_SUB_UPCASE_H #include struct sub_context_ty; /* existence */ struct wstring_list_ty; /* existence */ struct wstring_ty *sub_upcase(struct sub_context_ty *, struct wstring_list_ty *); #endif /* COMMON_SUB_UPCASE_H */ fhist-1.18/common/sub/zero_pad.c 644 0 0 413511265752627 160430ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include #include #include wstring_ty * sub_zero_pad(sub_context_ty *scp, wstring_list_ty *arg) { wstring_ty *result; string_ty *s; long n; trace(("sub_zero_pad()\n{\n")); if (arg->nitems != 3) { sub_context_error_set(scp, i18n("requires two arguments")); trace(("return NULL;\n")); trace(("}\n")); return 0; } s = wstr_to_str(arg->item[2]); n = atol(s->str_text); trace(("n = %ld;\n", n)); str_free(s); if (n <= arg->item[1]->wstr_length) result = wstr_copy(arg->item[1]); else { size_t len; char *buffer; string_ty *s2; size_t j; len = n - arg->item[1]->wstr_length; s = wstr_to_str(arg->item[1]); buffer = mem_alloc(len + 1); for (j = 0; j < len; ++j) buffer[j] = '0'; buffer[len] = 0; s2 = str_format("%s%S", buffer, s); trace(("result = \"%s\";\n", s2->str_text)); mem_free(buffer); str_free(s); result = str_to_wstr(s2); str_free(s2); } trace(("return %8.8lX;\n", (long)result)); trace(("}\n")); return result; } fhist-1.18/common/sub/zero_pad.h 644 0 0 212011265752627 160400ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_SUB_ZERO_PAD_H #define COMMON_SUB_ZERO_PAD_H #include struct sub_context_ty; /* existence */ struct wstring_list_ty; /* existence */ struct wstring_ty *sub_zero_pad(struct sub_context_ty *, struct wstring_list_ty *); #endif /* COMMON_SUB_ZERO_PAD_H */ fhist-1.18/common/trace.c 644 0 0 2701111265752627 145630ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #define INDENT 2 #define PAGE_WIDTH 79 typedef struct known_ty known_ty; struct known_ty { string_ty *filename; int flag; int *flag_p; known_ty *next; }; static string_ty *file_name; static int line_number; static int page_width; static known_ty *known; static string_ty * base_name(const char *file) { const char *cp1; const char *cp2; cp1 = strrchr(file, '/'); if (cp1) ++cp1; else cp1 = file; cp2 = strrchr(cp1, '.'); if (!cp2) cp2 = cp1 + strlen(cp1); if (cp2 > cp1 + 6) return str_n_from_c(cp1, 6); return str_n_from_c(cp1, cp2 - cp1); } int trace_pretest(const char *file, int *result) { string_ty *s; known_ty *kp; int err; err = errno; s = base_name(file); for (kp = known; kp; kp = kp->next) { if (str_equal(s, kp->filename)) { str_free(s); break; } } if (!kp) { kp = (known_ty *)mem_alloc(sizeof(known_ty)); kp->filename = s; kp->next = known; kp->flag = 2; /* disabled */ known = kp; } kp->flag_p = result; *result = kp->flag; errno = err; return *result; } void trace_where(const char *file, int line) { string_ty *s; int err; /* * take new name fist, because will probably be same as last * thus saving a free and a malloc (which are slow) */ err = errno; s = base_name(file); if (file_name) str_free(file_name); file_name = s; line_number = line; errno = err; } static void trace_putchar(int c) { static int depth; static char buffer[PAGE_WIDTH + 2]; static char *cp; static int in_col; static int out_col; char *progname; progname = progname_get(); if (!page_width) { page_width = PAGE_WIDTH - 24; if (page_width < 8) page_width = 8; } if (!cp) { strcpy(buffer, progname); cp = buffer + strlen(buffer); if (cp > buffer + 6) cp = buffer + 6; *cp++ = ':'; *cp++ = '\t'; strcpy(cp, file_name->str_text); cp += file_name->str_length; *cp++ = ':'; *cp++ = '\t'; sprintf(cp, "%d:\t", line_number); cp += strlen(cp); in_col = 0; out_col = 0; } switch (c) { case '\n': *cp++ = '\n'; *cp = 0; fflush(stdout); fputs(buffer, stderr); fflush(stderr); if (ferror(stderr)) nfatal_raw("standard error"); cp = 0; break; case ' ': if (out_col) ++in_col; break; case '\t': if (out_col) in_col = (in_col/INDENT + 1) * INDENT; break; case /*{*/'}': case /*(*/')': case /*[*/']': if (depth > 0) --depth; /* fall through */ default: if (!out_col) { if (c != '#') /* modulo so never too long */ in_col = (INDENT * depth) % page_width; else in_col = 0; } if (in_col >= page_width) { trace_putchar('\n'); trace_putchar(c); return; } while (((out_col + 8) & -8) <= in_col && out_col + 1 < in_col) { *cp++ = '\t'; out_col = (out_col + 8) & -8; } while (out_col < in_col) { *cp++ = ' '; ++out_col; } if (c == '{'/*}*/ || c == '('/*)*/ || c == '['/*]*/) ++depth; *cp++ = c; in_col++; out_col++; break; } } void trace_printf(const char *s, ...) { string_ty *buffer; va_list ap; int err; err = errno; va_start(ap, s); buffer = str_vformat(s, ap); va_end(ap); for (s = buffer->str_text; *s; ++s) trace_putchar(*s); str_free(buffer); errno = err; } void trace_enable(const char *file) { string_ty *s; known_ty *kp; s = base_name(file); for (kp = known; kp; kp = kp->next) { if (str_equal(s, kp->filename)) { str_free(s); break; } } if (!kp) { kp = (known_ty *)mem_alloc(sizeof(known_ty)); kp->filename = s; kp->flag_p = 0; kp->next = known; known = kp; } kp->flag = 3; /* enabled */ if (kp->flag_p) *kp->flag_p = kp->flag; /* * silence a warning */ #ifdef DEBUG trace_pretest_result = 0; #endif } void trace_char_real(const char *name, const char *vp) { trace_printf("%s = '", name); if (*vp < ' ' || *vp > '~' || strchr("(){}[]", *vp)) { char *s; s = strchr("\bb\nn\tt\rr\ff", *vp); if (s) { trace_putchar('\\'); trace_putchar(s[1]); } else trace_printf("\\%03o", (unsigned char)*vp); } else { if (strchr("'\\", *vp)) trace_putchar('\\'); trace_putchar(*vp); } trace_printf("'; /* 0x%02X, %d */\n", (unsigned char)*vp, *vp); } void trace_char_unsigned_real(const char *name, const unsigned char *vp) { trace_printf("%s = '", name); if (*vp < ' ' || *vp > '~' || strchr("(){}[]", *vp)) { char *s; s = strchr("\bb\nn\tt\rr\ff", *vp); if (s) { trace_putchar('\\'); trace_putchar(s[1]); } else trace_printf("\\%03o", *vp); } else { if (strchr("'\\", *vp)) trace_putchar('\\'); trace_putchar(*vp); } trace_printf("'; /* 0x%02X, %d */\n", *vp, *vp); } void trace_int_real(const char *name, const int *vp) { trace_printf("%s = %d;\n", name, *vp); } void trace_int_unsigned_real(const char *name, const unsigned int *vp) { trace_printf("%s = %u;\n", name, *vp); } void trace_long_real(const char *name, const long *vp) { trace_printf("%s = %ld;\n", name, *vp); } void trace_long_unsigned_real(const char *name, const unsigned long *vp) { trace_printf("%s = %lu;\n", name, *vp); } void trace_pointer_real(const char *name, const void *vptrptr) { const void *const *ptr_ptr = vptrptr; const void *ptr; ptr = *ptr_ptr; if (!ptr) trace_printf("%s = NULL;\n", name); else trace_printf("%s = 0x%08lX;\n", name, ptr); } void trace_short_real(const char *name, const short *vp) { trace_printf("%s = %hd;\n", name, *vp); } void trace_short_unsigned_real(const char *name, const unsigned short *vp) { trace_printf("%s = %hu;\n", name, *vp); } void trace_string_real(const char *name, const char *vp) { const char *s; long count; trace_printf("%s = ", name); if (!vp) { trace_printf("NULL;\n"); return; } trace_printf("\""); count = 0; for (s = vp; *s; ++s) { switch (*s) { case '('/*)*/: case '['/*]*/: case '{'/*}*/: ++count; break; case /*(*/')': case /*[*/']': case /*{*/'}': --count; break; } } if (count > 0) count = -count; else count = 0; for (s = vp; *s; ++s) { int c; c = *s; if (c < ' ' || c > '~') { char *cp; cp = strchr("\bb\ff\nn\rr\tt", c); if (cp) trace_printf("\\%c", cp[1]); else { escape: trace_printf("\\%03o", (unsigned char)c); } } else { switch (c) { case '('/*)*/: case '['/*]*/: case '{'/*}*/: ++count; if (count <= 0) goto escape; break; case /*(*/')': case /*[*/']': case /*{*/'}': --count; if (count < 0) goto escape; break; case '\\': case '"': trace_printf("\\"); break; } trace_printf("%c", c); } } trace_printf("\";\n"); } fhist-1.18/common/trace.h 644 0 0 2426011265752627 145730ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef TRACE_H #define TRACE_H #include #include #include #if 0 /* ---------------------------------- */ /* * Set the NDEBUG define appropriately, * and then use the system assert. */ #ifdef DEBUG #ifdef NDEBUG #undef NDEBUG #endif #else #define NDEBUG 1 #endif #include #endif /* ---------------------------------- */ #ifdef DEBUG #define trace_pretest_ \ ( \ ( \ trace_pretest_result \ ? \ trace_pretest_result \ : \ trace_pretest(__FILE__, &trace_pretest_result) \ ) \ & \ 1 \ ) #define trace_where_ trace_where(__FILE__, __LINE__) #define trace(x) (void)(trace_pretest_ && (trace_where_, trace_printf x, 0)) #define trace_if() (trace_pretest_ && (trace_where_, 1)) #else #define trace(x) #define trace_if() 0 #endif /* * This variable is static to each file which * includes the "trace.h" file. * Tracing is file-by-file, but need only test this once. * Files will fail to trace if a trace call is executed in them * prior to a call to trace_enable turning it on. */ #ifdef DEBUG static int trace_pretest_result; #endif int trace_pretest(const char *file, int *result); void trace_where(const char *file, int line); void trace_printf(const char *, ...) ATTRIBUTE_FORMAT_1_2; void trace_enable(const char *); #if defined(__STDC__) || defined(__stdc__) #define trace_stringize(x) #x #else #define trace_stringize(x) "x" #endif void trace_string_real(const char *, const char *); void trace_short_unsigned_real(const char *, const unsigned short *); void trace_short_real(const char *, const short *); void trace_pointer_real(const char *, const void *); void trace_long_unsigned_real(const char *, const unsigned long *); void trace_long_real(const char *, const long *); void trace_int_unsigned_real(const char *, const unsigned *); void trace_int_real(const char *, const int *); void trace_char_unsigned_real(const char *, const unsigned char *); void trace_char_real(const char *, const char *); #ifdef DEBUG #define trace_char(x) \ (void) \ ( \ trace_pretest_ \ && \ ( \ trace_where_, \ trace_char_real(trace_stringize(x), &x), \ 0 \ ) \ ) #define trace_char_unsigned(x) \ (void) \ ( \ trace_pretest_ \ && \ ( \ trace_where_, \ trace_char_unsigned_real(trace_stringize(x), &x), \ 0 \ ) \ ) #define trace_int(x) \ (void) \ ( \ trace_pretest_ \ && \ ( \ trace_where_, \ trace_int_real(trace_stringize(x), &x), \ 0 \ ) \ ) #define trace_int_unsigned(x) \ (void) \ ( \ trace_pretest_ \ && \ ( \ trace_where_, \ trace_int_unsigned_real(trace_stringize(x), &x), \ 0 \ ) \ ) #define trace_long(x) \ (void) \ ( \ trace_pretest_ \ && \ ( \ trace_where_, \ trace_long_real(trace_stringize(x), &x), \ 0 \ ) \ ) #define trace_long_unsigned(x) \ (void) \ ( \ trace_pretest_ \ && \ ( \ trace_where_, \ trace_long_unsigned_real(trace_stringize(x), &x), \ 0 \ ) \ ) #define trace_pointer(x) \ (void) \ ( \ trace_pretest_ \ && \ ( \ trace_where_, \ trace_pointer_real(trace_stringize(x), &x), \ 0 \ ) \ ) #define trace_short(x) \ (void) \ ( \ trace_pretest_ \ && \ ( \ trace_where_, \ trace_short_real(trace_stringize(x), &x), \ 0 \ ) \ ) #define trace_short_unsigned(x) \ (void) \ ( \ trace_pretest_ \ && \ ( \ trace_where_, \ trace_short_unsigned_real(trace_stringize(x), &x), \ 0 \ ) \ ) #define trace_string(x) \ (void) \ ( \ trace_pretest_ \ && \ ( \ trace_where_, \ trace_string_real(trace_stringize(x), x), \ 0 \ ) \ ) #else #define trace_char(x) #define trace_char_unsigned(x) #define trace_int(x) #define trace_int_unsigned(x) #define trace_long(x) #define trace_long_unsigned(x) #define trace_pointer(x) #define trace_short(x) #define trace_short_unsigned(x) #define trace_string(x) #endif #endif /* TRACE_H */ fhist-1.18/common/undo.c 644 0 0 276711265752627 144250ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include typedef struct list_t list_t; struct list_t { list_t *next; string_ty *path; }; static list_t *head_p; void undo(void) { while (head_p) { list_t *lp = head_p; head_p = lp->next; /* * Ignore any error. They are usually ENOENT errors, * indicating the the file is already gone. */ unlink(lp->path->str_text); str_free(lp->path); mem_free(lp); } } void undo_unlink(const char *path) { list_t *lp; lp = mem_alloc(sizeof(list_t)); lp->path = str_from_c(path); lp->next = head_p; head_p = lp; } fhist-1.18/common/undo.h 644 0 0 233411265752627 144200ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_UNDO_H #define COMMON_UNDO_H #include /** * The undo function is called when quit() is cvalled with a non-zero * exit status. This allows temporaty files (etc) to be cleaned up on * an error exit. */ void undo(void); /** * The undo_unlink fucntiuon is used to register afile which should be * unlinked in the event of an error. */ void undo_unlink(const char *); #endif /* COMMON_UNDO_H */ fhist-1.18/common/version.c 644 0 0 1065311265752627 151560ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1991-1994, 1998, 2001, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include #include #include #include #include #include #include #include #include static void version_copyright(void) { static char *text[] = { "", "This program is derived from a work", "Copyright (C) 1990 David I. Bell.", "", "The %s program comes with ABSOLUTELY NO WARRANTY;", "for details use the '%s -VERSion License' command.", "The %s program is free software, and you are welcome", "to redistribute it under certain conditions; for", "details use the '%s -VERSion License' command.", }; char **cpp; char *progname; progname = progname_get(); printf("%s version %s\n", progname, version_stamp()); printf("Copyright (C) %s Peter Miller;\n", copyright_years()); for (cpp = text; cpp < ENDOF(text); ++cpp) { printf(*cpp, progname); fputc('\n', stdout); } } static void version_license(void) { help("fhist_lic", (void (*)(void))0); } typedef struct table_ty table_ty; struct table_ty { char *name; void (*func)(void); }; static table_ty table[] = { { "Copyright", version_copyright, }, { "License", version_license, }, }; static void usage(void) { char *progname; progname = progname_get(); fprintf(stderr, "Usage: %s -VERSion [ name ]\n", progname); fprintf(stderr, " %s -Help\n", progname); quit(1); } void version(void) { void (*func)(void); char *name; trace(("version()\n{\n")); arglex(); name = 0; while (arglex_token != arglex_token_eoln) { switch (arglex_token) { default: bad_argument(usage); continue; case arglex_token_string: if (name) fatal_raw("too many info names"); name = arglex_value.alv_string; break; } arglex(); } if (name) { int nhit; table_ty *tp; string_ty *s1; string_ty *s2; table_ty *hit[SIZEOF(table)]; int j; nhit = 0; for (tp = table; tp < ENDOF(table); ++tp) { if (arglex_compare(tp->name, name)) hit[nhit++] = tp; } switch (nhit) { case 0: fatal_raw("no info %s", name); case 1: break; default: s1 = str_from_c(hit[0]->name); for (j = 1; j < nhit; ++j) { s2 = str_format("%S, %s", s1, hit[j]->name); str_free(s1); s1 = s2; } fatal_raw("info %s ambig (%S)", name, s1); } arglex(); func = hit[0]->func; } else func = version_copyright; func(); trace(("}\n")); } fhist-1.18/common/version.h 644 0 0 163711265752627 151450ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1991-1994, 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef VERSION_H #define VERSION_H #include void version(void); #endif /* VERSION_H */ fhist-1.18/common/version_stmp.c 644 0 0 174511265752627 162030ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1994, 1995, 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #include #include char * version_stamp(void) { return PATCHLEVEL; } char * copyright_years(void) { return COPYRIGHT_YEARS; } fhist-1.18/common/version_stmp.h 644 0 0 175011265752627 162040ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1994, 1995, 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_VERSION_STMP_H #define COMMON_VERSION_STMP_H #include char *version_stamp(void); char *copyright_years(void); #endif /* COMMON_VERSION_STMP_H */ fhist-1.18/common/wstr.c 644 0 0 5364511265752627 145000ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998-2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . * * * A literal pool is maintained. Each string has a reference count. The * string stays in the literal pool for as long as it has a positive * reference count. To determine if a string is already in the literal pool, * linear dynamic hashing is used to guarantee an O(1) search. Making all equal * strings the same item in the literal pool means that string equality is * a pointer test, and thus very fast. */ #include #include #include #include #include #include #include #include #include #include #include #include #include /* for assert */ #include static wstring_ty **hash_table; static wstr_hash_ty hash_modulus; static wstr_hash_ty hash_cutover; static wstr_hash_ty hash_cutover_mask; static wstr_hash_ty hash_cutover_split_mask; static wstr_hash_ty hash_split; static wstr_hash_ty hash_load; static int changed; #define MAX_HASH_LEN 20 /* * NAME * hash_generate - hash string to number * * SYNOPSIS * wstr_hash_ty hash_generate(wchar_t *s, size_t n); * * DESCRIPTION * The hash_generate function is used to make a number from a string. * * RETURNS * wstr_hash_ty - the magic number * * CAVEAT * Only the last MAX_HASH_LEN characters are used. * It is important that wstr_hash_ty be unsigned (int or long). */ static wstr_hash_ty hash_generate(const wchar_t *s, size_t n) { wstr_hash_ty retval; if (n > MAX_HASH_LEN) { s += n - MAX_HASH_LEN; n = MAX_HASH_LEN; } retval = 0; while (n > 0) { retval = (retval + (retval << 1)) ^ *s++; --n; } return retval; } /* * NAME * wstr_initialize - start up string table * * SYNOPSIS * void wstr_initialize(void); * * DESCRIPTION * The wstr_initialize function is used to create the hash table and * initialize it to empty. * * RETURNS * void * * CAVEAT * This function must be called before any other defined in this file. */ static void wstr_initialize(void) { wstr_hash_ty j; if (hash_modulus) return; hash_modulus = 1<<8; /* MUST be a power of 2 */ hash_cutover = hash_modulus; hash_split = hash_modulus - hash_cutover; hash_cutover_mask = hash_cutover - 1; hash_cutover_split_mask = (hash_cutover * 2) - 1; hash_load = 0; hash_table = (wstring_ty **)mem_alloc(hash_modulus * sizeof(wstring_ty *)); for (j = 0; j < hash_modulus; ++j) hash_table[j] = 0; } /* * NAME * split - reduce table loading * * SYNOPSIS * void split(void); * * DESCRIPTION * The split function is used to reduce the load factor on the hash table. * * RETURNS * void * * CAVEAT * A load factor of about 80% is suggested. */ static void split(void) { wstring_ty *p; wstring_ty *p2; wstr_hash_ty idx; /* * get the list to be split across buckets */ p = hash_table[hash_split]; hash_table[hash_split] = 0; /* * increase the modulus by one */ hash_modulus++; hash_table = mem_change_size(hash_table, hash_modulus * sizeof(wstring_ty *)); hash_table[hash_modulus - 1] = 0; hash_split = hash_modulus - hash_cutover; if (hash_split >= hash_cutover) { hash_cutover = hash_modulus; hash_split = 0; hash_cutover_mask = hash_cutover - 1; hash_cutover_split_mask = (hash_cutover * 2) - 1; } /* * now redistribute the list elements */ while (p) { p2 = p; p = p->wstr_next; idx = p2->wstr_hash & hash_cutover_mask; if (idx < hash_split) idx = p2->wstr_hash & hash_cutover_split_mask; p2->wstr_next = hash_table[idx]; hash_table[idx] = p2; } } /* * NAME * wstr_from_c - make string from C string * * SYNOPSIS * wstring_ty *wstr_from_c(char *); * * DESCRIPTION * The wstr_from_c function is used to make a string from a NUL * terminated C string. The conversion from multi-byte to wide * characters is done in the current locale. * * RETURNS * wstring_ty* - a pointer to a string in dynamic memory. Use * wstr_free when finished with. * * CAVEAT * The contents of the structure pointed to MUST NOT be altered. */ wstring_ty * wstr_from_c(const char *s) { return wstr_n_from_c(s, strlen(s)); } /* * NAME * wstr_from_wc - make string from a wide C string * * SYNOPSIS * wstring_ty *wstr_from_wc(wchar_t *); * * DESCRIPTION * The wstr_from_c function is used to make a string from a NUL * terminated wide C string. * * RETURNS * wstring_ty* - a pointer to a string in dynamic memory. Use * wstr_free when finished with. * * CAVEAT * The contents of the structure pointed to MUST NOT be altered. */ wstring_ty * wstr_from_wc(const wchar_t *ws) { return wstr_n_from_wc(ws, wcslen(ws)); } /* * NAME * wstr_n_from_c - make string * * SYNOPSIS * wstring_ty *wstr_n_from_c(char *s, size_t n); * * DESCRIPTION * The wstr_n_from_c function is used to make a string from an * array of characters. No NUL terminator is assumed. The * conversion from muti-byte to wide characters is done in the * current locale. * * RETURNS * wstring_ty* - a pointer to a string in dynamic memory. Use * wstr_free when finished with. * * CAVEAT * The contents of the structure pointed to MUST NOT be altered. */ wstring_ty * wstr_n_from_c(const char *s, size_t length) { #if __STDC__ >= 1 static char escapes[] = "\aa\bb\ff\nn\rr\tt\vv"; #else static char escapes[] = "\bb\ff\nn\rr\tt"; #endif static wchar_t *buf; static size_t bufmax; size_t remainder; const char *ip; wchar_t *op; /* * Do the conversion "long hand". This is because some * implementations of the mbstowcs function barf when they see * invalid multi byte character sequences. This function * renders them as C escape sequences and keeps going. */ if (bufmax < length) { bufmax = length; /* the 4 is the longest escape sequence */ buf = mem_change_size(buf, bufmax * sizeof(wchar_t) * 4); } /* * change the locale to the native language default */ language_human(); /* * Reset the mbtowc internal state. */ mbtowc((wchar_t *)0, (char *)0, 0); /* * scan the string and extract the wide characters */ ip = s; op = buf; remainder = length; while (remainder > 0) { int n; n = mbtowc(op, ip, remainder); if (n == 0) break; if (n < 0) { char *esc; /* * Invalid multi byte sequence, replace the * first character with a C escape sequence. */ esc = strchr(escapes, *ip); if (esc) { *op++ = '\\'; *op++ = esc[1]; } else { *op++ = '\\'; *op++ = '0' + ((*ip >> 6) & 7); *op++ = '0' + ((*ip >> 3) & 7); *op++ = '0' + ( *ip & 7); } ++ip; --remainder; /* * The mbtowc function's internal state will now * be "error" or broken, or otherwise useless. * Reset it so that we can keep going. */ mbtowc((wchar_t *)0, (char *)0, 0); } else { /* * the one wchar_t used n chars */ ip += n; remainder -= n; ++op; } } /* * change the locale back to the C locale */ language_C(); /* * build the result from the image in ``buf'' */ return wstr_n_from_wc(buf, op - buf); } /* * NAME * wstr_to_mbs - wide string to multi-byte C string * * SYNOPSIS * void wstr_to_mbs(wstring_ty *s, char **rslt, size_t *rslt_len); * * DESCRIPTION * The wstr_to_mbs function convers a wide character string into a * multi-byte C string. The conversion is done in the current * locale. The result is NUL terminated, however the result length * does not include the NUL. * * CAVEAT * DO NOT free the result. The result will change between calls, * so copy it if you need to keep it. */ void wstr_to_mbs(wstring_ty *s, char **result_p, size_t *result_length_p) { static char *buf; static size_t bufmax; int n; wchar_t *ip; size_t remainder; char *op; size_t buflen; /* * Do the conversion "long hand". This is because the wcstombs * function barfs when it sees an invalid wchar_t. This * function treats them literally and keeps going. * * MB_LEN_MAX is used because the standard guarantees that it is * a non-zero constant. MB_CUR_MAX is an expression, and * experience has shown (e.g. SunOS 4.1.3) this it may be zero! */ buflen = (s->wstr_length + 1) * MB_LEN_MAX; assert(buflen > 0); if (buflen > bufmax) { bufmax = buflen; buf = mem_change_size(buf, bufmax); } /* * perform the conversion in the native language default */ language_human(); /* * The wctomb function has internal state. It needs to be reset. */ wctomb((char *)0, (wchar_t)0); ip = s->wstr_text; remainder = s->wstr_length; op = buf; while (remainder > 0) { n = wctomb(op, *ip); if (n <= 0) { /* * Copy the character literally. * Throw away anything that will not fit. */ *op++ = *ip++; if (!op[-1]) op[-1] = '?'; --remainder; /* * The wctomb function's internal state will now * be "error" or broken, or otherwise useless. * Reset it so that we can keep going. */ wctomb((char *)0, (wchar_t)0); } else { op += n; ++ip; --remainder; } } /* * The final NUL could require shift state end characters, * meaning that n could be more than 1. */ n = wctomb(op, (wchar_t)0); if (n <= 0) *op = 0; else { op += n - 1; assert(*op == 0); } /* * restore the locale to the C locale */ language_C(); /* * set the output side effects */ *result_p = buf; *result_length_p = op - buf; } /* * NAME * wstr_n_from_wc - make string * * SYNOPSIS * wstring_ty *wstr_n_from_wc(wchar_t *s, size_t n); * * DESCRIPTION * The wstr_n_from_c function is used to make a string from an * array of wide characters. No NUL terminator is assumed. * * RETURNS * wstring_ty* - a pointer to a string in dynamic memory. Use * wstr_free when finished with. * * CAVEAT * The contents of the structure pointed to MUST NOT be altered. */ wstring_ty * wstr_n_from_wc(const wchar_t *s, size_t length) { wstr_hash_ty hash; wstr_hash_ty idx; wstring_ty *p; if (!hash_modulus) wstr_initialize(); hash = hash_generate(s, length); idx = hash & hash_cutover_mask; if (idx < hash_split) idx = hash & hash_cutover_split_mask; for (p = hash_table[idx]; p; p = p->wstr_next) { if ( p->wstr_hash == hash && p->wstr_length == length && !memcmp(p->wstr_text, s, length * sizeof(wchar_t)) ) { p->wstr_references++; return p; } } p = (wstring_ty *) mem_alloc(sizeof(wstring_ty) + length * sizeof(wchar_t)); p->wstr_hash = hash; p->wstr_length = length; p->wstr_references = 1; p->wstr_next = hash_table[idx]; hash_table[idx] = p; memcpy(p->wstr_text, s, length * sizeof(wchar_t)); p->wstr_text[length] = 0; hash_load++; while (hash_load * 10 > hash_modulus * 8) split(); ++changed; return p; } /* * NAME * wstr_copy - make a copy of a string * * SYNOPSIS * wstring_ty *wstr_copy(wstring_ty *s); * * DESCRIPTION * The wstr_copy function is used to make a copy of a string. * * RETURNS * wstring_ty* - a pointer to a string in dynamic memory. Use * wstr_free when finished with. * * CAVEAT * The contents of the structure pointed to MUST NOT be altered. */ wstring_ty * wstr_copy(wstring_ty *s) { s->wstr_references++; return s; } /* * NAME * wstr_free - release a string * * SYNOPSIS * void wstr_free(wstring_ty *s); * * DESCRIPTION * The wstr_free function is used to indicate that a string hash been * finished with. * * RETURNS * void * * CAVEAT * This is the only way to release strings DO NOT use the free function. */ void wstr_free(wstring_ty *s) { wstr_hash_ty idx; wstring_ty **spp; if (!s) return; if (s->wstr_references > 1) { s->wstr_references--; return; } ++changed; /* * find the hash bucket it was in, * and remove it */ idx = s->wstr_hash & hash_cutover_mask; if (idx < hash_split) idx = s->wstr_hash & hash_cutover_split_mask; for (spp = &hash_table[idx]; *spp; spp = &(*spp)->wstr_next) { if (*spp == s) { *spp = s->wstr_next; free(s); --hash_load; return; } } /* * should never reach here! */ fatal_raw("attempted to free non-existent wstring (bug)"); } /* * NAME * wstr_catenate - join two strings * * SYNOPSIS * wstring_ty *wstr_catenate(wstring_ty *, wstring_ty *); * * DESCRIPTION * The wstr_catenate function is used to concatenate two strings to form a * new string. * * RETURNS * wstring_ty* - a pointer to a string in dynamic memory. Use * wstr_free when finished with. * * CAVEAT * The contents of the structure pointed to MUST NOT be altered. */ wstring_ty * wstr_catenate(wstring_ty *s1, wstring_ty *s2) { static wchar_t *tmp; static size_t tmplen; wstring_ty *s; size_t length; length = s1->wstr_length + s2->wstr_length; if (length > tmplen) { tmplen = length; tmp = mem_change_size(tmp, tmplen * sizeof(wchar_t)); } memcpy(tmp, s1->wstr_text, s1->wstr_length * sizeof(wchar_t)); memcpy ( tmp + s1->wstr_length, s2->wstr_text, s2->wstr_length * sizeof(wchar_t) ); s = wstr_n_from_wc(tmp, length); return s; } /* * NAME * wstr_cat_three - join three strings * * SYNOPSIS * wstring_ty *wstr_cat_three(wstring_ty *, wstring_ty *, wstring_ty *); * * DESCRIPTION * The wstr_cat_three function is used to concatenate three strings to form * a new string. * * RETURNS * wstring_ty* - a pointer to a string in dynamic memory. Use * wstr_free when finished with. * * CAVEAT * The contents of the structure pointed to MUST NOT be altered. */ wstring_ty * wstr_cat_three(wstring_ty *s1, wstring_ty *s2, wstring_ty *s3) { static wchar_t *tmp; static size_t tmplen; wstring_ty *s; size_t length; length = s1->wstr_length + s2->wstr_length + s3->wstr_length; if (tmplen < length) { tmplen = length; tmp = mem_change_size(tmp, tmplen * sizeof(wchar_t)); } memcpy(tmp, s1->wstr_text, s1->wstr_length * sizeof(wchar_t)); memcpy ( tmp + s1->wstr_length, s2->wstr_text, s2->wstr_length * sizeof(wchar_t) ); memcpy ( tmp + s1->wstr_length + s2->wstr_length, s3->wstr_text, s3->wstr_length * sizeof(wchar_t) ); s = wstr_n_from_wc(tmp, length); return s; } wstring_ty * wstr_to_upper(const wstring_ty *ws) { static wchar_t *buffer; static size_t buflen; size_t j; if (ws->wstr_length > buflen) { buflen = ws->wstr_length; buffer = mem_change_size(buffer, buflen * sizeof(wchar_t)); } language_human(); for (j = 0; j < ws->wstr_length; ++j) { wchar_t c; c = ws->wstr_text[j]; if (iswlower(c)) c = towupper(c); buffer[j] = c; } language_C(); return wstr_n_from_wc(buffer, ws->wstr_length); } wstring_ty * wstr_to_lower(const wstring_ty *ws) { static wchar_t *buffer; static size_t buflen; size_t j; if (ws->wstr_length > buflen) { buflen = ws->wstr_length; buffer = mem_change_size(buffer, buflen * sizeof(wchar_t)); } language_human(); for (j = 0; j < ws->wstr_length; ++j) { wchar_t c; c = ws->wstr_text[j]; if (iswupper(c)) c = towlower(c); buffer[j] = c; } language_C(); return wstr_n_from_wc(buffer, ws->wstr_length); } wstring_ty * wstr_to_ident(const wstring_ty *ws) { static wchar_t *buffer; static size_t buflen; size_t j; if (ws->wstr_length == 0) return wstr_from_c("_"); if (ws->wstr_length > buflen) { buflen = ws->wstr_length; buffer = mem_change_size(buffer, buflen * sizeof(wchar_t)); } language_human(); for (j = 0; j < ws->wstr_length; ++j) { wchar_t c; c = ws->wstr_text[j]; if (!iswalnum(c)) c = '_'; buffer[j] = c; } if (iswdigit(buffer[0])) buffer[0] = '_'; language_C(); return wstr_n_from_wc(buffer, ws->wstr_length); } wstring_ty * str_to_wstr(string_ty *s) { return wstr_n_from_c(s->str_text, s->str_length); } string_ty * wstr_to_str(wstring_ty *ws) { char *text; size_t length; wstr_to_mbs(ws, &text, &length); return str_n_from_c(text, length); trace(("to silence warnings\n")); } /* * NAME * wstr_equal - test equality of strings * * SYNOPSIS * int wstr_equal(wstring_ty *, wstring_ty *); * * DESCRIPTION * The wstr_equal function is used to test if two strings are equal. * * RETURNS * int; zero if the strings are not equal, nonzero if the strings are * equal. * * CAVEAT * This function is implemented as a macro in strings.h */ #ifdef wstr_equal #undef wstr_equal #endif int wstr_equal(wstring_ty *s1, wstring_ty *s2) { return (s1 == s2); } fhist-1.18/common/wstr.h 644 0 0 373011265752627 144530ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2000, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_WSTR_H #define COMMON_WSTR_H #include #include typedef unsigned long wstr_hash_ty; typedef struct wstring_ty wstring_ty; struct wstring_ty { wstr_hash_ty wstr_hash; wstring_ty *wstr_next; long wstr_references; size_t wstr_length; wchar_t wstr_text[1]; }; wstring_ty *wstr_from_c(const char *); wstring_ty *wstr_from_wc(const wchar_t *); wstring_ty *wstr_n_from_c(const char *, size_t); wstring_ty *wstr_n_from_wc(const wchar_t *, size_t); wstring_ty *wstr_copy(wstring_ty *); void wstr_free(wstring_ty *); wstring_ty *wstr_catenate(wstring_ty *, wstring_ty *); wstring_ty *wstr_cat_three(wstring_ty *, wstring_ty *, wstring_ty *); wstring_ty *wstr_to_upper(const wstring_ty *); wstring_ty *wstr_to_lower(const wstring_ty *); wstring_ty *wstr_to_ident(const wstring_ty *); void wstr_to_mbs(wstring_ty *, char **, size_t *); int wstr_equal(wstring_ty *, wstring_ty *); #ifndef DEBUG #define wstr_equal(s1, s2) ((s1) == (s2)) #endif struct string_ty; struct string_ty *wstr_to_str(wstring_ty *); wstring_ty *str_to_wstr(struct string_ty *); #endif /* COMMON_WSTR_H */ fhist-1.18/common/wstr_list.c 644 0 0 2704311265752627 155240ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include #include #include /* * NAME * wstring_list_append - append to a wide string list * * SYNOPSIS * void wstring_list_append(wstring_list_ty *wlp, wstring_ty *wp); * * DESCRIPTION * The wstring_list_append function is used to append to a wide * string list. * * CAVEAT * The wide string being appended IS copied. */ void wstring_list_append(wstring_list_ty *wlp, wstring_ty *w) { size_t nbytes; if (wlp->nitems >= wlp->nitems_max) { /* * always 8 less than a power of 2, which is * most efficient for many memory allocators */ wlp->nitems_max = wlp->nitems_max * 2 + 8; nbytes = wlp->nitems_max * sizeof(wstring_ty *); wlp->item = mem_change_size(wlp->item, nbytes); } wlp->item[wlp->nitems++] = wstr_copy(w); } void wstring_list_prepend(wstring_list_ty *wlp, wstring_ty *w) { size_t nbytes; size_t j; if (wlp->nitems >= wlp->nitems_max) { /* * always 8 less than a power of 2, which is * most efficient for many memory allocators */ wlp->nitems_max = wlp->nitems_max * 2 + 8; nbytes = wlp->nitems_max * sizeof(wstring_ty *); wlp->item = mem_change_size(wlp->item, nbytes); } for (j = wlp->nitems; j > 0; --j) wlp->item[j] = wlp->item[j - 1]; wlp->nitems++; wlp->item[0] = wstr_copy(w); } /* * NAME * wstring_list_free - free a wide string list * * SYNOPSIS * void wstring_list_free(wstring_list_ty *wlp); * * DESCRIPTION * The wstring_list_free function is used to free the contents of a * wide string list when it is finished with. * * CAVEAT * It is assumed that the contents of the wide string list were all * created using strdup() or similar, and grown using * wstring_list_append(). */ void wstring_list_free(wstring_list_ty *wlp) { size_t j; for (j = 0; j < wlp->nitems; j++) wstr_free(wlp->item[j]); if (wlp->item) mem_free(wlp->item); wlp->nitems = 0; wlp->nitems_max = 0; wlp->item = 0; } /* * NAME * wstring_list_member - wide string list membership * * SYNOPSIS * int wstring_list_member(wstring_list_ty *wlp, wstring_ty *wp); * * DESCRIPTION * The wstring_list_member function is used to determine if the * given wide string is contained in the given wide string list. * * RETURNS * A zero if the wide string is not in the list, and a non-zero if it * is. */ int wstring_list_member(wstring_list_ty *wlp, wstring_ty *w) { size_t j; for (j = 0; j < wlp->nitems; j++) if (wstr_equal(wlp->item[j], w)) return 1; return 0; } /* * NAME * wstring_list_copy - copy a wide string list * * SYNOPSIS * void wstring_list_copy(wstring_list_ty *to, wstring_list_ty *from); * * DESCRIPTION * The wstring_listl_copy function is used to copy wide string lists. * * RETURNS * A copy of the 'to' wide string list is placed in 'from'. * * CAVEAT * It is the responsibility of the caller to ensure that the new * wide string list is freed when finished with, by a call to * wstring_list_free(). */ void wstring_list_copy(wstring_list_ty *to, wstring_list_ty *from) { size_t j; wstring_list_zero(to); for (j = 0; j < from->nitems; j++) wstring_list_append(to, wstr_copy(from->item[j])); } /* * NAME * wstring_list_to_wstring - form a string from a wide string list * * SYNOPSIS * wstring_ty *wstring_list_to_wstring(wstring_list_ty *wlp, int start, * int stop, char *sep); * * DESCRIPTION * The wstring_list_to_wstring function is used to form a string * from a wide string list. * * RETURNS * A pointer to the newly formed string in dynamic memory. * * CAVEAT * It is the responsibility of the caller to ensure that the * new string is freed when finished with, by a call to free(). */ wstring_ty * wstring_list_to_wstring(wstring_list_ty *wl, int start, int stop, char *sep) { int j, k; static wchar_t *tmp; static size_t tmplen; size_t length; size_t seplen; wchar_t *pos; wstring_ty *s; if (!sep) sep = " "; seplen = strlen(sep); length = 0; for (j = start; j <= stop && j < wl->nitems; ++j) { s = wl->item[j]; if (s->wstr_length) { if (length) length += seplen; length += s->wstr_length; } } if (tmplen < length) { tmplen = length; tmp = mem_change_size(tmp, tmplen * sizeof(wchar_t)); } pos = tmp; for (j = start; j <= stop && j < wl->nitems; j++) { s = wl->item[j]; if (s->wstr_length) { if (pos != tmp) { for (k = 0; k < seplen; ++k) *pos++ = sep[k]; } memcpy ( pos, s->wstr_text, s->wstr_length * sizeof(wchar_t) ); pos += s->wstr_length; } } s = wstr_n_from_wc(tmp, length); return s; } static int wc_find(char *s, wchar_t c) { while (*s) { if (*s == c) return 1; ++s; } return 0; } /* * NAME * wstring_to_wstring_list - string to wide string list * * SYNOPSIS * void wstring_to_wstring_list(wstring_list_ty *wlp, wstring_ty *s, * char *sep, int ewhite); * * DESCRIPTION * The wstring_to_wstring_list function is used to form a wide string * list from a string. * * ARGUMENTS * wlp - where to put the wide string list * s - string to break * sep - separators, default to " " if 0 given * ewhite - supress extra white space around separators * * RETURNS * The string is broken on spaces into words, * using strndup() and wstring_list_append(). * * CAVEAT * Quoting is not understood. */ void wstring_to_wstring_list(wstring_list_ty *slp, wstring_ty *s, char *sep, int ewhite) { static char white[] = " \t\n\f\r"; wchar_t *cp; int more; if (!sep) { sep = white; ewhite = 1; } wstring_list_zero(slp); cp = s->wstr_text; more = 0; while (*cp || more) { wstring_ty *w; wchar_t *cp1; wchar_t *cp2; if (ewhite) while (wc_find(white, *cp)) cp++; if (!*cp && !more) break; more = 0; cp1 = cp; while (*cp && !wc_find(sep, *cp)) cp++; if (*cp) { cp2 = cp + 1; more = 1; } else cp2 = cp; if (ewhite) while (cp > cp1 && wc_find(white, cp[-1])) cp--; w = wstr_n_from_wc(cp1, cp - cp1); wstring_list_append(slp, w); wstr_free(w); cp = cp2; } } /* * NAME * wstring_list_insert - a insert a wide string into a list * * SYNOPSIS * void wstring_list_insert(wstring_list_ty *wlp, wstring_ty *wp); * * DESCRIPTION * The wstring_list_insert function is similar to the * wstring_list_append function, however it does not append the * wide string unless it is not already in the list. * * CAVEAT * If the wide string is inserted it is copied. */ void wstring_list_append_unique(wstring_list_ty *wlp, wstring_ty *wp) { size_t j; for (j = 0; j < wlp->nitems; j++) if (wstr_equal(wlp->item[j], wp)) return; wstring_list_append(wlp, wp); } /* * NAME * wstring_list_delete - remove list member * * SYNOPSIS * void wstring_list_delete(wstring_list_ty *wlp, wstring_ty *wp); * * DESCRIPTION * The wstring_list_delete function is used to delete a member of a * wide string list. * * RETURNS * void */ void wstring_list_delete(wstring_list_ty *wlp, wstring_ty *wp) { size_t j; size_t k; for (j = 0; j < wlp->nitems; ++j) { if (wstr_equal(wlp->item[j], wp)) { wlp->nitems--; for (k = j; k < wlp->nitems; ++k) wlp->item[k] = wlp->item[k + 1]; wstr_free(wp); break; } } } void wstring_list_zero(wstring_list_ty *wlp) { wlp->nitems = 0; wlp->nitems_max = 0; wlp->item = 0; } int wstring_list_equal(wstring_list_ty *a, wstring_list_ty *b) { size_t j, k; for (j = 0; j < a->nitems; ++j) { for (k = 0; k < b->nitems; ++k) if (wstr_equal(a->item[j], b->item[k])) break; if (k >= b->nitems) return 0; } for (j = 0; j < b->nitems; ++j) { for (k = 0; k < a->nitems; ++k) if (wstr_equal(b->item[j], a->item[k])) break; if (k >= a->nitems) return 0; } return 1; } int wstring_list_subset(wstring_list_ty *a, wstring_list_ty *b) { size_t j, k; /* * test if "a is a subset of b" */ if (a->nitems > b->nitems) return 0; for (j = 0; j < a->nitems; ++j) { for (k = 0; k < b->nitems; ++k) if (wstr_equal(a->item[j], b->item[k])) break; if (k >= b->nitems) return 0; } return 1; } fhist-1.18/common/wstr_list.h 644 0 0 344211265752627 155060ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ #ifndef COMMON_WSTR_LIST_H #define COMMON_WSTR_LIST_H #include typedef struct wstring_list_ty wstring_list_ty; struct wstring_list_ty { size_t nitems; size_t nitems_max; wstring_ty **item; }; int wstring_list_member(wstring_list_ty *, wstring_ty *); wstring_ty *wstring_list_to_wstring(wstring_list_ty *, int, int, char *); void wstring_to_wstring_list(wstring_list_ty *, wstring_ty *, char *, int); void wstring_list_prepend(wstring_list_ty *, wstring_ty *); void wstring_list_append(wstring_list_ty *, wstring_ty *); void wstring_list_append_unique(wstring_list_ty *, wstring_ty *); void wstring_list_copy(wstring_list_ty *, wstring_list_ty *); void wstring_list_delete(wstring_list_ty *, wstring_ty *); void wstring_list_free(wstring_list_ty *); void wstring_list_zero(wstring_list_ty *); int wstring_list_equal(wstring_list_ty *, wstring_list_ty *); int wstring_list_subset(wstring_list_ty *, wstring_list_ty *); #endif /* COMMON_WSTR_LIST_H */ fhist-1.18/configure 755 0 0 51704311265752627 137710ustar PeterMiller 0 0#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.64. # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software # Foundation, Inc. # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error ERROR [LINENO LOG_FD] # --------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with status $?, using 1 if that was 0. as_fn_error () { as_status=$?; test $as_status -eq 0 && as_status=1 if test "$3"; then as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 fi $as_echo "$as_me: error: $1" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= PACKAGE_URL= ac_unique_file="install-sh" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS NLSDIR PROGRAM_SUFFIX PROGRAM_PREFIX have_groff internationalization SH GROFF MSGCAT MSGFMT SOELIM EGREP GREP RANLIB YFLAGS YACC INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM CPP OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_nlsdir ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP YACC YFLAGS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error "unrecognized option: \`$ac_option' Try \`$0 --help' for more information." ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-nlsdir=PATH specify where the locale stuff should go Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor YACC The `Yet Another C Compiler' implementation to use. Defaults to the first program found out of: `bison -y', `byacc', `yacc'. YFLAGS The list of arguments that will be passed by default to $YACC. This script will default YFLAGS to the empty string to avoid a default value of `-d' given by some make applications. Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure generated by GNU Autoconf 2.64 Copyright (C) 2009 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} return $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} return $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} return $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} return $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_type # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.64. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then ac_site_file1=$CONFIG_SITE elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers common/config.h" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "no acceptable C compiler found in \$PATH See \`config.log' for more details." "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 rm -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out conftest.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } if test -z "$ac_file"; then : $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { as_fn_set_status 77 as_fn_error "C compiler cannot create executables See \`config.log' for more details." "$LINENO" 5; }; } fi ac_exeext=$ac_cv_exeext # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out conftest.out ac_clean_files=$ac_clean_files_save # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." "$LINENO" 5; } fi rm -f conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if test "${ac_cv_objext+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot compute suffix of object files: cannot compile See \`config.log' for more details." "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do for ac_t in install-sh install.sh shtool; do if test -f "$ac_dir/$ac_t"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/$ac_t -c" break 2 fi done done if test -z "$ac_aux_dir"; then as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' for ac_prog in 'bison -y' byacc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_YACC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$YACC"; then ac_cv_prog_YACC="$YACC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_YACC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi YACC=$ac_cv_prog_YACC if test -n "$YACC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 $as_echo "$YACC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$YACC" && break done test -n "$YACC" || YACC="yacc" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_RANLIB+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if test "${ac_cv_path_GREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if test "${ac_cv_path_EGREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if test "${ac_cv_header_stdc+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" if test "x$ac_cv_header_minix_config_h" = x""yes; then : MINIX=yes else MINIX= fi if test "$MINIX" = yes; then $as_echo "#define _POSIX_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h $as_echo "#define _MINIX 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 $as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } if test "${ac_cv_safe_to_define___extensions__+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define __EXTENSIONS__ 1 $ac_includes_default int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_safe_to_define___extensions__=yes else ac_cv_safe_to_define___extensions__=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 $as_echo "$ac_cv_safe_to_define___extensions__" >&6; } test $ac_cv_safe_to_define___extensions__ = yes && $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h $as_echo "#define _ALL_SOURCE 1" >>confdefs.h $as_echo "#define _GNU_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing strerror" >&5 $as_echo_n "checking for library containing strerror... " >&6; } if test "${ac_cv_search_strerror+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char strerror (); int main () { return strerror (); ; return 0; } _ACEOF for ac_lib in '' cposix; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_strerror=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if test "${ac_cv_search_strerror+set}" = set; then : break fi done if test "${ac_cv_search_strerror+set}" = set; then : else ac_cv_search_strerror=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_strerror" >&5 $as_echo "$ac_cv_search_strerror" >&6; } ac_res=$ac_cv_search_strerror if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lw32" >&5 $as_echo_n "checking for main in -lw32... " >&6; } if test "${ac_cv_lib_w32_main+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lw32 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_w32_main=yes else ac_cv_lib_w32_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_w32_main" >&5 $as_echo "$ac_cv_lib_w32_main" >&6; } if test "x$ac_cv_lib_w32_main" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBW32 1 _ACEOF LIBS="-lw32 $LIBS" fi ac_cv_lib_w32=ac_cv_lib_w32_main { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lw" >&5 $as_echo_n "checking for main in -lw... " >&6; } if test "${ac_cv_lib_w_main+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lw $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_w_main=yes else ac_cv_lib_w_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_w_main" >&5 $as_echo "$ac_cv_lib_w_main" >&6; } if test "x$ac_cv_lib_w_main" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBW 1 _ACEOF LIBS="-lw $LIBS" fi ac_cv_lib_w=ac_cv_lib_w_main { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lintl" >&5 $as_echo_n "checking for main in -lintl... " >&6; } if test "${ac_cv_lib_intl_main+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_main=yes else ac_cv_lib_intl_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_main" >&5 $as_echo "$ac_cv_lib_intl_main" >&6; } if test "x$ac_cv_lib_intl_main" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBINTL 1 _ACEOF LIBS="-lintl $LIBS" fi ac_cv_lib_intl=ac_cv_lib_intl_main for ac_prog in roffpp gsoelim soelim do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_SOELIM+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$SOELIM"; then ac_cv_prog_SOELIM="$SOELIM" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_SOELIM="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi SOELIM=$ac_cv_prog_SOELIM if test -n "$SOELIM"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SOELIM" >&5 $as_echo "$SOELIM" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$SOELIM" && break done for ac_prog in gmsgfmt msgfmt do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_MSGFMT+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$MSGFMT"; then ac_cv_prog_MSGFMT="$MSGFMT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_MSGFMT="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MSGFMT=$ac_cv_prog_MSGFMT if test -n "$MSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$MSGFMT" && break done test -n "$MSGFMT" || MSGFMT="msgfmt" for ac_prog in gmsgcat msgcat do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_MSGCAT+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$MSGCAT"; then ac_cv_prog_MSGCAT="$MSGCAT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_MSGCAT="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MSGCAT=$ac_cv_prog_MSGCAT if test -n "$MSGCAT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGCAT" >&5 $as_echo "$MSGCAT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$MSGCAT" && break done for ac_prog in groff roff do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_GROFF+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$GROFF"; then ac_cv_prog_GROFF="$GROFF" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_GROFF="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi GROFF=$ac_cv_prog_GROFF if test -n "$GROFF"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GROFF" >&5 $as_echo "$GROFF" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$GROFF" && break done if test -n "$SOELIM"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking that $SOELIM understands the -I option" >&5 $as_echo_n "checking that $SOELIM understands the -I option... " >&6; } echo ".so version.so" > conftest.in 2>&5 $SOELIM -Ietc -Ibl/etc -Iblbl/etc conftest.in > conftest.out 2>&5 if grep 1998 conftest.out 1>&5 2>&5; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: The FHist documentation set and manual pages" >&5 $as_echo " The FHist documentation set and manual pages" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: will be formatted and installed installed if" >&5 $as_echo " will be formatted and installed installed if" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: you first install GNU Groff 1.15 or later and then" >&5 $as_echo " you first install GNU Groff 1.15 or later and then" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: re-run this ./configure script. Remember to" >&5 $as_echo " re-run this ./configure script. Remember to" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: use \`\`rm config.cache'' before you do." >&5 $as_echo " use \`\`rm config.cache'' before you do." >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } SOELIM= fi rm -rf conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TIOCGWINSZ" >&5 $as_echo_n "checking for TIOCGWINSZ... " >&6; } if test "$cross_compiling" = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: cross" >&5 $as_echo "cross" >&6; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main(argc, argv)int argc; char **argv;{ #ifdef TIOCGWINSZ struct winsize ws; ws.ws_col = 0; exit(ws.ws_col); #else exit(1); #endif } _ACEOF if ac_fn_c_try_run "$LINENO"; then : $as_echo "#define HAVE_winsize_SYS_IOCTL_H 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: sys/ioctl.h" >&5 $as_echo "sys/ioctl.h" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct winsize" >&5 $as_echo_n "checking for struct winsize... " >&6; } if test "$cross_compiling" = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: cross" >&5 $as_echo "cross" >&6; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main(argc, argv)int argc; char **argv;{ #ifdef TIOCGWINSZ struct winsize ws; ws.ws_col = 0; exit(ws.ws_col); #else exit(1); #endif } _ACEOF if ac_fn_c_try_run "$LINENO"; then : $as_echo "#define HAVE_winsize_TERMIOS_H 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: termios.h" >&5 $as_echo "termios.h" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi for ac_header in iso646.h libgettext.h libintl.h limits.h locale.h memory.h \ stddef.h stdlib.h string.h unistd.h wchar.h wctype.h widec.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_ac_Header { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if test "${ac_cv_search_opendir+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if test "${ac_cv_search_opendir+set}" = set; then : break fi done if test "${ac_cv_search_opendir+set}" = set; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if test "${ac_cv_search_opendir+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if test "${ac_cv_search_opendir+set}" = set; then : break fi done if test "${ac_cv_search_opendir+set}" = set; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 $as_echo_n "checking return type of signal handlers... " >&6; } if test "${ac_cv_type_signal+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_type_signal=int else ac_cv_type_signal=void fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 $as_echo "$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF #define RETSIGTYPE $ac_cv_type_signal _ACEOF ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = x""yes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if test "${ac_cv_header_time+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if test "${ac_cv_c_const+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { /* FIXME: Include the comments suggested by Paul. */ #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; const charset cs; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this. */ char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; }; struct s *b; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for long file names" >&5 $as_echo_n "checking for long file names... " >&6; } if test "${ac_cv_sys_long_file_names+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_cv_sys_long_file_names=yes # Test for long file names in all the places we know might matter: # . the current directory, where building will happen # $prefix/lib where we will be installing things # $exec_prefix/lib likewise # $TMPDIR if set, where it might want to write temporary files # /tmp where it might want to write temporary files # /var/tmp likewise # /usr/tmp likewise for ac_dir in . "$TMPDIR" /tmp /var/tmp /usr/tmp "$prefix/lib" "$exec_prefix/lib"; do # Skip $TMPDIR if it is empty or bogus, and skip $exec_prefix/lib # in the usual case where exec_prefix is '${prefix}'. case $ac_dir in #( . | /* | ?:[\\/]*) ;; #( *) continue;; esac test -w "$ac_dir/." || continue # It is less confusing to not echo anything here. ac_xdir=$ac_dir/cf$$ (umask 077 && mkdir "$ac_xdir" 2>/dev/null) || continue ac_tf1=$ac_xdir/conftest9012345 ac_tf2=$ac_xdir/conftest9012346 touch "$ac_tf1" 2>/dev/null && test -f "$ac_tf1" && test ! -f "$ac_tf2" || ac_cv_sys_long_file_names=no rm -f -r "$ac_xdir" 2>/dev/null test $ac_cv_sys_long_file_names = no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_long_file_names" >&5 $as_echo "$ac_cv_sys_long_file_names" >&6; } if test $ac_cv_sys_long_file_names = yes; then $as_echo "#define HAVE_LONG_FILE_NAMES 1" >>confdefs.h fi for ac_func in atexit getpgrp gettext iswctype rename setlocale \ sighold sigprocmask strcasecmp strerror strftime strsignal tcgetpgrp \ wcslen do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" eval as_val=\$$as_ac_var if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wint_t" >&5 $as_echo_n "checking for wint_t... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef HAVE_WCHAR_H #include #endif int main () { wint_t x; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : $as_echo "#define HAVE_WINT_T 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iswprint" >&5 $as_echo_n "checking for working iswprint... " >&6; } if test "$cross_compiling" = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: cross" >&5 $as_echo "cross" >&6; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef HAVE_WIDEC_H #include #endif #ifdef HAVE_WCTYPE_H #include #endif int main(argc,argv)int argc;char**argv;{ exit(iswprint('a') == 0);} _ACEOF if ac_fn_c_try_run "$LINENO"; then : $as_echo "#define HAVE_ISWPRINT 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for appropriate getpgrp argument" >&5 $as_echo_n "checking for appropriate getpgrp argument... " >&6; } if test "$cross_compiling" = yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: cross" >&5 $as_echo "cross" >&6; } else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(argc, argv) int argc; char **argv; { #ifdef HAVE_GETPGRP if (getpgrp(32767) == getpgrp(0)) exit(2); #endif exit(0); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : $as_echo "#define CONF_getpgrp_arg 0" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: zero" >&5 $as_echo "zero" >&6; } else $as_echo "#define CONF_getpgrp_arg /**/" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: empty" >&5 $as_echo "empty" >&6; } fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a Bourne shell which understands functions" >&5 $as_echo_n "checking for a Bourne shell which understands functions... " >&6; } if test "z$SH" = "z"; then if test -f /bin/sh5; then SH=/bin/sh5 else SH=/bin/sh fi fi cat >>confdefs.h <<_ACEOF #define CONF_SHELL "$SH" _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SH" >&5 $as_echo "$SH" >&6; } if test "$ac_cv_func_gettext" = "yes" then internationalization=yes else internationalization=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: FHist will emit much more useful error messages" >&5 $as_echo " FHist will emit much more useful error messages" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: if you install GNU \`\`gettext'' and then" >&5 $as_echo " if you install GNU \`\`gettext'' and then" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: re-run this ./configure script. Remember to" >&5 $as_echo " re-run this ./configure script. Remember to" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: use \`\`rm config.cache'' before you do." >&5 $as_echo " use \`\`rm config.cache'' before you do." >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } fi if test -n "$GROFF" then if test -n "$SOELIM"; then have_groff=yes else have_groff=no fi else have_groff=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: The FHist documentation set and manual pages" >&5 $as_echo " The FHist documentation set and manual pages" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: will be formatted and installed installed if" >&5 $as_echo " will be formatted and installed installed if" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: you first install GNU Groff and then" >&5 $as_echo " you first install GNU Groff and then" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: re-run this ./configure script. Remember to" >&5 $as_echo " re-run this ./configure script. Remember to" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: use \`\`rm config.cache'' before you do." >&5 $as_echo " use \`\`rm config.cache'' before you do." >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } fi # program prefix is the bit to add to the start of the name if test ${PROGRAM_PREFIX-NONE} != NONE -a ${program_prefix-NONE} != NONE; then PROGRAM_PREFIX=${program_prefix} fi # program suffix is the bit to add to the end of the name (before .exe) if test ${PROGRAM_SUFFIX-NONE} != NONE -a ${program_suffix-NONE} != NONE; then PROGRAM_SUFFIX=${program_suffix} fi test "x$prefix" = xNONE && prefix="${ac_default_prefix-/usr/local}" test "x$exec_prefix" = xNONE && exec_prefix="$prefix" eval "exec_prefix=$exec_prefix" eval "bindir=$bindir" eval "mandir=$mandir" eval "libdir=$libdir" eval "datadir=$datadir" eval "sharedstatedir=$sharedstatedir" case "$datadir" in */fhist/* | */fhist ) ;; *) datadir="${datadir}/fhist" ;; esac case "$libdir" in */fhist/* | */fhist ) ;; *) libdir="${libdir}/fhist" ;; esac case "$sharedstatedir" in */fhist/* | */fhist ) ;; *) sharedstatedir="${sharedstatedir}/fhist" ;; esac # Check whether --with-nlsdir was given. if test "${with_nlsdir+set}" = set; then : withval=$with_nlsdir; fi if test "x$NLSDIR" = "x"; then if test "x$with_nlsdir" != "x"; then NLSDIR=$with_nlsdir else NLSDIR=${libdir} fi fi ac_config_files="$ac_config_files Makefile etc/libdir-h" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then test "x$cache_file" != "x/dev/null" && { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : ${CONFIG_STATUS=./config.status} ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error ERROR [LINENO LOG_FD] # --------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with status $?, using 1 if that was 0. as_fn_error () { as_status=$?; test $as_status -eq 0 && as_status=1 if test "$3"; then as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 fi $as_echo "$as_me: error: $1" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.64. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.64, with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2009 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "common/config.h") CONFIG_HEADERS="$CONFIG_HEADERS common/config.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "etc/libdir-h") CONFIG_FILES="$CONFIG_FILES etc/libdir-h" ;; *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\).*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\).*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ || as_fn_error "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_t=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_t"; then break elif $ac_last_try; then as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin" \ || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ || as_fn_error "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&2;} rm -f "$tmp/stdin" case $ac_file in -) cat "$tmp/out" && rm -f "$tmp/out";; *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; esac \ || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" } >"$tmp/config.h" \ || as_fn_error "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$tmp/config.h" "$ac_file" \ || as_fn_error "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit $? fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi fhist-1.18/etc/CHANGES.1.0 644 0 0 6355611265752627 141120ustar PeterMiller 0 0 Project "fhist" Page 1 List of Changes Wed Feb 10 16:23:13 1993 Change State Description ------- ------- ------------- 1 completed place under aegis 2 completed move into self-named directories 3 completed add export files 4 completed improve command line argument treatment 5 completed Map lines into a cannonical form for comparison when the -Upcase or -Space options are used with fhist. 6 completed add more prototypes, and checking for prototypes 7 completed change to use stdio rather than its own fileio 8 completed move fhist/unix o fhist/breaks 9 completed fcomp sometimes dumps core 10 being_ fix bug in fcomp integrated Project "fhist", Change 1 Page 1 Change Details Wed Feb 10 16:23:15 1993 NAME Project "fhist", Delta 1, Change 1. SUMMARY place under aegis DESCRIPTION place under aegis This change is exempt from testing against the baseline. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- ------- ------- ----------- source create 1 aux/Howto.cook source create 1 config source create 1 orig/MANIFEST source create 1 orig/Makefile source create 1 orig/README source create 1 orig/cmalloc.c source create 1 orig/cmalloc.h source create 1 orig/dos.c source create 1 orig/fcomp.1 source create 1 orig/fcomp.h source create 1 orig/fcomp_main.c source create 1 orig/fcomp_work.c source create 1 orig/fhist.1 source create 1 orig/fhist.h source create 1 orig/fhist_diff.c source create 1 orig/fhist_extr.c source create 1 orig/fhist_list.c source create 1 orig/fhist_main.c source create 1 orig/fhist_modl.c source create 1 orig/fhist_name.c source create 1 orig/fhist_prun.c source create 1 orig/fhist_subr.c source create 1 orig/fhist_upda.c source create 1 orig/fileio.c source create 1 orig/fileio.h source create 1 orig/fmerg_main.c source create 1 orig/fmerg_work.c source create 1 orig/fmerge.1 source create 1 orig/main.h source create 1 orig/unix.c test create 1 test/00/t0001a.sh test create 1 test/00/t0002a.sh test create 1 test/00/t0003a.sh test create 1 test/00/t0004a.sh test create 1 test/00/t0005a.sh test create 1 test/00/t0006a.sh test create 1 test/00/t0007a.sh test create 1 test/00/t0008a.sh test create 1 test/00/t0009a.sh test create 1 test/00/t0010a.sh Project "fhist", Change 1 Page 2 Change Details Wed Feb 10 16:23:15 1993 HISTORY What When Who Comment ------ ------ ----- --------- new_change Sun Jun 14 pmiller 21:28:05 1992 develop_begin Sun Jun 14 pmiller Elapsed time: 153.977 21:28:45 1992 days. develop_end Thu Jan 14 pmiller 22:18:37 1993 review_pass Thu Jan 14 pmiller 22:18:47 1993 integrate_begin Thu Jan 14 pmiller 22:19:00 1993 integrate_pass Thu Jan 14 pmiller 22:20:57 1993 Project "fhist", Change 2 Page 1 Change Details Wed Feb 10 16:23:15 1993 NAME Project "fhist", Delta 2, Change 2. SUMMARY move into self-named directories DESCRIPTION Move the source file for each program into a self-named directory, and common files into the common directory. This change is exempt from testing. This change is exempt from testing against the baseline. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- ------- ------- ----------- source modify 2 aux/Howto.cook source create 1 common/cmalloc.c source create 1 common/cmalloc.h source create 1 common/compare.c source create 1 common/compare.h source create 1 common/fileio.c source create 1 common/fileio.h source create 1 common/main.h source create 1 fcomp/main.c source create 1 fhist/diff.c source create 1 fhist/extract.c source create 1 fhist/fhist.h source create 1 fhist/list.c source create 1 fhist/main.c source create 1 fhist/modlin.c source create 1 fhist/name.c source create 1 fhist/prune.c source create 1 fhist/subroutine.c source create 1 fhist/unix.c source create 1 fhist/update.c source create 1 fmerge/main.c source create 1 fmerge/work.c source remove 1 orig/cmalloc.c source remove 1 orig/cmalloc.h source remove 1 orig/fcomp.h source remove 1 orig/fcomp_main.c source remove 1 orig/fcomp_work.c source remove 1 orig/fhist.h source remove 1 orig/fhist_diff.c source remove 1 orig/fhist_extr.c source remove 1 orig/fhist_list.c source remove 1 orig/fhist_main.c source remove 1 orig/fhist_name.c source remove 1 orig/fhist_prun.c source remove 1 orig/fhist_subr.c source remove 1 orig/fhist_upda.c source remove 1 orig/fileio.c source remove 1 orig/fileio.h Project "fhist", Change 2 Page 2 Change Details Wed Feb 10 16:23:15 1993 Type Action Edit File Name ------- ------- ------- ----------- source remove 1 orig/fmerg_main.c source remove 1 orig/fmerg_work.c source remove 1 orig/main.h source remove 1 orig/unix.c HISTORY What When Who Comment ------ ------ ----- --------- new_change Thu Jan 14 pmiller 22:22:56 1993 develop_begin Thu Jan 14 pmiller Elapsed time: 0.000 22:23:10 1993 days. develop_end Fri Jan 15 pmiller 09:59:50 1993 review_pass Fri Jan 15 pmiller 09:59:55 1993 integrate_begin Fri Jan 15 pmiller 10:00:18 1993 integrate_pass Fri Jan 15 pmiller 10:02:48 1993 Project "fhist", Change 3 Page 1 Change Details Wed Feb 10 16:23:16 1993 NAME Project "fhist", Delta 5, Change 3. SUMMARY add export files DESCRIPTION 1. add the README file 2. add the Makefile tile 3. add the CHANGES file 4. add the BUILDING file 5. add the MANIFEST file This change is exempt from testing. This change is exempt from testing against the baseline. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- ------- ------- ----------- source create 1 aux/BUILDING.man source create 1 aux/CHANGES.sh source modify 3 aux/Howto.cook source create 1 aux/MANIFEST.sh source create 1 aux/Makefile.awk source create 1 aux/Makefile.sh source create 1 aux/README.man source modify 2 common/cmalloc.c source modify 2 common/cmalloc.h source modify 2 common/compare.c source modify 2 common/compare.h source modify 2 common/fileio.c source modify 2 common/fileio.h source modify 2 common/main.h source modify 2 config source modify 2 fcomp/main.c source modify 2 fhist/diff.c source modify 2 fhist/extract.c source modify 2 fhist/fhist.h source modify 2 fhist/list.c source modify 2 fhist/main.c source modify 2 fhist/modlin.c source modify 2 fhist/name.c source modify 2 fhist/prune.c source modify 2 fhist/subroutine.c source modify 2 fhist/unix.c source modify 2 fhist/update.c source modify 2 fmerge/main.c source modify 2 fmerge/work.c source create 1 man1/fcomp.1 source create 1 man1/fhist.1 source create 1 man1/fmerge.1 source remove 1 orig/README source remove 1 orig/fcomp.1 source remove 1 orig/fhist.1 Project "fhist", Change 3 Page 2 Change Details Wed Feb 10 16:23:16 1993 Type Action Edit File Name ------- ------- ------- ----------- source remove 1 orig/fhist_modl.c source remove 1 orig/fmerge.1 HISTORY What When Who Comment ------ ------ ----- --------- new_change Fri Jan 15 pmiller 10:04:26 1993 develop_begin Fri Jan 15 pmiller Elapsed time: 0.823 10:04:31 1993 days. develop_end Mon Jan 18 pmiller 08:45:05 1993 review_pass Mon Jan 18 pmiller 08:47:50 1993 integrate_begin Mon Jan 18 pmiller 08:48:14 1993 integrate_fail Mon Jan 18 pmiller forgot to add the 08:50:38 1993 CHANGES.sh file to the change develop_end Mon Jan 18 pmiller 08:55:54 1993 review_pass Mon Jan 18 pmiller 08:56:09 1993 integrate_begin Mon Jan 18 pmiller 08:56:41 1993 integrate_fail Mon Jan 18 pmiller forgot to add the 08:58:45 1993 CHANGES.sh file to the change Elapsed time: 0.044 days. develop_end Mon Jan 18 pmiller 09:18:37 1993 review_pass Mon Jan 18 pmiller 09:18:43 1993 integrate_begin Mon Jan 18 pmiller 09:19:01 1993 integrate_pass Mon Jan 18 pmiller 09:22:59 1993 Project "fhist", Change 4 Page 1 Change Details Wed Feb 10 16:23:17 1993 NAME Project "fhist", Delta 6, Change 4. SUMMARY improve command line argument treatment DESCRIPTION 1. Command line argument processing, similar to that used in cook and aegis, has been added. 2. more regular treatment of errors has been added, using the error code from cook and aegis, to wrap long error messages. 3. more consitent handling of dynamic memory and dynamic memory errors has been added. 4. the -Help option has been extended for all programs, and a - VERSion option added. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- ------- ------- ----------- source create 1 common/ansi.c source create 1 common/arglex.c source create 1 common/arglex.h source modify 3 common/cmalloc.c source modify 3 common/cmalloc.h source modify 3 common/compare.c source modify 3 common/compare.h source create 1 common/error.c source create 1 common/error.h source modify 3 common/fileio.c source create 1 common/help.c source create 1 common/help.h source modify 3 common/main.h source create 1 common/s-v-arg.h source create 1 common/version.c source create 1 common/version.h source modify 3 config source modify 3 fcomp/main.c source modify 3 fhist/diff.c source modify 3 fhist/extract.c source modify 3 fhist/list.c source modify 3 fhist/main.c source modify 3 fhist/modlin.c source modify 3 fhist/name.c source modify 3 fhist/prune.c source modify 3 fhist/subroutine.c source modify 3 fhist/unix.c source modify 3 fhist/update.c source modify 3 fmerge/main.c source modify 3 fmerge/work.c source modify 2 man1/fcomp.1 source modify 2 man1/fhist.1 source modify 2 man1/fmerge.1 source remove 1 orig/MANIFEST source remove 1 orig/Makefile Project "fhist", Change 4 Page 2 Change Details Wed Feb 10 16:23:17 1993 Type Action Edit File Name ------- ------- ------- ----------- source remove 1 orig/dos.c test create 1 test/00/t0011a.sh HISTORY What When Who Comment ------ ------ ----- --------- new_change Mon Jan 18 pmiller 09:24:48 1993 develop_begin Mon Jan 18 pmiller Elapsed time: 1.665 09:24:52 1993 days. develop_end Tue Jan 19 pmiller 14:23:56 1993 review_pass Tue Jan 19 pmiller 14:24:02 1993 integrate_begin Tue Jan 19 pmiller 14:24:17 1993 integrate_pass Tue Jan 19 pmiller 14:31:22 1993 Project "fhist", Change 5 Page 1 Change Details Wed Feb 10 16:23:18 1993 NAME Project "fhist", Delta 7, Change 5. SUMMARY Map lines into a cannonical form for comparison when the - Upcase or -Space options are used with fhist. DESCRIPTION Map lines into a cannonical form for comparison when the - Upcase or -Space options are used with fhist. CAUSE This change was caused by internal_bug. FILES Type Action Edit File Name ------- ------- ------- ----------- source modify 4 common/cmalloc.c source modify 4 common/compare.c source modify 4 common/compare.h source modify 4 fcomp/main.c source modify 3 fhist/fhist.h source modify 4 fmerge/main.c test create 1 test/00/t0012a.sh HISTORY What When Who Comment ------ ------ ----- --------- new_change Tue Jan 19 pmiller 14:33:46 1993 develop_begin Tue Jan 19 pmiller Elapsed time: 0.917 14:33:50 1993 days. develop_end Tue Jan 19 pmiller 21:26:28 1993 review_pass Tue Jan 19 pmiller 21:26:33 1993 integrate_begin Tue Jan 19 pmiller 21:26:53 1993 integrate_pass Tue Jan 19 pmiller 21:30:33 1993 Project "fhist", Change 6 Page 1 Change Details Wed Feb 10 16:23:18 1993 NAME Project "fhist", Delta 8, Change 6. SUMMARY add more prototypes, and checking for prototypes DESCRIPTION 1. the build was changed to use the -Wstrict-prototypes and - Wmissing-prototypes options of gcc, thus generating warnings for all instances of the use of a function without a prototype. 2. problems thus relealed were fixed, usually by the addition of interface definition include files. This change is exempt from testing. This change is exempt from testing against the baseline. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- ------- ------- ----------- source modify 4 aux/Howto.cook source modify 2 common/ansi.c source modify 4 common/cmalloc.h source modify 5 common/compare.c source modify 5 common/compare.h source modify 4 common/fileio.c source modify 5 fcomp/main.c source modify 4 fhist/diff.c source create 1 fhist/diff.h source modify 4 fhist/extract.c source create 1 fhist/extract.h source modify 4 fhist/fhist.h source modify 4 fhist/list.c source create 1 fhist/list.h source modify 4 fhist/main.c source modify 4 fhist/modlin.c source create 1 fhist/modlin.h source modify 4 fhist/name.c source create 1 fhist/name.h source modify 4 fhist/prune.c source create 1 fhist/prune.h source modify 4 fhist/subroutine.c source create 1 fhist/subroutine.h source modify 4 fhist/unix.c source create 1 fhist/unix.h source modify 4 fhist/update.c source create 1 fhist/update.h source modify 5 fmerge/main.c source modify 4 fmerge/work.c source create 1 fmerge/work.h Project "fhist", Change 6 Page 2 Change Details Wed Feb 10 16:23:18 1993 HISTORY What When Who Comment ------ ------ ----- --------- new_change Tue Jan 19 pmiller 21:32:30 1993 develop_begin Tue Jan 19 pmiller Elapsed time: 0.000 21:32:34 1993 days. develop_end Wed Jan 20 pmiller 13:59:50 1993 review_pass Wed Jan 20 pmiller 13:59:56 1993 integrate_begin Wed Jan 20 pmiller 14:00:15 1993 integrate_pass Wed Jan 20 pmiller 14:06:36 1993 Project "fhist", Change 7 Page 1 Change Details Wed Feb 10 16:23:19 1993 NAME Project "fhist", Delta 9, Change 7. SUMMARY change to use stdio rather than its own fileio DESCRIPTION change to use stdio rather than its own fileio This change is exempt from testing. This change is exempt from testing against the baseline. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- ------- ------- ----------- source modify 6 common/compare.c source modify 6 common/compare.h source modify 5 common/fileio.c source modify 3 common/fileio.h source modify 5 fhist/diff.c source modify 5 fhist/extract.c source modify 5 fhist/fhist.h source modify 5 fhist/list.c source modify 5 fhist/main.c source modify 5 fhist/modlin.c source modify 5 fhist/name.c source modify 5 fhist/prune.c source modify 5 fhist/subroutine.c source modify 2 fhist/subroutine.h source modify 5 fhist/update.c source modify 6 fmerge/main.c source modify 5 fmerge/work.c HISTORY What When Who Comment ------ ------ ----- --------- new_change Wed Jan 20 pmiller 14:09:37 1993 develop_begin Wed Jan 20 pmiller Elapsed time: 2.367 14:09:41 1993 days. develop_end Fri Jan 22 pmiller 16:54:41 1993 review_pass Fri Jan 22 pmiller 16:54:47 1993 integrate_begin Fri Jan 22 pmiller Elapsed time: 0.792 16:55:03 1993 days. integrate_pass Fri Jan 22 pmiller 22:51:36 1993 Project "fhist", Change 8 Page 1 Change Details Wed Feb 10 16:23:20 1993 NAME Project "fhist", Delta 10, Change 8. SUMMARY move fhist/unix o fhist/breaks DESCRIPTION move fhist/unix o fhist/breaks This change is exempt from testing. This change is exempt from testing against the baseline. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- ------- ------- ----------- source modify 4 common/fileio.h source create 1 fhist/breaks.c source create 1 fhist/breaks.h source modify 6 fhist/main.c source modify 6 fhist/name.c source modify 6 fhist/prune.c source remove 4 fhist/unix.c source remove 1 fhist/unix.h source modify 6 fhist/update.c HISTORY What When Who Comment ------ ------ ----- --------- new_change Fri Jan 22 pmiller 22:53:34 1993 develop_begin Fri Jan 22 pmiller Elapsed time: 0.000 22:53:39 1993 days. develop_end Sun Jan 24 pmiller 08:59:01 1993 review_pass Sun Jan 24 pmiller 08:59:07 1993 integrate_begin Sun Jan 24 pmiller 08:59:25 1993 integrate_pass Sun Jan 24 pmiller 09:04:40 1993 Project "fhist", Change 9 Page 1 Change Details Wed Feb 10 16:23:20 1993 NAME Project "fhist", Delta 11, Change 9. SUMMARY fcomp sometimes dumps core DESCRIPTION The hashtable was allocated from dynamic memory, but not initialized CAUSE This change was caused by internal_bug. FILES Type Action Edit File Name ------- ------- ------- ----------- source modify 7 common/compare.c test create 1 test/00/t0013a.sh HISTORY What When Who Comment ------ ------ ----- --------- new_change Fri Jan 29 pmiller 10:05:13 1993 develop_begin Fri Jan 29 pmiller Elapsed time: 0.078 10:05:28 1993 days. develop_end Fri Jan 29 pmiller 10:40:31 1993 review_pass Fri Jan 29 pmiller 10:40:51 1993 integrate_begin Fri Jan 29 pmiller 10:41:13 1993 integrate_pass Fri Jan 29 pmiller 10:48:07 1993 Project "fhist", Change 10 Page 1 Change Details Wed Feb 10 16:23:21 1993 NAME Project "fhist", Delta 12, Change 10. SUMMARY fix bug in fcomp DESCRIPTION fix bug in fcomp CAUSE This change was caused by internal_bug. STATE This change is in 'being_integrated' state. FILES Type Action Edit File Name ------- ------- ------- ----------- source modify 5 common/fileio.c test create test/00/t0014a.sh HISTORY What When Who Comment ------ ------ ----- --------- new_change Wed Feb 10 pmiller 15:41:57 1993 develop_begin Wed Feb 10 pmiller Elapsed time: 0.085 15:42:04 1993 days. develop_end Wed Feb 10 pmiller 16:20:17 1993 review_pass Wed Feb 10 pmiller 16:20:22 1993 integrate_begin Wed Feb 10 pmiller 16:20:41 1993 fhist-1.18/etc/CHANGES.1.1 644 0 0 10635511265752627 141260ustar PeterMiller 0 0 Project "fhist.1.1" Page 1 List of Changes Fri Oct 7 22:33:50 1994 Change State Description ------- ------- ------------- 1 completed New release derived from fhist. 2 completed add patch generator 3 completed there was a bug in the conflicts reporting 4 completed improve makefile 5 completed use pathconf to determine filename limits 6 completed make create tolerate already existing history file 7 completed add autoconf 8 completed Change to GNU GPL version 2 9 completed use txt2c to include man pages 10 completed This change fixes problems found in the generated Makefile.in 11 being_ Improve patch generation integrated Project "fhist.1.1", Change 1 Page 1 Change Details Fri Oct 7 22:33:54 1994 NAME Project "fhist.1.1", Delta 1, Change 1. SUMMARY New release derived from fhist. DESCRIPTION New release derived from fhist. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "unspecified" architecture. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- ------- ------- ----------- source create 1 aux/BUILDING.man source create 1 aux/CHANGES.sh source create 1 aux/Howto.cook source create 1 aux/MANIFEST.sh source create 1 aux/Makefile.awk source create 1 aux/Makefile.sh source create 1 aux/README.man source create 1 common/ansi.c source create 1 common/arglex.c source create 1 common/arglex.h source create 1 common/cmalloc.c source create 1 common/cmalloc.h source create 1 common/compare.c source create 1 common/compare.h source create 1 common/error.c source create 1 common/error.h source create 1 common/fileio.c source create 1 common/fileio.h source create 1 common/help.c source create 1 common/help.h source create 1 common/main.h source create 1 common/s-v-arg.h source create 1 common/version.c source create 1 common/version.h source create 1 config source create 1 fcomp/main.c source create 1 fhist/breaks.c source create 1 fhist/breaks.h source create 1 fhist/diff.c source create 1 fhist/diff.h source create 1 fhist/extract.c source create 1 fhist/extract.h source create 1 fhist/fhist.h source create 1 fhist/list.c Project "fhist.1.1", Change 1 Page 2 Change Details Fri Oct 7 22:33:54 1994 Type Action Edit File Name ------- ------- ------- ----------- source create 1 fhist/list.h source create 1 fhist/main.c source create 1 fhist/modlin.c source create 1 fhist/modlin.h source create 1 fhist/name.c source create 1 fhist/name.h source create 1 fhist/prune.c source create 1 fhist/prune.h source create 1 fhist/subroutine.c source create 1 fhist/subroutine.h source create 1 fhist/update.c source create 1 fhist/update.h source create 1 fmerge/main.c source create 1 fmerge/work.c source create 1 fmerge/work.h source create 1 man1/fcomp.1 source create 1 man1/fhist.1 source create 1 man1/fmerge.1 test create 1 test/00/t0001a.sh test create 1 test/00/t0002a.sh test create 1 test/00/t0003a.sh test create 1 test/00/t0004a.sh test create 1 test/00/t0005a.sh test create 1 test/00/t0006a.sh test create 1 test/00/t0007a.sh test create 1 test/00/t0008a.sh test create 1 test/00/t0009a.sh test create 1 test/00/t0010a.sh test create 1 test/00/t0011a.sh test create 1 test/00/t0012a.sh test create 1 test/00/t0013a.sh test create 1 test/00/t0014a.sh HISTORY What When Who Comment ------ ------ ----- --------- new_change Mon Feb 22 pmiller 10:32:47 1993 develop_begin Mon Feb 22 pmiller 10:32:47 1993 develop_end Mon Feb 22 pmiller 10:32:47 1993 review_pass Mon Feb 22 pmiller 10:32:47 1993 integrate_begin Mon Feb 22 pmiller 10:32:47 1993 integrate_pass Mon Feb 22 pmiller 10:34:39 1993 Project "fhist.1.1", Change 2 Page 1 Change Details Fri Oct 7 22:33:55 1994 NAME Project "fhist.1.1", Delta 3, Change 2. SUMMARY add patch generator DESCRIPTION Add shell script to generate patch files This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "unspecified" architecture. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- ------- ------- ----------- source modify 2 aux/Howto.cook source create 1 aux/patches.sh source modify 2 config test modify 2 test/00/t0014a.sh HISTORY What When Who Comment ------ ------ ----- --------- new_change Mon Feb 22 pmiller 10:50:55 1993 develop_begin Mon Feb 22 pmiller Elapsed time: 0.071 10:51:04 1993 days. develop_end Mon Feb 22 pmiller 11:22:52 1993 review_pass Mon Feb 22 pmiller 11:22:56 1993 integrate_begin Mon Feb 22 pmiller 11:23:12 1993 integrate_fail Mon Feb 22 pmiller patch problems 11:31:22 1993 Elapsed time: 0.203 days. develop_end Mon Feb 22 pmiller 13:02:56 1993 review_pass Mon Feb 22 pmiller 13:03:01 1993 integrate_begin Mon Feb 22 pmiller Elapsed time: 0.345 13:03:16 1993 days. integrate_pass Mon Feb 22 pmiller 15:38:28 1993 Project "fhist.1.1", Change 3 Page 1 Change Details Fri Oct 7 22:33:55 1994 NAME Project "fhist.1.1", Delta 4, Change 3. SUMMARY there was a bug in the conflicts reporting DESCRIPTION The dumpconflicts() function failed to open the output file. The command line processing failed to allow it to default to stdout. The manual failed to state that conflicts result in an exit ststus of 1, unless reported to a file or stdout. ARCHITECTURE This change must build and test in the "unspecified" architecture. CAUSE This change was caused by internal_bug. FILES Type Action Edit File Name ------- ------- ------- ----------- source modify 3 config source modify 2 fmerge/main.c source modify 2 fmerge/work.c source modify 2 man1/fmerge.1 test create 1 test/00/t0015a.sh HISTORY What When Who Comment ------ ------ ----- --------- new_change Sun Mar 7 pmiller 22:00:58 1993 develop_begin Sun Mar 7 pmiller Elapsed time: 0.082 22:01:14 1993 days. develop_end Sun Mar 7 pmiller 22:38:11 1993 review_pass Sun Mar 7 pmiller 22:38:56 1993 integrate_begin Sun Mar 7 pmiller 22:40:23 1993 integrate_pass Sun Mar 7 pmiller 22:46:19 1993 Project "fhist.1.1", Change 4 Page 1 Change Details Fri Oct 7 22:33:56 1994 NAME Project "fhist.1.1", Delta 5, Change 4. SUMMARY improve makefile DESCRIPTION Simplified the mkdir commands in the Makefile. They were overly complex. My thanks to John D. McCalpin for reporting this problem. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "unspecified" architecture. CAUSE This change was caused by internal_bug. FILES Type Action Edit File Name ------- ------- ------- ----------- source modify 2 aux/Makefile.sh source modify 4 config HISTORY What When Who Comment ------ ------ ----- --------- new_change Sat Oct 9 pmiller 21:04:21 1993 develop_begin Sat Oct 9 pmiller Elapsed time: 0.027 21:04:31 1993 days. develop_end Sat Oct 9 pmiller 21:16:37 1993 review_pass Sat Oct 9 pmiller 21:16:43 1993 integrate_begin Sat Oct 9 pmiller 21:17:07 1993 integrate_pass Sat Oct 9 pmiller 21:24:22 1993 Project "fhist.1.1", Change 5 Page 1 Change Details Fri Oct 7 22:33:58 1994 NAME Project "fhist.1.1", Delta 6, Change 5. SUMMARY use pathconf to determine filename limits DESCRIPTION There was a hard-coded limit of 12 characters for a module name. This has been raised on many modern UNIXes. The limit is not obtained by consulting the pathconf() function, and subtracting 2 characters for our suffix. This change must pass a full regression test. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "unspecified" architecture. CAUSE This change was caused by internal_bug. FILES Type Action Edit File Name ------- ------- ------- ----------- source modify 2 fhist/fhist.h source modify 2 fhist/main.c source modify 2 fhist/subroutine.c source modify 2 fhist/subroutine.h HISTORY What When Who Comment ------ ------ ----- --------- new_change Mon Dec 20 pmiller 07:26:15 1993 develop_begin Mon Dec 20 pmiller Elapsed time: 0.252 07:26:42 1993 days. develop_end Mon Dec 20 pmiller 09:20:06 1993 review_pass Mon Dec 20 pmiller 09:21:24 1993 integrate_begin Mon Dec 20 pmiller Elapsed time: 0.033 09:21:46 1993 days. integrate_pass Mon Dec 20 pmiller 09:36:27 1993 Project "fhist.1.1", Change 6 Page 1 Change Details Fri Oct 7 22:33:59 1994 NAME Project "fhist.1.1", Delta 7, Change 6. SUMMARY make create tolerate already existing history file DESCRIPTION make create tolerate already existing history file ARCHITECTURE This change must build and test in the "unspecified" architecture. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- ------- ------- ----------- source modify 3 aux/Howto.cook source modify 3 fhist/main.c source modify 3 fhist/subroutine.c source modify 3 fhist/subroutine.h source modify 2 fhist/update.c source modify 2 man1/fhist.1 test create 1 test/00/t0016a.sh HISTORY What When Who Comment ------ ------ ----- --------- new_change Thu Sep 29 pmiller 21:22:00 1994 develop_begin Thu Sep 29 pmiller Elapsed time: 0.000 21:22:16 1994 days. develop_end Fri Sep 30 pmiller 07:04:01 1994 review_pass Fri Sep 30 pmiller 07:04:30 1994 integrate_begin Fri Sep 30 pmiller Elapsed time: 0.050 07:04:56 1994 days. integrate_pass Fri Sep 30 pmiller 07:27:30 1994 Project "fhist.1.1", Change 7 Page 1 Change Details Fri Oct 7 22:33:59 1994 NAME Project "fhist.1.1", Delta 8, Change 7. SUMMARY add autoconf DESCRIPTION 1. Use autoconf to automatically configure for the appropriate architecture. 2. Add the sun4, sun5 and alpha architectures to the mandatory list. 3. Several protability improvements were discovered by (2). 4. move the file templates out of config and into separate files. This change is exempt from testing against the baseline. ARCHITECTURES This change must build and test in each of the "alpha", "sun4" and "sun5" architectures. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- ------- ------- ----------- build create 1 BUILDING source create 1 LICENSE build create 1 MANIFEST build create 1 Makefile.in build create 1 README source modify 2 aux/BUILDING.man source modify 4 aux/Howto.cook source create 1 aux/Makefi.file.sh source create 1 aux/Makefile.head source modify 3 aux/Makefile.sh source modify 2 aux/README.man source create 1 aux/config.h.in source create 1 aux/config.h.in1 source create 1 aux/config.h.in2 source create 1 aux/configure.in source create 1 aux/new.1.1.so build create 1 aux/new.so source create 1 aux/template/c source create 1 aux/template/generic source create 1 aux/template/h source create 1 aux/template/man source create 1 aux/template/ms source create 1 aux/template/sh source create 1 aux/template/test source create 1 common/ac/dirent.h source create 1 common/ac/limits.h source create 1 common/ac/stdarg.h Moved from common/s-v-arg.h source create 1 common/ac/stddef.h source create 1 common/ac/stdlib.h Project "fhist.1.1", Change 7 Page 2 Change Details Fri Oct 7 22:33:59 1994 Type Action Edit File Name ------- ------- ------- ----------- source create 1 common/ac/string.h source create 1 common/ac/time.h source create 1 common/ac/unistd.h source modify 2 common/ansi.c source modify 2 common/arglex.c source modify 2 common/cmalloc.c source modify 2 common/cmalloc.h source modify 2 common/compare.c build create 1 common/config.h.in source modify 2 common/error.c source modify 2 common/fileio.c source modify 2 common/help.c build create 1 common/patchlevel.h source remove 1 common/s-v-arg.h Moved to common/ac/stdarg.h source modify 2 common/version.c source create 1 common/version_stmp.c source create 1 common/version_stmp.h source modify 5 config build create 1 configure build create 1 doc/version.so source modify 2 fcomp/main.c source modify 2 fhist/diff.c source modify 2 fhist/extract.c source modify 3 fhist/fhist.h source modify 4 fhist/main.c source modify 2 fhist/name.c source modify 2 fhist/prune.c source modify 4 fhist/subroutine.c source modify 3 fhist/update.c source modify 3 fmerge/main.c source modify 2 man1/fcomp.1 source modify 3 man1/fhist.1 source modify 3 man1/fmerge.1 test modify 2 test/00/t0001a.sh test modify 2 test/00/t0002a.sh test modify 2 test/00/t0003a.sh test modify 2 test/00/t0004a.sh test modify 2 test/00/t0005a.sh test modify 2 test/00/t0006a.sh test modify 2 test/00/t0007a.sh test modify 2 test/00/t0008a.sh test modify 2 test/00/t0009a.sh test modify 2 test/00/t0010a.sh test modify 2 test/00/t0011a.sh test modify 2 test/00/t0012a.sh test modify 2 test/00/t0013a.sh test modify 3 test/00/t0014a.sh test modify 2 test/00/t0015a.sh test modify 2 test/00/t0016a.sh Project "fhist.1.1", Change 7 Page 3 Change Details Fri Oct 7 22:33:59 1994 HISTORY What When Who Comment ------ ------ ----- --------- new_change Fri Sep 30 pmiller 08:37:44 1994 develop_begin Fri Sep 30 pmiller Elapsed time: 0.920 08:37:50 1994 days. develop_end Sat Oct 1 pmiller 08:01:43 1994 review_pass Sat Oct 1 pmiller 08:03:41 1994 integrate_begin Sat Oct 1 pmiller Elapsed time: 0.959 08:04:29 1994 days. integrate_pass Sun Oct 2 pmiller 07:45:55 1994 Project "fhist.1.1", Change 8 Page 1 Change Details Fri Oct 7 22:34:00 1994 NAME Project "fhist.1.1", Delta 9, Change 8. SUMMARY Change to GNU GPL version 2 DESCRIPTION Change to GNU GPL version 2 This change is exempt from testing against the baseline. ARCHITECTURES This change must build and test in each of the "alpha", "sun4" and "sun5" architectures. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- ------- ------- ----------- build modify 2 BUILDING build modify 2 MANIFEST build modify 2 Makefile.in build modify 2 README source modify 3 aux/BUILDING.man source modify 2 aux/CHANGES.sh source modify 5 aux/Howto.cook source modify 2 aux/MANIFEST.sh source modify 2 aux/Makefile.awk source modify 4 aux/Makefile.sh source modify 3 aux/README.man source modify 2 aux/new.1.1.so build modify 2 aux/new.so source modify 2 aux/template/c source modify 2 aux/template/generic source modify 2 aux/template/h source modify 2 aux/template/man source modify 2 aux/template/ms source modify 2 aux/template/sh source modify 2 aux/template/test source modify 2 common/ac/stdarg.h source modify 3 common/ansi.c source modify 3 common/arglex.c source modify 2 common/arglex.h source modify 3 common/cmalloc.c source modify 3 common/cmalloc.h source modify 3 common/compare.c source modify 2 common/compare.h build modify 2 common/config.h.in source modify 3 common/error.c source modify 2 common/error.h source modify 3 common/fileio.c source modify 2 common/fileio.h source modify 3 common/help.c source modify 2 common/help.h source modify 2 common/main.h Project "fhist.1.1", Change 8 Page 2 Change Details Fri Oct 7 22:34:00 1994 Type Action Edit File Name ------- ------- ------- ----------- build modify 2 common/patchlevel.h source modify 3 common/version.c source modify 2 common/version.h source modify 2 common/version_stmp.c source modify 2 common/version_stmp.h source modify 6 config build modify 2 configure build modify 2 doc/version.so source modify 3 fcomp/main.c source modify 2 fhist/breaks.c source modify 2 fhist/breaks.h source modify 3 fhist/diff.c source modify 2 fhist/diff.h source modify 3 fhist/extract.c source modify 2 fhist/extract.h source modify 4 fhist/fhist.h source modify 2 fhist/list.c source modify 2 fhist/list.h source modify 5 fhist/main.c source modify 2 fhist/modlin.c source modify 2 fhist/modlin.h source modify 3 fhist/name.c source modify 2 fhist/name.h source modify 3 fhist/prune.c source modify 2 fhist/prune.h source modify 5 fhist/subroutine.c source modify 4 fhist/subroutine.h source modify 4 fhist/update.c source modify 2 fhist/update.h source modify 4 fmerge/main.c source modify 3 fmerge/work.c source modify 2 fmerge/work.h source modify 3 man1/fcomp.1 source modify 4 man1/fhist.1 source modify 4 man1/fmerge.1 source create 1 man1/o__rules.so source create 1 man1/o_help.so source create 1 man1/o_version.so source create 1 man1/z_cr.so source create 1 man1/z_exit.so source create 1 man1/z_fne.so source create 1 man1/z_ref.so test modify 3 test/00/t0001a.sh test modify 3 test/00/t0002a.sh test modify 3 test/00/t0003a.sh test modify 3 test/00/t0004a.sh test modify 3 test/00/t0005a.sh test modify 3 test/00/t0006a.sh test modify 3 test/00/t0007a.sh test modify 3 test/00/t0008a.sh test modify 3 test/00/t0009a.sh test modify 3 test/00/t0010a.sh test modify 3 test/00/t0011a.sh test modify 3 test/00/t0012a.sh test modify 3 test/00/t0013a.sh Project "fhist.1.1", Change 8 Page 3 Change Details Fri Oct 7 22:34:00 1994 Type Action Edit File Name ------- ------- ------- ----------- test modify 4 test/00/t0014a.sh test modify 3 test/00/t0015a.sh test modify 3 test/00/t0016a.sh HISTORY What When Who Comment ------ ------ ----- --------- new_change Sun Oct 2 pmiller 07:57:39 1994 develop_begin Sun Oct 2 pmiller Elapsed time: 0.239 07:57:45 1994 days. develop_end Sun Oct 2 pmiller 09:45:18 1994 review_pass Sun Oct 2 pmiller 09:45:27 1994 integrate_begin Sun Oct 2 pmiller Elapsed time: 0.041 09:46:34 1994 days. integrate_pass Sun Oct 2 pmiller 10:05:07 1994 Project "fhist.1.1", Change 9 Page 1 Change Details Fri Oct 7 22:34:01 1994 NAME Project "fhist.1.1", Delta 10, Change 9. SUMMARY use txt2c to include man pages DESCRIPTION 1. use txt2c to include man pages, this includes changes to help.c to interpret the contents (taken from aegis.2.2) 2. added gnu-ish argument parsing as per the manual entries 3. put common code in a library, both for cook and for make 4. better history update commands in config file This change must pass a full regression test. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURES This change must build and test in each of the "alpha", "sun4" and "sun5" architectures. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- ------- ------- ----------- build modify 2 BUILDING build modify 2 MANIFEST build modify 3 Makefile.in build modify 2 README source create 1 aux/CHANGES.1.0 source modify 6 aux/Howto.cook source modify 5 aux/Makefile.sh source modify 2 aux/configure.in build modify 2 aux/new.so source modify 4 common/arglex.c source modify 3 common/arglex.h build modify 3 common/config.h.in source modify 4 common/help.c source create 1 common/pager.c source create 1 common/pager.h build modify 2 common/patchlevel.h source modify 7 config build modify 3 configure build modify 2 doc/version.so source modify 4 fcomp/main.c source modify 6 fhist/main.c source modify 5 fmerge/main.c source modify 4 man1/fcomp.1 source modify 5 man1/fhist.1 source modify 5 man1/fmerge.1 source modify 2 man1/o__rules.so source modify 2 man1/z_cr.so source modify 2 man1/z_fne.so source create 1 txt2c/main.c source create 1 txt2c/txt2c.c Project "fhist.1.1", Change 9 Page 2 Change Details Fri Oct 7 22:34:01 1994 Type Action Edit File Name ------- ------- ------- ----------- source create 1 txt2c/txt2c.h HISTORY What When Who Comment ------ ------ ----- --------- new_change Sun Oct 2 pmiller 10:10:14 1994 develop_begin Sun Oct 2 pmiller Elapsed time: 0.852 10:10:19 1994 days. develop_end Tue Oct 4 pmiller 18:03:44 1994 review_pass Tue Oct 4 pmiller 18:03:52 1994 integrate_begin Tue Oct 4 pmiller Elapsed time: 1.804 18:04:50 1994 days. integrate_pass Fri Oct 7 pmiller 09:06:50 1994 Project "fhist.1.1", Change 10 Page 1 Change Details Fri Oct 7 22:34:01 1994 NAME Project "fhist.1.1", Delta 13, Change 10. SUMMARY This change fixes problems found in the generated Makefile.in DESCRIPTION This change fixes problems found in the generated Makefile.in file. There was a few typos, and the test runs were duplicated. This change must pass a full regression test. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURES This change must build and test in each of the "alpha", "sun4" and "sun5" architectures. CAUSE This change was caused by internal_bug. FILES Type Action Edit File Name ------- ------- ------- ----------- build modify 2 BUILDING build modify 3 MANIFEST build modify 4 Makefile.in build modify 3 README source modify 2 aux/Makefile.head source modify 6 aux/Makefile.sh source modify 3 aux/new.1.1.so build modify 2 aux/new.so build modify 3 common/config.h.in build modify 3 common/patchlevel.h source modify 4 common/version.c source modify 8 config build modify 3 configure build modify 3 doc/version.so source modify 5 fcomp/main.c source modify 3 fmerge/work.h HISTORY What When Who Comment ------ ------ ----- --------- new_change Fri Oct 7 pmiller 09:17:05 1994 develop_begin Fri Oct 7 pmiller Elapsed time: 0.132 09:17:12 1994 days. develop_end Fri Oct 7 pmiller 10:16:38 1994 review_pass Fri Oct 7 pmiller 10:18:47 1994 integrate_begin Fri Oct 7 pmiller Elapsed time: 0.670 10:20:10 1994 days. integrate_fail Fri Oct 7 pmiller some strings in 15:21:32 1994 version.c not Project "fhist.1.1", Change 10 Page 2 Change Details Fri Oct 7 22:34:01 1994 What When Who Comment ------ ------ ----- --------- terminated. Gcc is too liberal, problem found with sun's cc. Elapsed time: 0.056 days. develop_end Fri Oct 7 pmiller 15:46:53 1994 review_pass Fri Oct 7 pmiller 15:46:59 1994 integrate_begin Fri Oct 7 pmiller Elapsed time: 0.025 15:48:21 1994 days. integrate_fail Fri Oct 7 pmiller more problems with 15:59:37 1994 Makefile.in Elapsed time: 0.047 days. develop_end Fri Oct 7 pmiller 16:20:55 1994 review_pass Fri Oct 7 pmiller 16:24:01 1994 integrate_begin Fri Oct 7 pmiller Elapsed time: 0.745 16:24:34 1994 days. integrate_pass Fri Oct 7 pmiller 21:59:46 1994 Project "fhist.1.1", Change 11 Page 1 Change Details Fri Oct 7 22:34:02 1994 NAME Project "fhist.1.1", Delta 14, Change 11. SUMMARY Improve patch generation DESCRIPTION Use the method from aegis.2.3 to update patch files. It is more efficient at integrate build time This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURES This change must build and test in each of the "alpha", "sun4" and "sun5" architectures. arch. host aeb aet aet -bl aet -reg -------- -------- --------- --------- --------- --------- alpha required exempt exempt exempt sun4 required exempt exempt exempt sun5 required exempt exempt exempt --------- --------- --------- --------- required exempt exempt exempt CAUSE This change was caused by internal_enhancement. STATE This change is in the 'being_integrated' state. FILES Type Action Edit File Name ------- ------- ------- ----------- source modify 6 aux/Howto.cook source create aux/patch.file.sh source modify 1 aux/patches.sh HISTORY What When Who Comment ------ ------ ----- --------- new_change Fri Oct 7 pmiller 22:02:25 1994 develop_begin Fri Oct 7 pmiller Elapsed time: 0.061 22:03:00 1994 days. develop_end Fri Oct 7 pmiller 22:30:26 1994 review_pass Fri Oct 7 pmiller 22:30:33 1994 integrate_begin Fri Oct 7 pmiller 22:31:44 1994 fhist-1.18/etc/CHANGES.1.2 644 0 0 5070211265752627 141010ustar PeterMiller 0 0 Project "fhist.1.2" Page 1 List of Changes Mon Mar 30 15:12:43 1998 Change State Description ------- ------- ------------- 1 completed New release derived from fhist.1.1. 2 completed use mprintf so can use less memory in error strings 3 completed stop using isblank 4 completed remove zero conflict warning 10 completed make use of pathconf more robust 11 completed improve merging Project "fhist.1.2", Change 1 Page 1 Change Details Mon Mar 30 15:12:43 1998 NAME Project "fhist.1.2", Delta 1, Change 1. SUMMARY New release derived from fhist.1.1. DESCRIPTION New release derived from fhist.1.1. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "unspecified" architecture. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- -------- ------- ----------- build create 1 BUILDING source create 1 LICENSE build create 1 MANIFEST build create 1 Makefile.in build create 1 README source create 1 aux/BUILDING.man source create 1 aux/CHANGES.1.0 source create 1 aux/CHANGES.sh source create 1 aux/Howto.cook source create 1 aux/MANIFEST.sh source create 1 aux/Makefi.file.sh source create 1 aux/Makefile.awk source create 1 aux/Makefile.head source create 1 aux/Makefile.sh source create 1 aux/README.man source create 1 aux/config.h.in source create 1 aux/config.h.in1 source create 1 aux/config.h.in2 source create 1 aux/configure.in source create 1 aux/new.1.1.so build create 1 aux/new.so source create 1 aux/patch.file.sh source create 1 aux/patches.sh source create 1 aux/template/c source create 1 aux/template/generic source create 1 aux/template/h source create 1 aux/template/man source create 1 aux/template/ms source create 1 aux/template/sh source create 1 aux/template/test source create 1 common/ac/dirent.h source create 1 common/ac/limits.h source create 1 common/ac/stdarg.h Project "fhist.1.2", Change 1 Page 2 Change Details Mon Mar 30 15:12:43 1998 Type Action Edit File Name ------- -------- ------- ----------- source create 1 common/ac/stddef.h source create 1 common/ac/stdlib.h source create 1 common/ac/string.h source create 1 common/ac/time.h source create 1 common/ac/unistd.h source create 1 common/ansi.c source create 1 common/arglex.c source create 1 common/arglex.h source create 1 common/cmalloc.c source create 1 common/cmalloc.h source create 1 common/compare.c source create 1 common/compare.h build create 1 common/config.h.in source create 1 common/error.c source create 1 common/error.h source create 1 common/fileio.c source create 1 common/fileio.h source create 1 common/help.c source create 1 common/help.h source create 1 common/main.h source create 1 common/pager.c source create 1 common/pager.h build create 1 common/patchlevel.h source create 1 common/version.c source create 1 common/version.h source create 1 common/version_stmp.c source create 1 common/version_stmp.h source create 1 config build create 1 configure build create 1 doc/version.so source create 1 fcomp/main.c source create 1 fhist/breaks.c source create 1 fhist/breaks.h source create 1 fhist/diff.c source create 1 fhist/diff.h source create 1 fhist/extract.c source create 1 fhist/extract.h source create 1 fhist/fhist.h source create 1 fhist/list.c source create 1 fhist/list.h source create 1 fhist/main.c source create 1 fhist/modlin.c source create 1 fhist/modlin.h source create 1 fhist/name.c source create 1 fhist/name.h source create 1 fhist/prune.c source create 1 fhist/prune.h source create 1 fhist/subroutine.c source create 1 fhist/subroutine.h source create 1 fhist/update.c source create 1 fhist/update.h source create 1 fmerge/main.c source create 1 fmerge/work.c source create 1 fmerge/work.h source create 1 man1/fcomp.1 Project "fhist.1.2", Change 1 Page 3 Change Details Mon Mar 30 15:12:43 1998 Type Action Edit File Name ------- -------- ------- ----------- source create 1 man1/fhist.1 source create 1 man1/fmerge.1 source create 1 man1/o__rules.so source create 1 man1/o_help.so source create 1 man1/o_version.so source create 1 man1/z_cr.so source create 1 man1/z_exit.so source create 1 man1/z_fne.so source create 1 man1/z_ref.so test create 1 test/00/t0001a.sh test create 1 test/00/t0002a.sh test create 1 test/00/t0003a.sh test create 1 test/00/t0004a.sh test create 1 test/00/t0005a.sh test create 1 test/00/t0006a.sh test create 1 test/00/t0007a.sh test create 1 test/00/t0008a.sh test create 1 test/00/t0009a.sh test create 1 test/00/t0010a.sh test create 1 test/00/t0011a.sh test create 1 test/00/t0012a.sh test create 1 test/00/t0013a.sh test create 1 test/00/t0014a.sh test create 1 test/00/t0015a.sh test create 1 test/00/t0016a.sh source create 1 txt2c/main.c source create 1 txt2c/txt2c.c source create 1 txt2c/txt2c.h HISTORY What When Who Comment ------ ------ ----- --------- new_change Sat Oct 8 pmiller 21:19:06 1994 develop_begin Sat Oct 8 pmiller 21:19:06 1994 develop_end Sat Oct 8 pmiller 21:19:06 1994 review_pass Sat Oct 8 pmiller 21:19:06 1994 integrate_begin Sat Oct 8 pmiller 21:19:06 1994 integrate_pass Sat Oct 8 pmiller 21:25:18 1994 Project "fhist.1.2", Change 2 Page 1 Change Details Mon Mar 30 15:12:44 1998 NAME Project "fhist.1.2", Delta 2, Change 2. SUMMARY use mprintf so can use less memory in error strings DESCRIPTION use mprintf so can use less memory in error strings This change must pass a full regression test. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURES This change must build and test in each of the "alpha", "sun4" and "sun5" architectures. CAUSE This change was caused by internal_improvement. FILES Type Action Edit File Name ------- -------- ------- ----------- build modify 1 BUILDING build modify 2 MANIFEST build modify 2 Makefile.in build modify 2 README source create 1 aux/CHANGES.1.1 source modify 2 aux/Howto.cook source modify 2 aux/MANIFEST.sh source modify 2 aux/Makefile.sh source create 1 aux/new.1.2.so build modify 2 aux/new.so source modify 2 common/arglex.c source modify 2 common/cmalloc.c source modify 2 common/cmalloc.h source modify 2 common/compare.c build modify 1 common/config.h.in source modify 2 common/error.c source modify 2 common/fileio.c source modify 2 common/help.c source create 1 common/mprintf.c source create 1 common/mprintf.h build modify 2 common/patchlevel.h source create 1 common/str.c source create 1 common/str.h source modify 2 common/version.c build modify 2 configure build modify 2 doc/version.so source modify 2 fcomp/main.c source modify 2 fhist/diff.c source modify 2 fhist/extract.c source modify 2 fhist/list.c source modify 2 fhist/main.c source modify 2 fmerge/main.c Project "fhist.1.2", Change 2 Page 2 Change Details Mon Mar 30 15:12:44 1998 HISTORY What When Who Comment ------ ------ ----- --------- new_change Tue Oct 18 pmiller 05:44:37 1994 develop_begin Tue Oct 18 pmiller Elapsed time: 1.107 05:44:49 1994 days. develop_end Wed Oct 19 pmiller 06:32:59 1994 review_pass Wed Oct 19 pmiller 06:33:15 1994 integrate_begin Wed Oct 19 pmiller Elapsed time: 0.084 06:35:10 1994 days. integrate_pass Wed Oct 19 pmiller 07:12:52 1994 Project "fhist.1.2", Change 3 Page 1 Change Details Mon Mar 30 15:12:44 1998 NAME Project "fhist.1.2", Delta 3, Change 3. SUMMARY stop using isblank DESCRIPTION The BSD folks appear to have stolen isblank for ctype.h My thanks to Albert.Langer@gnu.ai.mit.edu for reporting this problem. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURES This change must build and test in each of the "alpha", "sun4" and "sun5" architectures. CAUSE This change was caused by external_bug. FILES Type Action Edit File Name ------- -------- ------- ----------- build modify 2 BUILDING build modify 2 MANIFEST build modify 2 Makefile.in build modify 3 README source modify 2 aux/BUILDING.man source modify 3 aux/Howto.cook source modify 2 aux/README.man build modify 2 aux/new.so source modify 3 common/compare.c build modify 1 common/config.h.in source modify 3 common/help.c build modify 3 common/patchlevel.h source modify 2 common/version_stmp.c source modify 2 common/version_stmp.h build modify 2 configure build modify 3 doc/version.so source modify 2 man1/z_cr.so HISTORY What When Who Comment ------ ------ ----- --------- new_change Thu Jan 5 pmiller 09:52:36 1995 develop_begin Thu Jan 5 pmiller Elapsed time: 0.114 09:52:41 1995 days. develop_end Thu Jan 5 pmiller 10:44:11 1995 review_pass Thu Jan 5 pmiller 10:44:17 1995 integrate_begin Thu Jan 5 pmiller Elapsed time: 0.045 Project "fhist.1.2", Change 3 Page 2 Change Details Mon Mar 30 15:12:44 1998 What When Who Comment ------ ------ ----- --------- 10:45:44 1995 days. integrate_pass Thu Jan 5 pmiller 11:06:00 1995 Project "fhist.1.2", Change 4 Page 1 Change Details Mon Mar 30 15:12:44 1998 NAME Project "fhist.1.2", Delta 4, Change 4. SUMMARY remove zero conflict warning DESCRIPTION remove zero conflict warning This change must pass a full regression test. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_improvement. FILES Type Action Edit File Name ------- -------- ------- ----------- build modify 2 BUILDING build modify 2 MANIFEST build modify 2 Makefile.in build modify 3 README source modify 4 aux/Howto.cook source modify 2 aux/config.h.in source modify 2 aux/configure.in build modify 2 aux/new.so source modify 3 common/cmalloc.h build modify 2 common/config.h.in build modify 4 common/patchlevel.h source modify 2 config build modify 3 configure build modify 4 doc/version.so source modify 2 fhist/breaks.c source modify 3 fmerge/main.c test modify 2 test/00/t0011a.sh test modify 2 test/00/t0015a.sh HISTORY What When Who Comment ------ ------ ----- --------- new_change Sun Dec 10 pmiller 16:20:19 1995 develop_begin Sun Dec 10 pmiller Elapsed time: 0.220 16:20:40 1995 days. develop_end Sun Dec 10 pmiller 17:59:40 1995 review_pass Sun Dec 10 pmiller 17:59:45 1995 integrate_begin Sun Dec 10 pmiller Elapsed time: 0.066 17:59:50 1995 days. integrate_pass Sun Dec 10 pmiller 18:29:19 1995 Project "fhist.1.2", Change 10 Page 1 Change Details Mon Mar 30 15:12:44 1998 NAME Project "fhist.1.2", Delta 5, Change 10. SUMMARY make use of pathconf more robust DESCRIPTION This change makes use of pathconf more robust on systems with posix compliant but unusual implementation sof pathconf. This change must pass a full regression test. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_improvement. FILES Type Action Edit File Name ------- -------- ------- ----------- build modify 2 BUILDING build modify 2 MANIFEST build modify 2 Makefile.in build modify 3 README build modify 2 aux/new.so build modify 2 common/config.h.in build modify 5 common/patchlevel.h build modify 3 configure build modify 5 doc/version.so source modify 2 fhist/subroutine.c HISTORY What When Who Comment ------ ------ ----- --------- new_change Sun May 19 pmiller 08:32:14 1996 develop_begin Sun May 19 pmiller 08:32:21 1996 develop_end Sun May 19 pmiller 08:41:11 1996 review_pass Sun May 19 pmiller 08:41:25 1996 integrate_begin Sun May 19 pmiller 08:41:28 1996 integrate_pass Sun May 19 pmiller 08:43:37 1996 Project "fhist.1.2", Change 11 Page 1 Change Details Mon Mar 30 15:12:44 1998 NAME Project "fhist.1.2", Delta 6, Change 11. SUMMARY improve merging DESCRIPTION improve merging ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_improvement. FILES Type Action Edit File Name ------- -------- ------- ----------- build modify 2 BUILDING build modify 2 MANIFEST build modify 2 Makefile.in build modify 3 README build modify 2 aux/new.so build modify 2 common/config.h.in build modify 5 -> 6 common/patchlevel.h build modify 3 configure build modify 5 -> 6 doc/version.so source modify 3 -> 4 fmerge/main.c source modify 1 -> 2 fmerge/work.c test create 1 test/00/t0017a.sh HISTORY What When Who Comment ------ ------ ----- --------- new_change Sat Jul 12 pmiller 00:35:23 1997 develop_begin Sat Jul 12 pmiller Elapsed time: 0.102 00:35:26 1997 days. develop_end Sat Jul 12 pmiller 01:21:23 1997 review_pass Sat Jul 12 pmiller 01:21:45 1997 integrate_begin Sat Jul 12 pmiller 01:21:49 1997 integrate_pass Sat Jul 12 pmiller 01:22:56 1997 fhist-1.18/etc/CHANGES.1.3 644 0 0 20365511265752627 141310ustar PeterMiller 0 0 Project "fhist.1.3" Page 1 List of Changes Wed Sep 16 08:59:56 1998 Change State Description ------- ------- ------------- 10 completed New release derived from fhist.1.2. 11 completed LSM file 12 completed fix build problems 13 completed new FSF address 14 completed internationalization support 15 completed initernationalization 16 completed fhist internationalization 17 completed fhist message comments 18 completed message commentary 19 completed translation fix 20 completed move man pages 21 completed new cook features 22 completed reference manual 23 completed fix build warnings 24 completed update the building instructions Project "fhist.1.3", Change 10 Page 1 Change Details Wed Sep 16 08:59:57 1998 NAME Project "fhist.1.3", Delta 1, Change 10. SUMMARY New release derived from fhist.1.2. DESCRIPTION New release derived from fhist.1.2. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "unspecified" architecture. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- -------- ------- ----------- build create 1 BUILDING source create 1 LICENSE build create 1 MANIFEST build create 1 Makefile.in build create 1 README source create 1 aux/BUILDING.man source create 1 aux/CHANGES.1.0 source create 1 aux/CHANGES.1.1 source create 1 aux/CHANGES.sh source create 1 aux/Howto.cook source create 1 aux/MANIFEST.sh source create 1 aux/Makefi.file.sh source create 1 aux/Makefile.awk source create 1 aux/Makefile.head source create 1 aux/Makefile.sh source create 1 aux/README.man source create 1 aux/config.h.in source create 1 aux/config.h.in1 source create 1 aux/config.h.in2 source create 1 aux/configure.in source create 1 aux/new.1.1.so source create 1 aux/new.1.2.so build create 1 aux/new.so source create 1 aux/patch.file.sh source create 1 aux/patches.sh source create 1 aux/template/c source create 1 aux/template/generic source create 1 aux/template/h source create 1 aux/template/man source create 1 aux/template/ms source create 1 aux/template/sh source create 1 aux/template/test source create 1 common/ac/dirent.h Project "fhist.1.3", Change 10 Page 2 Change Details Wed Sep 16 08:59:57 1998 Type Action Edit File Name ------- -------- ------- ----------- source create 1 common/ac/limits.h source create 1 common/ac/stdarg.h source create 1 common/ac/stddef.h source create 1 common/ac/stdlib.h source create 1 common/ac/string.h source create 1 common/ac/time.h source create 1 common/ac/unistd.h source create 1 common/ansi.c source create 1 common/arglex.c source create 1 common/arglex.h source create 1 common/cmalloc.c source create 1 common/cmalloc.h source create 1 common/compare.c source create 1 common/compare.h build create 1 common/config.h.in source create 1 common/error.c source create 1 common/error.h source create 1 common/fileio.c source create 1 common/fileio.h source create 1 common/help.c source create 1 common/help.h source create 1 common/main.h source create 1 common/mprintf.c source create 1 common/mprintf.h source create 1 common/pager.c source create 1 common/pager.h build create 1 common/patchlevel.h source create 1 common/str.c source create 1 common/str.h source create 1 common/version.c source create 1 common/version.h source create 1 common/version_stmp.c source create 1 common/version_stmp.h source create 1 config build create 1 configure build create 1 doc/version.so source create 1 fcomp/main.c source create 1 fhist/breaks.c source create 1 fhist/breaks.h source create 1 fhist/diff.c source create 1 fhist/diff.h source create 1 fhist/extract.c source create 1 fhist/extract.h source create 1 fhist/fhist.h source create 1 fhist/list.c source create 1 fhist/list.h source create 1 fhist/main.c source create 1 fhist/modlin.c source create 1 fhist/modlin.h source create 1 fhist/name.c source create 1 fhist/name.h source create 1 fhist/prune.c source create 1 fhist/prune.h source create 1 fhist/subroutine.c source create 1 fhist/subroutine.h Project "fhist.1.3", Change 10 Page 3 Change Details Wed Sep 16 08:59:57 1998 Type Action Edit File Name ------- -------- ------- ----------- source create 1 fhist/update.c source create 1 fhist/update.h source create 1 fmerge/main.c source create 1 fmerge/work.c source create 1 fmerge/work.h source create 1 man1/fcomp.1 source create 1 man1/fhist.1 source create 1 man1/fmerge.1 source create 1 man1/o__rules.so source create 1 man1/o_help.so source create 1 man1/o_version.so source create 1 man1/z_cr.so source create 1 man1/z_exit.so source create 1 man1/z_fne.so source create 1 man1/z_ref.so test create 1 test/00/t0001a.sh test create 1 test/00/t0002a.sh test create 1 test/00/t0003a.sh test create 1 test/00/t0004a.sh test create 1 test/00/t0005a.sh test create 1 test/00/t0006a.sh test create 1 test/00/t0007a.sh test create 1 test/00/t0008a.sh test create 1 test/00/t0009a.sh test create 1 test/00/t0010a.sh test create 1 test/00/t0011a.sh test create 1 test/00/t0012a.sh test create 1 test/00/t0013a.sh test create 1 test/00/t0014a.sh test create 1 test/00/t0015a.sh test create 1 test/00/t0016a.sh test create 1 test/00/t0017a.sh source create 1 txt2c/main.c source create 1 txt2c/txt2c.c source create 1 txt2c/txt2c.h HISTORY What When Who Comment ------ ------ ----- --------- new_change Sun Mar 29 pmiller 22:13:49 1998 develop_begin Sun Mar 29 pmiller 22:13:49 1998 develop_end Sun Mar 29 pmiller 22:13:49 1998 review_pass Sun Mar 29 pmiller 22:13:49 1998 integrate_begin Sun Mar 29 pmiller 22:13:49 1998 integrate_pass Sun Mar 29 pmiller 22:15:24 1998 Project "fhist.1.3", Change 11 Page 1 Change Details Wed Sep 16 08:59:57 1998 NAME Project "fhist.1.3", Delta 2, Change 11. SUMMARY LSM file DESCRIPTION Thsi chanmge adds and LSM file. This change must pass a full regression test. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- -------- ------- ----------- build remove 1 BUILDING build remove 1 MANIFEST build remove 1 Makefile.in build remove 1 README source create 1 aux/CHANGES.1.2 source modify 1 -> 2 aux/Howto.cook source create 1 aux/MANIFEST.head source modify 1 -> 2 aux/Makefi.file.sh source modify 1 -> 2 aux/Makefile.head source modify 1 -> 2 aux/Makefile.sh source modify 1 -> 2 aux/README.man source create 1 aux/archive.cook source modify 1 -> 2 aux/configure.in source create 1 aux/fhist.gif.uue source create 1 aux/fhist.html source create 1 aux/fhist.lsm source modify 1 -> 2 aux/new.1.1.so source modify 1 -> 2 aux/new.1.2.so source create 1 aux/new.1.3.so build remove 1 aux/new.so source create 1 aux/rpm-build.sh source create 1 aux/so.sh source create 1 aux/spec.sh source create 1 aux/ssp.awk source create 1 common/ac/stdio.h source modify 1 -> 2 common/ac/unistd.h source modify 1 -> 2 common/ansi.c source modify 1 -> 2 common/compare.c source modify 1 -> 2 common/compare.h build remove 1 common/config.h.in source modify 1 -> 2 common/error.c source modify 1 -> 2 common/fileio.c source modify 1 -> 2 common/fileio.h Project "fhist.1.3", Change 11 Page 2 Change Details Wed Sep 16 08:59:57 1998 Type Action Edit File Name ------- -------- ------- ----------- source modify 1 -> 2 common/help.c source modify 1 -> 2 common/mprintf.c source modify 1 -> 2 common/pager.c source modify 1 -> 2 common/pager.h build remove 1 common/patchlevel.h source modify 1 -> 2 common/str.c source modify 1 -> 2 common/version.c source modify 1 -> 2 config build remove 1 configure build remove 1 doc/version.so source modify 1 -> 2 fcomp/main.c source modify 1 -> 2 fhist/diff.c source modify 1 -> 2 fhist/extract.c source modify 1 -> 2 fhist/list.c source modify 1 -> 2 fhist/main.c source modify 1 -> 2 fhist/name.c source modify 1 -> 2 fhist/prune.c source modify 1 -> 2 fhist/subroutine.c source modify 1 -> 2 fhist/subroutine.h source modify 1 -> 2 fhist/update.c source modify 1 -> 2 fmerge/main.c source modify 1 -> 2 fmerge/work.c source modify 1 -> 2 txt2c/main.c source modify 1 -> 2 txt2c/txt2c.c HISTORY What When Who Comment ------ ------ ----- --------- new_change Sun Mar 29 pmiller 22:17:42 1998 develop_begin Sun Mar 29 pmiller Elapsed time: 6.000 22:17:46 1998 days. develop_end Mon Apr 6 pmiller 14:18:28 1998 review_pass Mon Apr 6 pmiller 14:18:35 1998 integrate_begin Mon Apr 6 pmiller Elapsed time: 0.023 14:18:44 1998 days. integrate_pass Mon Apr 6 pmiller 14:29:03 1998 Project "fhist.1.3", Change 12 Page 1 Change Details Wed Sep 16 08:59:58 1998 NAME Project "fhist.1.3", Delta 4, Change 12. SUMMARY fix build problems DESCRIPTION This change fixes a number of build problems. In essence, this change preparse fhist for internationalization of its error messages. My thanks to Henrik Weber for reporting this problem. This change must pass a full regression test. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by external_bug. FILES Type Action Edit File Name ------- -------- ------- ----------- source create 1 common/ac/ctype.h source modify 2 -> 3 common/ac/dirent.h source create 1 common/ac/libintl.c source create 1 common/ac/libintl.h source modify 2 -> 3 common/ac/limits.h source modify 2 -> 3 common/ac/stdarg.h source modify 2 -> 3 common/ac/stddef.h source modify 2 -> 3 common/ac/stdlib.h source create 1 common/ac/string.c Moved from common/ansi.c source modify 2 -> 3 common/ac/string.h source modify 2 -> 3 common/ac/time.h source create 1 common/ac/unistd.c source modify 3 -> 4 common/ac/unistd.h source create 1 common/ac/wchar.h source create 1 common/ac/wctype.c source create 1 common/ac/wctype.h source remove 2 common/ansi.c Moved to common/ac/string.c source modify 2 -> 3 common/arglex.c source modify 3 -> 4 common/compare.c source modify 3 -> 4 common/error.c source modify 3 -> 4 common/help.c source modify 3 -> 4 common/str.c source modify 3 -> 4 config source modify 1 -> 2 etc/Howto.cook source modify 1 -> 2 etc/config.h.in source modify 1 -> 2 etc/configure.in Project "fhist.1.3", Change 12 Page 2 Change Details Wed Sep 16 08:59:58 1998 Type Action Edit File Name ------- -------- ------- ----------- source modify 3 -> 4 fhist/main.c source modify 3 -> 4 fhist/name.c source modify 3 -> 4 fhist/subroutine.c source modify 3 -> 4 txt2c/txt2c.c HISTORY What When Who Comment ------ ------ ----- --------- new_change Tue Sep 1 pmiller 12:01:50 1998 develop_begin Tue Sep 1 pmiller Elapsed time: 0.673 12:01:55 1998 days. develop_end Tue Sep 1 pmiller 17:04:52 1998 review_pass Tue Sep 1 pmiller 17:04:55 1998 integrate_begin Tue Sep 1 pmiller 17:04:58 1998 integrate_pass Tue Sep 1 pmiller 17:07:29 1998 Project "fhist.1.3", Change 13 Page 1 Change Details Wed Sep 16 08:59:58 1998 NAME Project "fhist.1.3", Delta 3, Change 13. SUMMARY new FSF address DESCRIPTION This change updates the FSF to be the new one. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_improvement. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 1 -> 2 LICENSE source remove 1 aux/BUILDING.man Moved to etc/BUILDING.man source remove 1 aux/CHANGES.1.0 Moved to etc/CHANGES.1.0 source remove 1 aux/CHANGES.1.1 Moved to etc/CHANGES.1.1 source remove 1 aux/CHANGES.1.2 Moved to etc/CHANGES.1.2 source remove 1 aux/CHANGES.sh Moved to etc/CHANGES.sh source remove 2 aux/Howto.cook Moved to etc/Howto.cook source remove 1 aux/MANIFEST.head Moved to etc/MANIFEST.head source remove 1 aux/MANIFEST.sh Moved to etc/MANIFEST.sh source remove 2 aux/Makefi.file.sh Moved to etc/Makefi.file.sh source remove 1 aux/Makefile.awk Moved to etc/Makefile.awk source remove 2 aux/Makefile.head Moved to etc/Makefile.head source remove 2 aux/Makefile.sh Moved to etc/Makefile.sh source remove 2 aux/README.man Moved to etc/README.man source remove 1 aux/archive.cook Moved to etc/archive.cook source remove 1 aux/config.h.in Moved to etc/config.h.in source remove 1 aux/config.h.in1 Moved to etc/config.h.in1 source remove 1 aux/config.h.in2 Moved to etc/config.h.in2 Project "fhist.1.3", Change 13 Page 2 Change Details Wed Sep 16 08:59:58 1998 Type Action Edit File Name ------- -------- ------- ----------- source remove 2 aux/configure.in Moved to etc/configure.in source remove 1 aux/fhist.gif.uue Moved to etc/fhist.gif.uue source remove 1 aux/fhist.html Moved to etc/fhist.html source remove 1 aux/fhist.lsm Moved to etc/fhist.lsm source remove 2 aux/new.1.1.so Moved to etc/new.1.1.so source remove 2 aux/new.1.2.so Moved to etc/new.1.2.so source remove 1 aux/new.1.3.so Moved to etc/new.1.3.so source remove 1 aux/patch.file.sh Moved to etc/patch.file.sh source remove 1 aux/patches.sh Moved to etc/patches.sh source remove 1 aux/rpm-build.sh Moved to etc/rpm-build.sh source remove 1 aux/so.sh Moved to etc/so.sh source remove 1 aux/spec.sh Moved to etc/spec.sh source remove 1 aux/ssp.awk Moved to etc/ssp.awk source remove 1 aux/template/c Moved to etc/template/c source remove 1 aux/template/generic Moved to etc/template/generic source remove 1 aux/template/h Moved to etc/template/h source remove 1 aux/template/man Moved to etc/template/man source remove 1 aux/template/ms Moved to etc/template/ms source remove 1 aux/template/sh Moved to etc/template/sh source remove 1 aux/template/test Moved to etc/template/test source modify 1 -> 2 common/ac/dirent.h source modify 1 -> 2 common/ac/limits.h source modify 1 -> 2 common/ac/stdarg.h source modify 1 -> 2 common/ac/stddef.h source modify 1 -> 2 common/ac/stdlib.h source modify 1 -> 2 common/ac/string.h source modify 1 -> 2 common/ac/time.h source modify 2 -> 3 common/ac/unistd.h source modify 2 -> 3 common/ansi.c source modify 1 -> 2 common/arglex.c source modify 1 -> 2 common/arglex.h source modify 1 -> 2 common/cmalloc.c source modify 1 -> 2 common/cmalloc.h source modify 2 -> 3 common/compare.c source modify 2 -> 3 common/compare.h Project "fhist.1.3", Change 13 Page 3 Change Details Wed Sep 16 08:59:58 1998 Type Action Edit File Name ------- -------- ------- ----------- source modify 2 -> 3 common/error.c source modify 1 -> 2 common/error.h source modify 2 -> 3 common/fileio.c source modify 2 -> 3 common/fileio.h source modify 2 -> 3 common/help.c source modify 1 -> 2 common/help.h source modify 1 -> 2 common/main.h source modify 2 -> 3 common/mprintf.c source modify 1 -> 2 common/mprintf.h source modify 2 -> 3 common/pager.c source modify 2 -> 3 common/pager.h source modify 2 -> 3 common/str.c source modify 1 -> 2 common/str.h source modify 2 -> 3 common/version.c source modify 1 -> 2 common/version.h source modify 1 -> 2 common/version_stmp.c source modify 1 -> 2 common/version_stmp.h source modify 2 -> 3 config source create 1 etc/BUILDING.man Moved from aux/BUILDING.man source create 1 etc/CHANGES.1.0 Moved from aux/CHANGES.1.0 source create 1 etc/CHANGES.1.1 Moved from aux/CHANGES.1.1 source create 1 etc/CHANGES.1.2 Moved from aux/CHANGES.1.2 source create 1 etc/CHANGES.sh Moved from aux/CHANGES.sh source create 1 etc/Howto.cook Moved from aux/Howto.cook source create 1 etc/MANIFEST.head Moved from aux/MANIFEST.head source create 1 etc/MANIFEST.sh Moved from aux/MANIFEST.sh source create 1 etc/Makefi.file.sh Moved from aux/Makefi.file.sh source create 1 etc/Makefile.awk Moved from aux/Makefile.awk source create 1 etc/Makefile.head Moved from aux/Makefile.head source create 1 etc/Makefile.sh Moved from aux/Makefile.sh source create 1 etc/README.man Moved from aux/README.man source create 1 etc/archive.cook Moved from aux/archive.cook source create 1 etc/config.h.in Moved from aux/config.h.in source create 1 etc/config.h.in1 Moved from aux/config.h.in1 source create 1 etc/config.h.in2 Moved from aux/config.h.in2 source create 1 etc/configure.in Moved from aux/configure.in source create 1 etc/fhist.gif.uue Project "fhist.1.3", Change 13 Page 4 Change Details Wed Sep 16 08:59:58 1998 Type Action Edit File Name ------- -------- ------- ----------- Moved from aux/fhist.gif.uue source create 1 etc/fhist.html Moved from aux/fhist.html source create 1 etc/fhist.lsm Moved from aux/fhist.lsm source create 1 etc/new.1.1.so Moved from aux/new.1.1.so source create 1 etc/new.1.2.so Moved from aux/new.1.2.so source create 1 etc/new.1.3.so Moved from aux/new.1.3.so source create 1 etc/patch.file.sh Moved from aux/patch.file.sh source create 1 etc/patches.sh Moved from aux/patches.sh source create 1 etc/rpm-build.sh Moved from aux/rpm-build.sh source create 1 etc/so.sh Moved from aux/so.sh source create 1 etc/spec.sh Moved from aux/spec.sh source create 1 etc/ssp.awk Moved from aux/ssp.awk source create 1 etc/template/c Moved from aux/template/c source create 1 etc/template/generic Moved from aux/template/generic source create 1 etc/template/h Moved from aux/template/h source create 1 etc/template/man Moved from aux/template/man source create 1 etc/template/ms Moved from aux/template/ms source create 1 etc/template/sh Moved from aux/template/sh source create 1 etc/template/test Moved from aux/template/test source modify 2 -> 3 fcomp/main.c source modify 1 -> 2 fhist/breaks.c source modify 1 -> 2 fhist/breaks.h source modify 2 -> 3 fhist/diff.c source modify 1 -> 2 fhist/diff.h source modify 2 -> 3 fhist/extract.c source modify 1 -> 2 fhist/extract.h source modify 1 -> 2 fhist/fhist.h source modify 2 -> 3 fhist/list.c source modify 1 -> 2 fhist/list.h source modify 2 -> 3 fhist/main.c source modify 1 -> 2 fhist/modlin.c source modify 1 -> 2 fhist/modlin.h source modify 2 -> 3 fhist/name.c source modify 1 -> 2 fhist/name.h source modify 2 -> 3 fhist/prune.c source modify 1 -> 2 fhist/prune.h source modify 2 -> 3 fhist/subroutine.c Project "fhist.1.3", Change 13 Page 5 Change Details Wed Sep 16 08:59:58 1998 Type Action Edit File Name ------- -------- ------- ----------- source modify 2 -> 3 fhist/subroutine.h source modify 2 -> 3 fhist/update.c source modify 1 -> 2 fhist/update.h source modify 2 -> 3 fmerge/main.c source modify 2 -> 3 fmerge/work.c source modify 1 -> 2 fmerge/work.h source modify 1 -> 2 man1/fcomp.1 source modify 1 -> 2 man1/fhist.1 source modify 1 -> 2 man1/fmerge.1 source modify 1 -> 2 man1/o__rules.so source modify 1 -> 2 man1/o_help.so source modify 1 -> 2 man1/o_version.so source modify 1 -> 2 man1/z_cr.so source modify 1 -> 2 man1/z_exit.so source modify 1 -> 2 man1/z_fne.so source modify 1 -> 2 man1/z_ref.so test modify 1 -> 2 test/00/t0001a.sh test modify 1 -> 2 test/00/t0002a.sh test modify 1 -> 2 test/00/t0003a.sh test modify 1 -> 2 test/00/t0004a.sh test modify 1 -> 2 test/00/t0005a.sh test modify 1 -> 2 test/00/t0006a.sh test modify 1 -> 2 test/00/t0007a.sh test modify 1 -> 2 test/00/t0008a.sh test modify 1 -> 2 test/00/t0009a.sh test modify 1 -> 2 test/00/t0010a.sh test modify 1 -> 2 test/00/t0011a.sh test modify 1 -> 2 test/00/t0012a.sh test modify 1 -> 2 test/00/t0013a.sh test modify 1 -> 2 test/00/t0014a.sh test modify 1 -> 2 test/00/t0015a.sh test modify 1 -> 2 test/00/t0016a.sh test modify 1 -> 2 test/00/t0017a.sh source modify 2 -> 3 txt2c/main.c source modify 2 -> 3 txt2c/txt2c.c source modify 1 -> 2 txt2c/txt2c.h HISTORY What When Who Comment ------ ------ ----- --------- new_change Tue Sep 1 pmiller 12:43:32 1998 develop_begin Tue Sep 1 pmiller Elapsed time: 0.117 12:43:36 1998 days. develop_end Tue Sep 1 pmiller 13:36:04 1998 review_pass Tue Sep 1 pmiller 13:36:10 1998 integrate_begin Tue Sep 1 pmiller 13:36:14 1998 integrate_pass Tue Sep 1 pmiller 13:38:38 1998 Project "fhist.1.3", Change 14 Page 1 Change Details Wed Sep 16 08:59:59 1998 NAME Project "fhist.1.3", Delta 5, Change 14. SUMMARY internationalization support DESCRIPTION This is the first of several changes which introduce internationalization support. This change must pass a full regression test. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- -------- ------- ----------- source create 1 common/ac/locale.h source create 1 common/ac/termios.h source create 1 common/ac/wchar.c source modify 3 -> 4 common/arglex.c source modify 2 -> 3 common/arglex.h source modify 2 -> 3 common/cmalloc.c source create 1 common/env.c source create 1 common/env.h source modify 4 -> 5 common/error.c source modify 2 -> 3 common/error.h source create 1 common/error_intl.c source create 1 common/error_intl.h source modify 4 -> 5 common/help.c source create 1 common/language.c source create 1 common/language.h source create 1 common/libdir.c source create 1 common/libdir.h source create 1 common/mem.c source create 1 common/mem.h source modify 3 -> 4 common/mprintf.c source create 1 common/page.c source create 1 common/page.h source create 1 common/progname.c source create 1 common/progname.h source modify 4 -> 5 common/str.c source create 1 common/sub.c source create 1 common/sub.h source create 1 common/sub/basename.c source create 1 common/sub/basename.h source create 1 common/sub/date.c source create 1 common/sub/date.h source create 1 common/sub/dirname.c Project "fhist.1.3", Change 14 Page 2 Change Details Wed Sep 16 08:59:59 1998 Type Action Edit File Name ------- -------- ------- ----------- source create 1 common/sub/dirname.h source create 1 common/sub/downcase.c source create 1 common/sub/downcase.h source create 1 common/sub/errno.c source create 1 common/sub/errno.h source create 1 common/sub/expr.c source create 1 common/sub/expr.h source create 1 common/sub/expr_gram.h source create 1 common/sub/expr_gram.y source create 1 common/sub/expr_lex.c source create 1 common/sub/expr_lex.h source create 1 common/sub/ident.c source create 1 common/sub/ident.h source create 1 common/sub/left.c source create 1 common/sub/left.h source create 1 common/sub/length.c source create 1 common/sub/length.h source create 1 common/sub/plural.c source create 1 common/sub/plural.h source create 1 common/sub/private.h source create 1 common/sub/progname.c source create 1 common/sub/progname.h source create 1 common/sub/right.c source create 1 common/sub/right.h source create 1 common/sub/upcase.c source create 1 common/sub/upcase.h source create 1 common/sub/zero_pad.c source create 1 common/sub/zero_pad.h source create 1 common/trace.c source create 1 common/trace.h source modify 3 -> 4 common/version.c source create 1 common/wstr.c source create 1 common/wstr.h source create 1 common/wstr_list.c source create 1 common/wstr_list.h source modify 2 -> 3 etc/Howto.cook source modify 2 -> 3 etc/config.h.in source modify 2 -> 3 etc/configure.in source create 1 etc/libdir-h.in source create 1 etc/txt2c.awk source modify 3 -> 4 fcomp/main.c source modify 4 -> 5 fhist/main.c source modify 3 -> 4 fmerge/main.c source remove 3 txt2c/main.c source remove 4 txt2c/txt2c.c source remove 2 txt2c/txt2c.h HISTORY What When Who Comment ------ ------ ----- --------- new_change Tue Sep 1 pmiller 17:08:35 1998 develop_begin Tue Sep 1 pmiller Elapsed time: 1.000 17:08:38 1998 days. develop_end Wed Sep 2 pmiller Project "fhist.1.3", Change 14 Page 3 Change Details Wed Sep 16 08:59:59 1998 What When Who Comment ------ ------ ----- --------- 13:55:17 1998 review_pass Wed Sep 2 pmiller 13:55:20 1998 integrate_begin Wed Sep 2 pmiller Elapsed time: 0.023 13:55:23 1998 days. integrate_pass Wed Sep 2 pmiller 14:05:54 1998 Project "fhist.1.3", Change 15 Page 1 Change Details Wed Sep 16 08:59:59 1998 NAME Project "fhist.1.3", Delta 6, Change 15. SUMMARY initernationalization DESCRIPTION This change continues to internationalize the code. This change must pass a full regression test. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_improvement. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 5 -> 6 common/help.c source modify 2 -> 3 common/help.h source modify 5 -> 6 common/str.c source modify 3 -> 4 etc/Howto.cook source create 1 etc/i18n.cook source create 1 etc/zer-len-msg.sh source modify 5 -> 6 fhist/main.c source modify 4 -> 5 fmerge/main.c source create 1 lib/en/LC_MESSAGES/common.po source create 1 lib/en/LC_MESSAGES/fcomp.po source create 1 lib/en/LC_MESSAGES/fhist.po source create 1 lib/en/LC_MESSAGES/fmerge.po HISTORY What When Who Comment ------ ------ ----- --------- new_change Wed Sep 2 pmiller 14:07:39 1998 develop_begin Wed Sep 2 pmiller Elapsed time: 1.000 14:07:44 1998 days. develop_end Wed Sep 2 pmiller 22:33:04 1998 review_pass Wed Sep 2 pmiller 22:33:09 1998 integrate_begin Wed Sep 2 pmiller 22:33:14 1998 integrate_pass Wed Sep 2 pmiller 22:34:58 1998 Project "fhist.1.3", Change 16 Page 1 Change Details Wed Sep 16 09:00:00 1998 NAME Project "fhist.1.3", Delta 7, Change 16. SUMMARY fhist internationalization DESCRIPTION This change extracts the error messages for the fhist program. There is also some tidying-up of the error messages surrounding file operations. This change must pass a full regression test. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 4 -> 5 common/compare.c source modify 3 -> 4 common/fileio.c source modify 3 -> 4 common/fileio.h source modify 6 -> 7 common/help.c source modify 3 -> 4 common/pager.c source modify 4 -> 5 common/version.c source modify 1 -> 2 etc/i18n.cook source modify 3 -> 4 fhist/diff.c source modify 3 -> 4 fhist/extract.c source modify 3 -> 4 fhist/list.c source modify 6 -> 7 fhist/main.c source modify 2 -> 3 fhist/modlin.c source modify 4 -> 5 fhist/name.c source modify 3 -> 4 fhist/prune.c source modify 4 -> 5 fhist/subroutine.c source modify 3 -> 4 fhist/subroutine.h source modify 3 -> 4 fhist/update.c source modify 3 -> 4 fmerge/work.c source modify 1 -> 2 lib/en/LC_MESSAGES/common.po source modify 1 -> 2 lib/en/LC_MESSAGES/fhist.po source modify 1 -> 2 lib/en/LC_MESSAGES/fmerge.po HISTORY What When Who Comment ------ ------ ----- --------- new_change Wed Sep 2 pmiller 22:36:32 1998 develop_begin Wed Sep 2 pmiller Elapsed time: 4.000 22:36:35 1998 days. develop_end Tue Sep 8 pmiller 10:23:20 1998 Project "fhist.1.3", Change 16 Page 2 Change Details Wed Sep 16 09:00:00 1998 What When Who Comment ------ ------ ----- --------- review_pass Tue Sep 8 pmiller 10:23:20 1998 integrate_begin Tue Sep 8 pmiller 10:23:21 1998 integrate_pass Tue Sep 8 pmiller 10:25:22 1998 Project "fhist.1.3", Change 17 Page 1 Change Details Wed Sep 16 09:00:00 1998 NAME Project "fhist.1.3", Delta 8, Change 17. SUMMARY fhist message comments DESCRIPTION This change adds the commentary to the fhist error messages. This change must pass a full regression test. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_improvement. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 3 -> 4 common/error.h source modify 2 -> 3 etc/i18n.cook source modify 4 -> 5 fhist/diff.c source modify 4 -> 5 fhist/extract.c source modify 4 -> 5 fhist/list.c source modify 7 -> 8 fhist/main.c source modify 5 -> 6 fhist/name.c source modify 4 -> 5 fhist/prune.c source modify 5 -> 6 fhist/subroutine.c source modify 4 -> 5 fhist/update.c source modify 2 -> 3 lib/en/LC_MESSAGES/common.po source modify 2 -> 3 lib/en/LC_MESSAGES/fhist.po HISTORY What When Who Comment ------ ------ ----- --------- new_change Tue Sep 8 pmiller 10:25:44 1998 develop_begin Tue Sep 8 pmiller Elapsed time: 2.339 10:25:47 1998 days. develop_end Thu Sep 10 pmiller 12:58:21 1998 review_pass Thu Sep 10 pmiller 12:58:24 1998 integrate_begin Thu Sep 10 pmiller 12:58:27 1998 integrate_pass Thu Sep 10 pmiller 13:00:13 1998 Project "fhist.1.3", Change 18 Page 1 Change Details Wed Sep 16 09:00:00 1998 NAME Project "fhist.1.3", Delta 9, Change 18. SUMMARY message commentary DESCRIPTION This change adds the rest of the message file commentary (common, fcomp, fmerge) This change must pass a full regression test. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_improvement. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 4 -> 5 fcomp/main.c source modify 5 -> 6 fmerge/main.c source modify 4 -> 5 fmerge/work.c source modify 3 -> 4 lib/en/LC_MESSAGES/common.po source modify 1 -> 2 lib/en/LC_MESSAGES/fcomp.po source modify 2 -> 3 lib/en/LC_MESSAGES/fmerge.po HISTORY What When Who Comment ------ ------ ----- --------- new_change Thu Sep 10 pmiller 13:03:54 1998 develop_begin Thu Sep 10 pmiller Elapsed time: 0.595 13:03:57 1998 days. develop_end Thu Sep 10 pmiller 17:31:38 1998 review_pass Thu Sep 10 pmiller 17:31:50 1998 integrate_begin Thu Sep 10 pmiller 17:31:53 1998 integrate_pass Thu Sep 10 pmiller 17:33:25 1998 Project "fhist.1.3", Change 19 Page 1 Change Details Wed Sep 16 09:00:00 1998 NAME Project "fhist.1.3", Delta 11, Change 19. SUMMARY translation fix DESCRIPTION This change corrects one of the translations. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_bug. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 1 -> 2 etc/MANIFEST.sh source modify 3 -> 4 lib/en/LC_MESSAGES/fhist.po HISTORY What When Who Comment ------ ------ ----- --------- new_change Thu Sep 10 pmiller 17:34:43 1998 develop_begin Thu Sep 10 pmiller Elapsed time: 2.000 17:34:46 1998 days. develop_end Mon Sep 14 pmiller 08:38:34 1998 review_pass Mon Sep 14 pmiller 08:38:39 1998 integrate_begin Mon Sep 14 pmiller 08:38:41 1998 integrate_pass Mon Sep 14 pmiller 08:40:02 1998 Project "fhist.1.3", Change 20 Page 1 Change Details Wed Sep 16 09:00:00 1998 NAME Project "fhist.1.3", Delta 10, Change 20. SUMMARY move man pages DESCRIPTION This change moves the man pages into the English sub-tree. This change must pass a full regression test. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- -------- ------- ----------- source remove 2 LICENSE Moved to lib/en/man1/fhist_lic.1 source modify 7 -> 8 common/help.c source modify 3 -> 4 common/help.h source create 1 common/str_list.c source create 1 common/str_list.h source modify 5 -> 6 common/version.c source modify 4 -> 5 etc/Howto.cook source modify 1 -> 2 etc/Makefi.file.sh source modify 1 -> 2 etc/Makefile.head source modify 1 -> 2 etc/Makefile.sh source modify 1 -> 2 etc/README.man source modify 1 -> 2 etc/archive.cook source modify 3 -> 4 etc/configure.in source modify 1 -> 2 etc/spec.sh source remove 1 etc/txt2c.awk source modify 5 -> 6 fcomp/main.c source modify 8 -> 9 fhist/main.c source modify 6 -> 7 fmerge/main.c source modify 4 -> 5 lib/en/LC_MESSAGES/common.po source create 1 lib/en/man1/fcomp.1 Moved from man1/fcomp.1 source create 1 lib/en/man1/fhist.1 Moved from man1/fhist.1 source create 1 lib/en/man1/fhist_lic.1 Moved from LICENSE source create 1 lib/en/man1/fmerge.1 Moved from man1/fmerge.1 source create 1 lib/en/man1/o__rules.so Moved from man1/o__rules.so source create 1 lib/en/man1/o_help.so Moved from man1/o_help.so source create 1 lib/en/man1/o_version.so Project "fhist.1.3", Change 20 Page 2 Change Details Wed Sep 16 09:00:00 1998 Type Action Edit File Name ------- -------- ------- ----------- Moved from man1/o_version.so source create 1 lib/en/man1/z_cr.so Moved from man1/z_cr.so source create 1 lib/en/man1/z_exit.so Moved from man1/z_exit.so source create 1 lib/en/man1/z_fne.so Moved from man1/z_fne.so source create 1 lib/en/man1/z_ref.so Moved from man1/z_ref.so source create 1 lib/en/reference/main.man source remove 2 man1/fcomp.1 Moved to lib/en/man1/fcomp.1 source remove 2 man1/fhist.1 Moved to lib/en/man1/fhist.1 source remove 2 man1/fmerge.1 Moved to lib/en/man1/fmerge.1 source remove 2 man1/o__rules.so Moved to lib/en/man1/o__rules.so source remove 2 man1/o_help.so Moved to lib/en/man1/o_help.so source remove 2 man1/o_version.so Moved to lib/en/man1/o_version.so source remove 2 man1/z_cr.so Moved to lib/en/man1/z_cr.so source remove 2 man1/z_exit.so Moved to lib/en/man1/z_exit.so source remove 2 man1/z_fne.so Moved to lib/en/man1/z_fne.so source remove 2 man1/z_ref.so Moved to lib/en/man1/z_ref.so HISTORY What When Who Comment ------ ------ ----- --------- new_change Thu Sep 10 pmiller 17:52:15 1998 develop_begin Thu Sep 10 pmiller Elapsed time: 1.000 17:52:18 1998 days. develop_end Fri Sep 11 pmiller 17:32:27 1998 review_pass Fri Sep 11 pmiller 17:32:31 1998 integrate_begin Fri Sep 11 pmiller Elapsed time: 1.000 17:32:33 1998 days. integrate_pass Mon Sep 14 pmiller 08:31:40 1998 Project "fhist.1.3", Change 21 Page 1 Change Details Wed Sep 16 09:00:01 1998 NAME Project "fhist.1.3", Delta 12, Change 21. SUMMARY new cook features DESCRIPTION This change updates the build system to exploit the new cook cascade feature, and some others. This makes the builds go fater, not that this is a very large project, but it gains symmetry with my other main projects. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_improvement. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 5 -> 6 etc/Howto.cook source modify 2 -> 3 etc/Makefi.file.sh source modify 2 -> 3 etc/archive.cook HISTORY What When Who Comment ------ ------ ----- --------- new_change Mon Sep 14 pmiller 08:42:03 1998 develop_begin Mon Sep 14 pmiller Elapsed time: 0.285 08:42:20 1998 days. develop_end Mon Sep 14 pmiller 10:50:24 1998 review_pass Mon Sep 14 pmiller 10:50:27 1998 integrate_begin Mon Sep 14 pmiller 10:50:30 1998 integrate_pass Mon Sep 14 pmiller 10:52:29 1998 Project "fhist.1.3", Change 22 Page 1 Change Details Wed Sep 16 09:00:01 1998 NAME Project "fhist.1.3", Delta 13, Change 22. SUMMARY reference manual DESCRIPTION This change moves the documentation into a language-specific directory, and creates the reference manual. This change must pass a full regression test. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_improvement. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 4 -> 5 config source remove 1 etc/BUILDING.man Moved to lib/en/building/main.man source modify 6 -> 7 etc/Howto.cook source modify 2 -> 3 etc/MANIFEST.sh source modify 3 -> 4 etc/Makefi.file.sh source modify 2 -> 3 etc/Makefile.head source modify 2 -> 3 etc/Makefile.sh source remove 2 etc/README.man Moved to lib/en/readme/main.man source modify 3 -> 4 etc/archive.cook source create 1 etc/document.cook source modify 1 -> 2 etc/fhist.html source modify 1 -> 2 etc/fhist.lsm source create 1 etc/ptx.ignore source create 1 etc/ptx.sh source create 1 etc/ptx1.awk source create 1 etc/ptx2.awk source create 1 etc/ref-toc.so source modify 2 -> 3 etc/spec.sh source modify 1 -> 2 etc/template/man source create 1 lib/en/building/main.man Moved from etc/BUILDING.man source modify 1 -> 2 lib/en/man1/fcomp.1 source modify 1 -> 2 lib/en/man1/fhist.1 source modify 1 -> 2 lib/en/man1/fhist_lic.1 source modify 1 -> 2 lib/en/man1/fmerge.1 source modify 1 -> 2 lib/en/man1/z_cr.so source create 1 lib/en/readme/main.man Moved from etc/README.man source modify 1 -> 2 lib/en/reference/main.man Project "fhist.1.3", Change 22 Page 2 Change Details Wed Sep 16 09:00:01 1998 HISTORY What When Who Comment ------ ------ ----- --------- new_change Mon Sep 14 pmiller 12:30:19 1998 develop_begin Mon Sep 14 pmiller Elapsed time: 0.331 12:30:23 1998 days. develop_end Mon Sep 14 pmiller 14:59:24 1998 review_pass Mon Sep 14 pmiller 14:59:30 1998 integrate_begin Mon Sep 14 pmiller 14:59:33 1998 integrate_fail Mon Sep 14 pmiller obsolete reference to 15:01:15 1998 a common/sub/expr_ gram.gen.d file Elapsed time: 0.051 days. develop_end Mon Sep 14 pmiller 15:23:59 1998 review_pass Mon Sep 14 pmiller 15:28:53 1998 integrate_begin Mon Sep 14 pmiller 15:30:29 1998 integrate_fail Mon Sep 14 pmiller obsolete reference to 15:31:37 1998 the "doc/version.so" file develop_end Mon Sep 14 pmiller 15:36:05 1998 review_pass Mon Sep 14 pmiller 15:36:08 1998 integrate_begin Mon Sep 14 pmiller 15:36:10 1998 integrate_fail Mon Sep 14 pmiller obsolete reference to 15:37:32 1998 "etc/new.so" file develop_end Mon Sep 14 pmiller 15:41:47 1998 review_pass Mon Sep 14 pmiller 15:41:51 1998 integrate_begin Mon Sep 14 pmiller 15:41:53 1998 integrate_pass Mon Sep 14 pmiller 15:45:36 1998 Project "fhist.1.3", Change 23 Page 1 Change Details Wed Sep 16 09:00:01 1998 NAME Project "fhist.1.3", Delta 14, Change 23. SUMMARY fix build warnings DESCRIPTION Tjis change fixes a number of build warnings only seen at integrate build time. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_bug. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 4 -> 5 etc/archive.cook source modify 1 -> 2 etc/document.cook source modify 2 -> 3 etc/fhist.html source modify 1 -> 2 lib/en/building/main.man source modify 1 -> 2 lib/en/readme/main.man HISTORY What When Who Comment ------ ------ ----- --------- new_change Mon Sep 14 pmiller 16:51:00 1998 develop_begin Mon Sep 14 pmiller Elapsed time: 0.076 16:51:03 1998 days. develop_end Mon Sep 14 pmiller 17:25:14 1998 review_pass Mon Sep 14 pmiller 17:25:18 1998 integrate_begin Mon Sep 14 pmiller 17:25:20 1998 integrate_pass Mon Sep 14 pmiller 17:26:40 1998 Project "fhist.1.3", Change 24 Page 1 Change Details Wed Sep 16 09:00:01 1998 NAME Project "fhist.1.3", Delta 15, Change 24. SUMMARY update the building instructions DESCRIPTION This change updates the building instructions to cover the new internationalization and configuration details. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_improvement. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 3 -> 4 etc/Makefile.sh source modify 2 -> 3 etc/document.cook source remove 1 etc/new.1.1.so Moved to lib/en/readme/new.1.1.so source remove 1 etc/new.1.2.so Moved to lib/en/readme/new.1.2.so source remove 1 etc/new.1.3.so Moved to lib/en/readme/new.1.3.so source modify 2 -> 3 lib/en/building/main.man source modify 2 -> 3 lib/en/man1/fcomp.1 source modify 2 -> 3 lib/en/man1/fhist.1 source modify 2 -> 3 lib/en/man1/fmerge.1 source modify 2 -> 3 lib/en/man1/z_cr.so source modify 2 -> 3 lib/en/readme/main.man source create 1 lib/en/readme/new.1.1.so Moved from etc/new.1.1.so source create 1 lib/en/readme/new.1.2.so Moved from etc/new.1.2.so source create 1 lib/en/readme/new.1.3.so Moved from etc/new.1.3.so source create 1 lib/en/reference/i18n.pic.so source create 1 lib/en/reference/i18n.so source modify 2 -> 3 lib/en/reference/main.man HISTORY What When Who Comment ------ ------ ----- --------- new_change Tue Sep 15 pmiller 17:21:03 1998 develop_begin Tue Sep 15 pmiller Elapsed time: 1.000 17:21:08 1998 days. develop_end Wed Sep 16 pmiller Project "fhist.1.3", Change 24 Page 2 Change Details Wed Sep 16 09:00:01 1998 What When Who Comment ------ ------ ----- --------- 08:45:19 1998 review_pass Wed Sep 16 pmiller 08:47:16 1998 integrate_begin Wed Sep 16 pmiller 08:47:23 1998 integrate_pass Wed Sep 16 pmiller 08:51:44 1998 fhist-1.18/etc/CHANGES.1.4 644 0 0 3320211265752627 140770ustar PeterMiller 0 0 Project "fhist.1.4" Page 1 List of Changes Tue Jun 1 12:25:23 1999 Change State Description ------- ------- ------------- 10 completed prepare for release 11 completed get version number right 12 completed buffer overruns 13 completed stat bug fix 14 completed improve auto-configure 15 completed binary files Project "fhist.1.4", Change 10 Page 1 Change Details Tue Jun 1 12:25:24 1999 NAME Project "fhist.1.4", Delta 1, Change 10. SUMMARY prepare for release DESCRIPTION This change prepares version 1.4 for release. It corrects a number of configuration and build problems found during test installs on various architectures. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- -------- ------- ----------- source create 1 common/ac/stdio.c source modify 1 -> 2 common/ac/stdio.h source create 1 etc/CHANGES.1.3 source modify 4 -> 5 etc/Makefile.sh source modify 5 -> 6 etc/archive.cook source modify 4 -> 5 etc/configure.in source modify 6 -> 7 fhist/subroutine.c source modify 3 -> 4 lib/en/readme/main.man source create 1 lib/en/readme/new.1.4.so source modify 3 -> 4 lib/en/reference/main.man HISTORY What When Who Comment ------ ------ ----- --------- new_change Wed Sep 16 pmiller 08:58:59 1998 develop_begin Wed Sep 16 pmiller Elapsed time: 1.407 08:59:05 1998 days. develop_end Thu Sep 17 pmiller 12:02:25 1998 review_pass Thu Sep 17 pmiller 12:02:29 1998 integrate_begin Thu Sep 17 pmiller 12:02:31 1998 integrate_pass Thu Sep 17 pmiller 12:05:10 1998 Project "fhist.1.4", Change 11 Page 1 Change Details Tue Jun 1 12:25:24 1999 NAME Project "fhist.1.4", Delta 2, Change 11. SUMMARY get version number right DESCRIPTION There are changes with the version numbering in the distribution set. This change brings them up-to-date. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_bug. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 6 -> 7 etc/archive.cook source modify 3 -> 4 etc/document.cook HISTORY What When Who Comment ------ ------ ----- --------- new_change Thu Sep 17 pmiller 12:09:21 1998 develop_begin Thu Sep 17 pmiller Elapsed time: 0.033 12:09:27 1998 days. develop_end Thu Sep 17 pmiller 12:24:22 1998 review_pass Thu Sep 17 pmiller 12:24:25 1998 integrate_begin Thu Sep 17 pmiller Elapsed time: 0.092 12:24:28 1998 days. integrate_pass Thu Sep 17 pmiller 13:05:55 1998 Project "fhist.1.4", Change 12 Page 1 Change Details Tue Jun 1 12:25:24 1999 NAME Project "fhist.1.4", Delta 3, Change 12. SUMMARY buffer overruns DESCRIPTION This change elimitaes a few potential buffer overruns. My thanks to Erick for reporting this problem. This change must pass a full regression test. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by external_bug. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 1 -> 2 common/ac/stdio.c source modify 1 -> 2 common/ac/string.c source modify 5 -> 6 common/compare.c source modify 5 -> 6 common/error.c source modify 1 -> 2 common/sub/errno.c source modify 5 -> 6 fhist/diff.c source modify 7 -> 8 fhist/subroutine.c HISTORY What When Who Comment ------ ------ ----- --------- new_change Fri Nov 20 pmiller 09:43:39 1998 develop_begin Fri Nov 20 pmiller Elapsed time: 0.085 09:43:55 1998 days. develop_end Fri Nov 20 pmiller 10:22:08 1998 review_pass Fri Nov 20 pmiller 10:22:55 1998 integrate_begin Fri Nov 20 pmiller 10:22:58 1998 integrate_pass Fri Nov 20 pmiller 10:24:32 1998 Project "fhist.1.4", Change 13 Page 1 Change Details Tue Jun 1 12:25:24 1999 NAME Project "fhist.1.4", Delta 4, Change 13. SUMMARY stat bug fix DESCRIPTION This change corrects a bug where obsolete S_IFMT/S_IFDIR usage is not portable. My thasnks to Dean Giberson for reporting this problem. This change must pass a full regression test. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by external_bug. FILES Type Action Edit File Name ------- -------- ------- ----------- source create 1 common/isdir.c source create 1 common/isdir.h source modify 6 -> 7 fcomp/main.c source modify 9 -> 10 fhist/main.c source modify 8 -> 9 fhist/subroutine.c source modify 4 -> 5 fhist/subroutine.h HISTORY What When Who Comment ------ ------ ----- --------- new_change Fri Jan 22 pmiller 16:11:22 1999 develop_begin Fri Jan 22 pmiller Elapsed time: 0.042 16:11:27 1999 days. develop_end Fri Jan 22 pmiller 16:30:31 1999 review_pass Fri Jan 22 pmiller 16:30:34 1999 integrate_begin Fri Jan 22 pmiller 16:30:40 1999 integrate_pass Fri Jan 22 pmiller 16:34:18 1999 Project "fhist.1.4", Change 14 Page 1 Change Details Tue Jun 1 12:25:24 1999 NAME Project "fhist.1.4", Delta 5, Change 14. SUMMARY improve auto-configure DESCRIPTION This change improves the use made of GNU Autoconf to get Cygnus (etc) builds working better. My thanks to Ted Byers for this suggestion. This change must pass a full regression test. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by external_bug. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 1 -> 2 common/ac/libintl.h source modify 7 -> 8 etc/Howto.cook source modify 4 -> 5 etc/Makefi.file.sh source modify 1 -> 2 etc/Makefile.awk source modify 3 -> 4 etc/Makefile.head source modify 5 -> 6 etc/Makefile.sh source modify 5 -> 6 etc/configure.in HISTORY What When Who Comment ------ ------ ----- --------- new_change Wed Jan 27 pmiller 21:15:42 1999 develop_begin Wed Jan 27 pmiller Elapsed time: 0.180 21:15:49 1999 days. develop_end Wed Jan 27 pmiller 22:36:40 1999 review_pass Wed Jan 27 pmiller 22:36:48 1999 integrate_begin Wed Jan 27 pmiller 22:36:50 1999 integrate_pass Wed Jan 27 pmiller 22:42:01 1999 Project "fhist.1.4", Change 15 Page 1 Change Details Tue Jun 1 12:25:25 1999 NAME Project "fhist.1.4", Delta 6, Change 15. SUMMARY binary files DESCRIPTION This change fixes a bug in fcomp which incorrectly reported binary files being the same. While it is not a complete fix (only a near-total re-write could do that) it helps a great deal. In addition, binary files are now detected on input an warned about (fcomp, fmerge) or errored (fhist) as appropriate. The manual pages have been updated to reflect this. My thanks to Benoit Jauvin-Girard for reporting this problem. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by external_bug. FILES Type Action Edit File Name ------- -------- ------- ----------- source create 1 common/ac/signal.h source modify 1 -> 2 common/ac/wctype.h source modify 6 -> 7 common/compare.c source modify 3 -> 4 common/compare.h source create 1 common/config.messy.h source modify 6 -> 7 common/error.c source modify 4 -> 5 common/error.h source modify 4 -> 5 common/fileio.c source modify 4 -> 5 common/fileio.h source modify 4 -> 5 common/pager.c source modify 6 -> 7 common/str.c source modify 1 -> 2 common/wstr.c source modify 8 -> 9 etc/Howto.cook source modify 1 -> 2 etc/config.h.in2 source modify 2 -> 3 fhist/breaks.c source modify 6 -> 7 fhist/diff.c source modify 5 -> 6 fhist/extract.c source modify 5 -> 6 fhist/list.c source modify 3 -> 4 fhist/modlin.c source modify 9 -> 10 fhist/subroutine.c source modify 5 -> 6 fhist/subroutine.h source modify 5 -> 6 fhist/update.c source modify 5 -> 6 fmerge/work.c source modify 5 -> 6 lib/en/LC_MESSAGES/common.po source modify 3 -> 4 lib/en/man1/fcomp.1 source modify 3 -> 4 lib/en/man1/fhist.1 source modify 3 -> 4 lib/en/man1/fmerge.1 Project "fhist.1.4", Change 15 Page 2 Change Details Tue Jun 1 12:25:25 1999 Type Action Edit File Name ------- -------- ------- ----------- source create 1 lib/en/man1/z_binary.so source modify 1 -> 2 lib/en/readme/new.1.4.so test create 1 test/00/t0018a.sh HISTORY What When Who Comment ------ ------ ----- --------- new_change Tue Jun 1 pmiller 08:21:55 1999 develop_begin Tue Jun 1 pmiller Elapsed time: 0.466 08:22:01 1999 days. develop_end Tue Jun 1 pmiller 11:51:45 1999 review_pass Tue Jun 1 pmiller 11:51:49 1999 integrate_begin Tue Jun 1 pmiller 11:51:52 1999 integrate_fail Tue Jun 1 pmiller man page problem 11:56:17 1999 develop_end Tue Jun 1 pmiller 12:02:39 1999 review_pass Tue Jun 1 pmiller 12:02:39 1999 integrate_begin Tue Jun 1 pmiller 12:09:52 1999 integrate_pass Tue Jun 1 pmiller 12:15:08 1999 fhist-1.18/etc/CHANGES.1.5 644 0 0 2321311265752627 141010ustar PeterMiller 0 0 Project "fhist.1.5" Page 1 List of Changes Mon Oct 25 11:34:59 1999 Change State Description ------- ------- ------------- 10 completed prepare for release 11 completed RPM spec 12 completed pathconf bug 13 completed FSF address 14 completed fcomp -blank bug 15 completed yacc compile warnings Project "fhist.1.5", Change 10 Page 1 Change Details Mon Oct 25 11:34:59 1999 NAME Project "fhist.1.5", Delta 1, Change 10. SUMMARY prepare for release DESCRIPTION This change prepares FHist for the next public release. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- -------- ------- ----------- source create 1 etc/CHANGES.1.4 source create 1 lib/en/readme/new.1.5.so HISTORY What When Who Comment ------ ------ ----- --------- new_change Tue Jun 1 pmiller 12:24:41 1999 develop_begin Tue Jun 1 pmiller 12:24:44 1999 develop_end Tue Jun 1 pmiller 12:29:00 1999 review_pass Tue Jun 1 pmiller 12:29:02 1999 integrate_begin Tue Jun 1 pmiller 12:29:04 1999 integrate_pass Tue Jun 1 pmiller 12:30:24 1999 Project "fhist.1.5", Change 11 Page 1 Change Details Mon Oct 25 11:35:00 1999 NAME Project "fhist.1.5", Delta 2, Change 11. SUMMARY RPM spec DESCRIPTION This change improves the generated RPM spec files, so that RPMs can be produced by users other than root. My thanks to John Interrante for reporting this problem. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by external_bug. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 3 -> 4 etc/spec.sh HISTORY What When Who Comment ------ ------ ----- --------- new_change Thu Jun 10 pmiller 11:11:30 1999 develop_begin Thu Jun 10 pmiller Elapsed time: 0.022 11:11:33 1999 days. develop_end Thu Jun 10 pmiller Elapsed time: 0.081 11:21:39 1999 days. review_pass Thu Jun 10 pmiller 11:58:11 1999 integrate_begin Thu Jun 10 pmiller 11:58:13 1999 integrate_pass Thu Jun 10 pmiller 11:59:24 1999 Project "fhist.1.5", Change 12 Page 1 Change Details Mon Oct 25 11:35:00 1999 NAME Project "fhist.1.5", Delta 3, Change 12. SUMMARY pathconf bug DESCRIPTION This change fixes a problem with the pathconf function on HP/UX machines. My thanks to Marko Schuetz for reporting this problem. This change must pass a full regression test. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by external_bug. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 10 -> 11 fhist/subroutine.c HISTORY What When Who Comment ------ ------ ----- --------- new_change Mon Jul 5 pmiller 08:30:44 1999 develop_begin Mon Jul 5 pmiller Elapsed time: 0.050 08:30:47 1999 days. develop_end Mon Jul 5 pmiller 08:53:24 1999 review_pass Mon Jul 5 pmiller 08:53:57 1999 integrate_begin Mon Jul 5 pmiller 08:54:01 1999 integrate_pass Mon Jul 5 pmiller 08:55:51 1999 Project "fhist.1.5", Change 13 Page 1 Change Details Mon Oct 25 11:35:00 1999 NAME Project "fhist.1.5", Delta 4, Change 13. SUMMARY FSF address DESCRIPTION This change updates the FSF address in the GPL file headers. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 4 -> 5 lib/en/reference/main.man HISTORY What When Who Comment ------ ------ ----- --------- new_change Sat Aug 7 pmiller 13:59:13 1999 develop_begin Sat Aug 7 pmiller 13:59:15 1999 develop_end Sat Aug 7 pmiller 14:03:44 1999 review_pass Sat Aug 7 pmiller 14:03:47 1999 integrate_begin Sat Aug 7 pmiller 14:03:50 1999 integrate_pass Sat Aug 7 pmiller 14:05:57 1999 Project "fhist.1.5", Change 14 Page 1 Change Details Mon Oct 25 11:35:00 1999 NAME Project "fhist.1.5", Delta 5, Change 14. SUMMARY fcomp -blank bug DESCRIPTION This change fixed a bug in the fcomp -blank option, which failed to terminate when run with with two identical files. My thanks to Alex for reporting this problem. This change must pass a full regression test. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by external_bug. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 7 -> 8 common/compare.c test create 1 test/00/t0019a.sh HISTORY What When Who Comment ------ ------ ----- --------- new_change Mon Oct 25 pmiller 08:26:38 1999 develop_begin Mon Oct 25 pmiller Elapsed time: 0.076 08:26:40 1999 days. develop_end Mon Oct 25 pmiller 09:00:57 1999 review_pass Mon Oct 25 pmiller 09:01:02 1999 integrate_begin Mon Oct 25 pmiller Elapsed time: 0.036 09:01:08 1999 days. integrate_pass Mon Oct 25 pmiller 09:17:28 1999 Project "fhist.1.5", Change 15 Page 1 Change Details Mon Oct 25 11:35:01 1999 NAME Project "fhist.1.5", Delta 6, Change 15. SUMMARY yacc compile warnings DESCRIPTION This change fixes some yacc compile warnings. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 1 -> 2 common/sub/expr_gram.y source modify 1 -> 2 lib/en/readme/new.1.5.so HISTORY What When Who Comment ------ ------ ----- --------- new_change Mon Oct 25 pmiller 10:43:35 1999 develop_begin Mon Oct 25 pmiller Elapsed time: 0.072 10:43:37 1999 days. develop_end Mon Oct 25 pmiller 11:16:04 1999 review_pass Mon Oct 25 pmiller 11:16:21 1999 integrate_begin Mon Oct 25 pmiller 11:16:26 1999 integrate_pass Mon Oct 25 pmiller 11:23:31 1999 fhist-1.18/etc/CHANGES.1.6 644 0 0 4253211265752627 141070ustar PeterMiller 0 0 Project "fhist.1.6" Page 1 List of Changes Tue Apr 11 09:32:31 2000 Change State Description ------- ------- ------------- 10 completed prepare for release 11 completed fhist -t bug 12 completed Fix attribution on web page. 13 completed --make-path option 14 completed fhist discarded unterminated last line 15 completed binary files 16 completed refactor error messages 17 completed Y2K doco glitches Project "fhist.1.6", Change 10 Page 1 Change Details Tue Apr 11 09:32:32 2000 NAME Project "fhist.1.6", Delta 1, Change 10. SUMMARY prepare for release DESCRIPTION This change prepares FHist for the next public release. This change must pass a full regression test. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- -------- ------- ----------- source create 1 etc/CHANGES.1.5 source modify 1 -> 2 etc/rpm-build.sh source modify 2 -> 3 lib/en/readme/new.1.5.so source create 1 lib/en/readme/new.1.6.so HISTORY What When Who Comment ------ ------ ----- --------- new_change Mon Oct 25 pmiller 11:34:29 1999 develop_begin Mon Oct 25 pmiller Elapsed time: 0.354 11:34:30 1999 days. develop_end Mon Oct 25 pmiller 14:13:52 1999 review_pass Mon Oct 25 pmiller 14:17:40 1999 integrate_begin Mon Oct 25 pmiller 14:17:43 1999 integrate_pass Mon Oct 25 pmiller 14:20:30 1999 Project "fhist.1.6", Change 11 Page 1 Change Details Tue Apr 11 09:32:33 2000 NAME Project "fhist.1.6", Delta 2, Change 11. SUMMARY fhist -t bug DESCRIPTION This change fixes a SEGFAULT in fhist when you use the -t option (extract to terminal). My thanks to Alex for reporting this problem. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by external_bug. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 5 -> 6 common/fileio.c source modify 10 -> 11 fhist/main.c source modify 6 -> 7 fhist/name.c test create 1 test/00/t0020a.sh HISTORY What When Who Comment ------ ------ ----- --------- new_change Thu Oct 28 pmiller 12:43:30 1999 develop_begin Thu Oct 28 pmiller Elapsed time: 0.086 12:43:32 1999 days. develop_end Thu Oct 28 pmiller 13:22:05 1999 review_pass Thu Oct 28 pmiller 13:22:33 1999 integrate_begin Thu Oct 28 pmiller 13:22:36 1999 integrate_pass Thu Oct 28 pmiller 13:25:13 1999 Project "fhist.1.6", Change 12 Page 1 Change Details Tue Apr 11 09:32:33 2000 NAME Project "fhist.1.6", Delta 3, Change 12. SUMMARY Fix attribution on web page. DESCRIPTION This change fixes the ownership attrinbution on the web page to mention David Bell. My thanks to Bob Barry for pointing out this unfortunate oversight. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by external_bug. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 3 -> 4 etc/fhist.html HISTORY What When Who Comment ------ ------ ----- --------- new_change Tue Nov 9 pmiller 11:20:43 1999 develop_begin Tue Nov 9 pmiller 11:20:44 1999 develop_end Tue Nov 9 pmiller 11:24:24 1999 review_pass Tue Nov 9 pmiller 11:29:21 1999 integrate_begin Tue Nov 9 pmiller 11:29:24 1999 integrate_pass Tue Nov 9 pmiller 11:32:49 1999 Project "fhist.1.6", Change 13 Page 1 Change Details Tue Apr 11 09:32:34 2000 NAME Project "fhist.1.6", Delta 4, Change 13. SUMMARY --make-path option DESCRIPTION This change adds the --make-path option to the fhist command. My thanks to Bud P. Bruegger for this suggestion. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by external_enhancement. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 11 -> 12 fhist/main.c source modify 4 -> 5 lib/en/man1/fhist.1 source modify 1 -> 2 lib/en/readme/new.1.6.so test create 1 test/00/t0021a.sh HISTORY What When Who Comment ------ ------ ----- --------- new_change Mon Nov 15 pmiller 16:04:21 1999 develop_begin Mon Nov 15 pmiller Elapsed time: 0.078 16:04:26 1999 days. develop_end Mon Nov 15 pmiller 16:39:33 1999 review_pass Mon Nov 15 pmiller 16:40:39 1999 integrate_begin Mon Nov 15 pmiller 16:40:42 1999 integrate_pass Mon Nov 15 pmiller 16:43:00 1999 Project "fhist.1.6", Change 14 Page 1 Change Details Tue Apr 11 09:32:35 2000 NAME Project "fhist.1.6", Delta 5, Change 14. SUMMARY fhist discarded unterminated last line DESCRIPTION This change fixed a bug where fhist would discard the last line of a file if it was missing the terminating newline. My thanks to Geoff Soutter for reporting this problem. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by external_bug. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 6 -> 7 common/fileio.c source modify 6 -> 7 lib/en/LC_MESSAGES/common.po test create 1 test/00/t0022a.sh HISTORY What When Who Comment ------ ------ ----- --------- new_change Tue Apr 4 pmiller 12:10:47 2000 develop_begin Tue Apr 4 pmiller Elapsed time: 4.000 12:10:49 2000 days. develop_end Fri Apr 7 pmiller 21:41:45 2000 review_pass Fri Apr 7 pmiller 21:42:02 2000 integrate_begin Fri Apr 7 pmiller 21:42:33 2000 integrate_pass Fri Apr 7 pmiller 21:47:23 2000 Project "fhist.1.6", Change 15 Page 1 Change Details Tue Apr 11 09:32:36 2000 NAME Project "fhist.1.6", Delta 8, Change 15. SUMMARY binary files DESCRIPTION This change adds support for binary files. It does this by storing files internally encoded as quoted printable. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 4 -> 5 common/compare.h source modify 1 -> 2 common/fcheck.c source modify 1 -> 2 common/fcheck.h source modify 8 -> 9 common/fileio.c source create 1 common/input.c source create 1 common/input.h source create 1 common/input/crlf.c source create 1 common/input/crlf.h source create 1 common/input/file.c source create 1 common/input/file.h source create 1 common/input/file_text.c source create 1 common/input/file_text.h source create 1 common/input/private.c source create 1 common/input/private.h source create 1 common/input/pushba_trans.c source create 1 common/input/quotprinenco.c source create 1 common/input/quotprinenco.h source create 1 common/input/stdin.c source create 1 common/input/stdin.h source create 1 common/output.c source create 1 common/output.h source create 1 common/output/file.c source create 1 common/output/file.h source create 1 common/output/private.c source create 1 common/output/private.h source create 1 common/output/quotprindeco.c source create 1 common/output/quotprindeco.h source create 1 common/output/stdout.c source create 1 common/output/stdout.h source modify 7 -> 8 fhist/extract.c source modify 13 -> 14 fhist/main.c source modify 7 -> 8 fhist/update.c source modify 7 -> 8 lib/en/LC_MESSAGES/common.po source modify 5 -> 6 lib/en/man1/fhist.1 source modify 1 -> 2 lib/en/man1/z_binary.so source modify 2 -> 3 lib/en/readme/new.1.6.so Project "fhist.1.6", Change 15 Page 2 Change Details Tue Apr 11 09:32:36 2000 Type Action Edit File Name ------- -------- ------- ----------- test create 1 test/00/t0023a.sh HISTORY What When Who Comment ------ ------ ----- --------- new_change Sun Apr 9 pmiller 20:59:34 2000 develop_begin Sun Apr 9 pmiller Elapsed time: 1.150 20:59:37 2000 days. develop_end Mon Apr 10 pmiller 22:07:13 2000 review_pass Mon Apr 10 pmiller 22:07:26 2000 integrate_begin Mon Apr 10 pmiller 22:07:31 2000 integrate_pass Mon Apr 10 pmiller 22:12:46 2000 Project "fhist.1.6", Change 16 Page 1 Change Details Tue Apr 11 09:32:37 2000 NAME Project "fhist.1.6", Delta 6, Change 16. SUMMARY refactor error messages DESCRIPTION This change improves various aspects of the error message system, in preparation for other changes. This change must pass a full regression test. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_improvement. FILES Type Action Edit File Name ------- -------- ------- ----------- source create 1 common/ac/errno.h source modify 4 -> 5 common/arglex.c source modify 3 -> 4 common/arglex.h source create 1 common/attrib_forma.h source modify 3 -> 4 common/cmalloc.c source modify 8 -> 9 common/compare.c source modify 7 -> 8 common/error.c source modify 5 -> 6 common/error.h source create 1 common/fcheck.c source create 1 common/fcheck.h source modify 7 -> 8 common/fileio.c source modify 5 -> 6 common/fileio.h source modify 8 -> 9 common/help.c source modify 1 -> 2 common/mem.c source modify 1 -> 2 common/mem.h source modify 4 -> 5 common/mprintf.c source modify 2 -> 3 common/mprintf.h source modify 5 -> 6 common/pager.c source modify 7 -> 8 common/str.c source modify 2 -> 3 common/str.h source modify 1 -> 2 common/sub.c source modify 1 -> 2 common/sub.h source modify 2 -> 3 common/sub/errno.c source modify 1 -> 2 common/trace.c source modify 2 -> 3 common/wstr.c source modify 1 -> 2 common/wstr.h source modify 5 -> 6 config source modify 9 -> 10 etc/Howto.cook source modify 7 -> 8 fcomp/main.c source modify 7 -> 8 fhist/diff.c source modify 6 -> 7 fhist/extract.c source modify 6 -> 7 fhist/list.c Project "fhist.1.6", Change 16 Page 2 Change Details Tue Apr 11 09:32:37 2000 Type Action Edit File Name ------- -------- ------- ----------- source modify 12 -> 13 fhist/main.c source modify 4 -> 5 fhist/modlin.c source modify 7 -> 8 fhist/name.c source modify 5 -> 6 fhist/prune.c source modify 11 -> 12 fhist/subroutine.c source modify 6 -> 7 fhist/update.c source modify 7 -> 8 fmerge/main.c source modify 6 -> 7 fmerge/work.c HISTORY What When Who Comment ------ ------ ----- --------- new_change Mon Apr 10 pmiller 09:04:04 2000 develop_begin Mon Apr 10 pmiller Elapsed time: 0.135 09:04:06 2000 days. develop_end Mon Apr 10 pmiller 10:04:41 2000 review_pass Mon Apr 10 pmiller 10:04:45 2000 integrate_begin Mon Apr 10 pmiller 10:04:49 2000 integrate_pass Mon Apr 10 pmiller 10:10:27 2000 Project "fhist.1.6", Change 17 Page 1 Change Details Tue Apr 11 09:32:39 2000 NAME Project "fhist.1.6", Delta 7, Change 17. SUMMARY Y2K doco glitches DESCRIPTION This change fixed a couple of Y2K documentation glitches. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 4 -> 5 etc/fhist.html source modify 2 -> 3 etc/fhist.lsm HISTORY What When Who Comment ------ ------ ----- --------- new_change Mon Apr 10 pmiller 21:37:51 2000 develop_begin Mon Apr 10 pmiller 21:37:52 2000 develop_end Mon Apr 10 pmiller 21:42:39 2000 review_pass Mon Apr 10 pmiller 21:42:51 2000 integrate_begin Mon Apr 10 pmiller 21:42:55 2000 integrate_pass Mon Apr 10 pmiller 21:45:31 2000 fhist-1.18/etc/CHANGES.1.7 644 0 0 3007111265752627 141030ustar PeterMiller 0 0 Project "fhist.1.7" Page 1 List of Changes Tue Oct 16 21:53:12 2001 Change State Description ------- ------- ------------- 10 completed prepare for release 11 completed fcomp -binary 12 completed fcomp -binary, again 13 completed build glitch 14 completed rpm man pages 15 completed PDF documentation Project "fhist.1.7", Change 10 Page 1 Change Details Tue Oct 16 21:53:12 2001 NAME Project "fhist.1.7", Delta 1, Change 10. SUMMARY prepare for release DESCRIPTION This change prepares FHist for the next public release. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- -------- ------- ----------- source create 1 etc/CHANGES.1.6 source modify 3 -> 4 lib/en/readme/new.1.6.so source create 1 lib/en/readme/new.1.7.so HISTORY What When Who Comment ------ ------ ----- --------- new_change Tue Apr 11 pmiller 09:31:58 2000 develop_begin Tue Apr 11 pmiller Elapsed time: 0.041 09:31:59 2000 days. develop_end Tue Apr 11 pmiller 09:50:37 2000 review_pass Tue Apr 11 pmiller 09:50:52 2000 integrate_begin Tue Apr 11 pmiller 09:50:55 2000 integrate_pass Tue Apr 11 pmiller 09:53:05 2000 Project "fhist.1.7", Change 11 Page 1 Change Details Tue Oct 16 21:53:12 2001 NAME Project "fhist.1.7", Delta 2, Change 11. SUMMARY fcomp -binary DESCRIPTION This change adds a -binary option to the fcomp program. This compares binary files one byte at a time. The differences are displayed a hexadecimal byte valiues, and the "line numbers" (addresses) are also shown in hexadecimal. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 9 -> 10 common/compare.c source modify 5 -> 6 common/compare.h source modify 1 -> 2 common/input.c source modify 1 -> 2 common/input.h source create 1 common/input/hexify.c source create 1 common/input/hexify.h source modify 8 -> 9 fcomp/main.c source modify 1 -> 2 lib/en/readme/new.1.7.so test modify 2 -> 3 test/00/t0001a.sh test modify 2 -> 3 test/00/t0004a.sh test modify 2 -> 3 test/00/t0005a.sh test modify 2 -> 3 test/00/t0006a.sh test modify 2 -> 3 test/00/t0008a.sh test modify 2 -> 3 test/00/t0009a.sh test modify 2 -> 3 test/00/t0011a.sh test modify 1 -> 2 test/00/t0022a.sh test create 1 test/00/t0024a.sh HISTORY What When Who Comment ------ ------ ----- --------- new_change Mon Oct 23 pmiller 07:42:21 2000 develop_begin Mon Oct 23 pmiller Elapsed time: 0.356 07:42:22 2000 days. develop_end Mon Oct 23 pmiller 10:22:23 2000 review_pass Mon Oct 23 pmiller 10:22:26 2000 integrate_begin Mon Oct 23 pmiller 10:22:28 2000 integrate_pass Mon Oct 23 pmiller 10:24:26 2000 Project "fhist.1.7", Change 12 Page 1 Change Details Tue Oct 16 21:53:12 2001 NAME Project "fhist.1.7", Delta 3, Change 12. SUMMARY fcomp -binary, again DESCRIPTION This change adds the manual entry omitted by change 11. This change must pass a full regression test. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by chain. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 5 -> 6 etc/fhist.html source modify 3 -> 4 etc/fhist.lsm source modify 9 -> 10 fcomp/main.c source modify 4 -> 5 lib/en/man1/fcomp.1 source modify 6 -> 7 lib/en/man1/fhist.1 source modify 3 -> 4 lib/en/man1/z_cr.so source modify 4 -> 5 lib/en/readme/main.man source modify 2 -> 3 lib/en/readme/new.1.7.so HISTORY What When Who Comment ------ ------ ----- --------- new_change Mon Oct 23 pmiller 10:26:55 2000 develop_begin Mon Oct 23 pmiller Elapsed time: 0.052 10:26:55 2000 days. develop_end Mon Oct 23 pmiller 10:50:22 2000 review_pass Mon Oct 23 pmiller 10:50:26 2000 integrate_begin Mon Oct 23 pmiller 10:50:30 2000 integrate_pass Mon Oct 23 pmiller 10:51:41 2000 Project "fhist.1.7", Change 13 Page 1 Change Details Tue Oct 16 21:53:13 2001 NAME Project "fhist.1.7", Delta 4, Change 13. SUMMARY build glitch DESCRIPTION This change fixes a problem with the common/ac/wchar.h file. My thanks to Gerald T Kraus fopr reporting this problem. This change must pass a full regression test. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by external_bug. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 1 -> 2 common/ac/wchar.h HISTORY What When Who Comment ------ ------ ----- --------- new_change Tue Feb 6 pmiller 07:50:49 2001 develop_begin Tue Feb 6 pmiller 07:50:50 2001 develop_end Tue Feb 6 pmiller 07:56:19 2001 review_pass Tue Feb 6 pmiller 07:56:28 2001 integrate_begin Tue Feb 6 pmiller Elapsed time: 0.039 07:56:35 2001 days. integrate_pass Tue Feb 6 pmiller 08:14:14 2001 Project "fhist.1.7", Change 14 Page 1 Change Details Tue Oct 16 21:53:13 2001 NAME Project "fhist.1.7", Delta 5, Change 14. SUMMARY rpm man pages DESCRIPTION This change copes with the way man pages are installed these days. My thanks to Cal Webster for reporting this problem. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by external_bug. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 4 -> 5 etc/spec.sh HISTORY What When Who Comment ------ ------ ----- --------- new_change Mon May 14 pmiller 20:50:15 2001 develop_begin Mon May 14 pmiller Elapsed time: 0.144 20:50:16 2001 days. develop_end Mon May 14 pmiller 21:55:01 2001 review_pass Mon May 14 pmiller 21:55:48 2001 integrate_begin Mon May 14 pmiller 21:55:51 2001 integrate_pass Mon May 14 pmiller 21:58:25 2001 Project "fhist.1.7", Change 15 Page 1 Change Details Tue Oct 16 21:53:13 2001 NAME Project "fhist.1.7", Delta 6, Change 15. SUMMARY PDF documentation DESCRIPTION This change changes the documentation to use PDF. A number of missing includes were added, too. This change must pass a full regression test. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 2 -> 3 common/input.c source modify 1 -> 2 common/output/private.c source modify 6 -> 7 common/version.c source modify 7 -> 8 etc/archive.cook source modify 4 -> 5 etc/document.cook source modify 6 -> 7 etc/fhist.html source modify 4 -> 5 etc/fhist.lsm source modify 8 -> 9 fhist/extract.c source modify 5 -> 6 fhist/modlin.c source modify 3 -> 4 lib/en/building/main.man HISTORY What When Who Comment ------ ------ ----- --------- new_change Tue Oct 16 pmiller 20:29:03 2001 develop_begin Tue Oct 16 pmiller Elapsed time: 0.037 20:29:03 2001 days. develop_end Tue Oct 16 pmiller 20:45:39 2001 review_pass Tue Oct 16 pmiller 20:45:43 2001 integrate_begin Tue Oct 16 pmiller 20:45:47 2001 integrate_ Tue Oct 16 pmiller begin_undo 20:47:55 2001 develop_end_ Tue Oct 16 pmiller Elapsed time: 0.087 undo 20:48:01 2001 days. develop_end Tue Oct 16 pmiller 21:27:12 2001 Project "fhist.1.7", Change 15 Page 2 Change Details Tue Oct 16 21:53:13 2001 What When Who Comment ------ ------ ----- --------- review_pass Tue Oct 16 pmiller 21:27:15 2001 integrate_begin Tue Oct 16 pmiller 21:27:19 2001 integrate_pass Tue Oct 16 pmiller 21:29:46 2001 fhist-1.18/etc/CHANGES.1.8 644 0 0 365211265752627 140710ustar PeterMiller 0 0 Project "fhist.1.8" Page 1 List of Changes Tue Oct 23 11:42:43 2001 Change State Description ------- ------- ------------- 10 completed prepare for release Project "fhist.1.8", Change 10 Page 1 Change Details Tue Oct 23 11:42:43 2001 NAME Project "fhist.1.8", Delta 1, Change 10. SUMMARY prepare for release DESCRIPTION This change repares fhist for the next public release. This change must pass a full regression test. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- -------- ------- ----------- source create 1 etc/CHANGES.1.7 source modify 7 -> 8 etc/fhist.html source modify 3 -> 4 lib/en/readme/new.1.7.so source create 1 lib/en/readme/new.1.8.so HISTORY What When Who Comment ------ ------ ----- --------- new_change Tue Oct 16 pmiller 21:51:07 2001 develop_begin Tue Oct 16 pmiller Elapsed time: 0.076 21:51:07 2001 days. develop_end Tue Oct 16 pmiller 22:25:30 2001 review_pass Tue Oct 16 pmiller 22:25:34 2001 integrate_begin Tue Oct 16 pmiller 22:25:36 2001 integrate_pass Tue Oct 16 pmiller 22:26:58 2001 fhist-1.18/etc/CHANGES.1.9 644 0 0 3227211265752627 141120ustar PeterMiller 0 0 Project "fhist.1.9" Page 1 List of Changes Tue Jul 9 11:52:20 2002 Change State Description ------- ------- ------------- 10 completed oops 11 completed no groff patch 12 completed bison crap 15 completed fhist --no-keywords 16 completed interrupt handing 17 completed wint_t 18 completed gettext crap Project "fhist.1.9", Change 10 Page 1 Change Details Tue Jul 9 11:52:20 2002 NAME Project "fhist.1.9", Delta 1, Change 10. SUMMARY oops DESCRIPTION This change fixes the branch for work. (I ended the previous branch by accident). This change must pass a full regression test. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- -------- ------- ----------- source create 1 etc/CHANGES.1.8 source create 1 lib/en/readme/new.1.9.so HISTORY What When Who Comment ------ ------ ----- --------- new_change Tue Oct 23 pmiller 11:41:51 2001 develop_begin Tue Oct 23 pmiller 11:41:51 2001 develop_end Tue Oct 23 pmiller 11:45:52 2001 review_pass Tue Oct 23 pmiller 11:45:59 2001 integrate_begin Tue Oct 23 pmiller 11:46:01 2001 integrate_pass Tue Oct 23 pmiller 11:46:37 2001 Project "fhist.1.9", Change 11 Page 1 Change Details Tue Jul 9 11:52:20 2002 NAME Project "fhist.1.9", Delta 3, Change 11. SUMMARY no groff patch DESCRIPTION This change removes mention of the groff patch This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 6 -> 7 etc/configure.in HISTORY What When Who Comment ------ ------ ----- --------- new_change Fri Nov 2 pmiller 14:52:26 2001 develop_begin Fri Nov 2 pmiller Elapsed time: 11.413 14:52:26 2001 days. develop_end Mon Nov 19 pmiller 17:58:20 2001 review_pass Mon Nov 19 pmiller 17:58:30 2001 integrate_begin Mon Nov 19 pmiller 17:58:32 2001 integrate_pass Mon Nov 19 pmiller 17:59:35 2001 Project "fhist.1.9", Change 12 Page 1 Change Details Tue Jul 9 11:52:20 2002 NAME Project "fhist.1.9", Delta 2, Change 12. SUMMARY bison crap DESCRIPTION This change copes with recent Bison changes. This change must pass a full regression test. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 5 -> 6 common/arglex.c source modify 4 -> 5 common/cmalloc.c source modify 10 -> 11 common/compare.c source modify 6 -> 7 common/compare.h source modify 8 -> 9 common/str.c source modify 1 -> 2 common/str_list.c source modify 10 -> 11 etc/Howto.cook source modify 12 -> 13 fhist/subroutine.c HISTORY What When Who Comment ------ ------ ----- --------- new_change Mon Nov 19 pmiller 14:51:01 2001 develop_begin Mon Nov 19 pmiller Elapsed time: 0.116 14:51:01 2001 days. develop_end Mon Nov 19 pmiller 15:43:20 2001 review_pass Mon Nov 19 pmiller 15:43:22 2001 integrate_begin Mon Nov 19 pmiller 15:43:24 2001 integrate_pass Mon Nov 19 pmiller 15:44:05 2001 Project "fhist.1.9", Change 15 Page 1 Change Details Tue Jul 9 11:52:20 2002 NAME Project "fhist.1.9", Delta 4, Change 15. SUMMARY fhist --no-keywords DESCRIPTION This change adds the --no-keywords option to the fhist tool. This disabled the keyword substitutions. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_enhancement. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 1 -> 2 etc/template/test source modify 14 -> 15 fhist/main.c source modify 6 -> 7 fhist/modlin.c source modify 2 -> 3 fhist/modlin.h source modify 7 -> 8 lib/en/man1/fhist.1 source modify 1 -> 2 lib/en/readme/new.1.9.so test create 1 test/00/t0025a.sh HISTORY What When Who Comment ------ ------ ----- --------- new_change Mon Dec 10 pmiller 08:21:14 2001 develop_begin Mon Dec 10 pmiller Elapsed time: 0.082 08:21:14 2001 days. develop_end Mon Dec 10 pmiller 08:58:10 2001 review_pass Mon Dec 10 pmiller 08:58:37 2001 integrate_begin Mon Dec 10 pmiller 08:58:39 2001 integrate_pass Mon Dec 10 pmiller 08:59:37 2001 Project "fhist.1.9", Change 16 Page 1 Change Details Tue Jul 9 11:52:20 2002 NAME Project "fhist.1.9", Delta 5, Change 16. SUMMARY interrupt handing DESCRIPTION This change fixes a small but in the interrupt handling. This change must pass a full regression test. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_bug. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 3 -> 4 fhist/breaks.c source modify 15 -> 16 fhist/main.c source modify 7 -> 8 fhist/modlin.c source modify 3 -> 4 fhist/modlin.h HISTORY What When Who Comment ------ ------ ----- --------- new_change Sun Mar 17 pmiller 15:32:23 2002 develop_begin Sun Mar 17 pmiller 15:32:23 2002 develop_end Sun Mar 17 pmiller 15:38:12 2002 review_pass Sun Mar 17 pmiller 15:38:18 2002 integrate_begin Sun Mar 17 pmiller 15:38:20 2002 integrate_pass Sun Mar 17 pmiller 15:38:55 2002 Project "fhist.1.9", Change 17 Page 1 Change Details Tue Jul 9 11:52:21 2002 NAME Project "fhist.1.9", Delta 6, Change 17. SUMMARY wint_t DESCRIPTION This change fixes the declaration of wint_t, and makes sure that wchar.h is included wherever wint_t is used. My thanks to Christopher JS Vance for reporting this problem. This change must pass a full regression test. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by external_bug. FILES Type Action Edit File Name ------- -------- ------- ----------- source modify 3 -> 4 common/ac/stddef.h source modify 2 -> 3 common/ac/wchar.h source modify 2 -> 3 common/ac/wctype.h source modify 7 -> 8 etc/configure.in HISTORY What When Who Comment ------ ------ ----- --------- new_change Tue Jul 9 pmiller 09:36:40 2002 develop_begin Tue Jul 9 pmiller Elapsed time: 0.040 09:36:40 2002 days. develop_end Tue Jul 9 pmiller 09:54:39 2002 review_pass Tue Jul 9 pmiller 09:54:53 2002 integrate_begin Tue Jul 9 pmiller 09:54:56 2002 integrate_pass Tue Jul 9 pmiller 09:56:10 2002 Project "fhist.1.9", Change 18 Page 1 Change Details Tue Jul 9 11:52:21 2002 NAME Project "fhist.1.9", Delta 7, Change 18. SUMMARY gettext crap DESCRIPTION This change copes with recent GNU Gettext changes. This change must pass a full regression test. This change is exempt from testing against the development directory. This change is exempt from testing against the baseline. ARCHITECTURE This change must build and test in the "linux-i486" architecture. CAUSE This change was caused by internal_improvement. FILES Type Action Edit File Name ------- -------- ------- ----------- source create 1 etc/Howto.conf.in source modify 11 -> 12 etc/Howto.cook source modify 5 -> 6 etc/Makefi.file.sh source modify 4 -> 5 etc/Makefile.head source modify 8 -> 9 etc/configure.in source modify 3 -> 4 etc/i18n.cook source create 1 etc/msgfmt.sh source modify 8 -> 9 lib/en/LC_MESSAGES/common.po source modify 2 -> 3 lib/en/LC_MESSAGES/fcomp.po source modify 4 -> 5 lib/en/LC_MESSAGES/fhist.po source modify 3 -> 4 lib/en/LC_MESSAGES/fmerge.po HISTORY What When Who Comment ------ ------ ----- --------- new_change Tue Jul 9 pmiller 10:54:03 2002 develop_begin Tue Jul 9 pmiller Elapsed time: 0.060 10:54:04 2002 days. develop_end Tue Jul 9 pmiller 11:21:15 2002 develop_end_ Tue Jul 9 pmiller undo 11:21:20 2002 develop_end Tue Jul 9 pmiller 11:30:31 2002 review_pass Tue Jul 9 pmiller 11:30:41 2002 integrate_begin Tue Jul 9 pmiller 11:30:43 2002 integrate_ Tue Jul 9 pmiller begin_undo 11:38:34 2002 develop_end_ Tue Jul 9 pmiller undo 11:38:45 2002 Project "fhist.1.9", Change 18 Page 2 Change Details Tue Jul 9 11:52:21 2002 What When Who Comment ------ ------ ----- --------- develop_end Tue Jul 9 pmiller 11:39:57 2002 review_pass Tue Jul 9 pmiller 11:40:02 2002 integrate_begin Tue Jul 9 pmiller 11:40:04 2002 integrate_pass Tue Jul 9 pmiller 11:41:37 2002 fhist-1.18/etc/CHANGES.sh 644 0 0 227111265752627 141710ustar PeterMiller 0 0#!/bin/sh # # fhist - file history and comparison tools # Copyright (C) 1993, 1994, 1998, 2008 Peter Miller # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see # . # case $# in 1) project=$1 ;; *) echo "usage: $0 " 1>&2 exit 1 ;; esac set -e aegis -l changes -p $project -v -pl 66 -pw 72 < /dev/null changes=`aegis -list changes -terse -project $project` for n in $changes do echo "" | tr '\12' '\14' aegis -l change_details -p $project -c $n -v -pl 66 -pw 72 < /dev/null done exit 0 fhist-1.18/etc/Howto.conf.in 644 0 0 221611265752627 151400ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . * * @configure_input@ */ /* * the name of the compiler to use */ cc = @CC@; cc_flags = @CPPFLAGS@ @CFLAGS@; /* * prefix for installation path */ prefix = @prefix@ ; /* exec_prefix = @exec_prefix@ ; */ /* * Which yacc to use */ yacc = @YACC@; /* * extra libraries required for your system */ libs = @LIBS@; msgfmt = @MSGFMT@; msgcat = @MSGCAT@; fhist-1.18/etc/Howto.cook 644 0 0 4317011265752627 145650ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1991-1995, 1998-2006, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ /* * Turn on updating to ensure mod-time * consistency on fast machines. */ set update; /* * Remove the target and make the directories above the target before * the recipe body is run, */ set mkdir unlink; /* * You may want to change some of these options. * ([debug] must be defined, even if empty, use comments.) * * If you want to turn the DEBUG compile flag on, * edit the common/main.h file. */ debug = /* -g */ ; /* * Make sure the [project], [change], [version] and [arch] variables are set. */ #ifndef project echo "The [project] variable was not set from the command line." set silent; echo "If you want to do a build which is not a development build" set silent; echo "or an integration build, use the make command, not cook." set silent; fail; #endif #ifndef change echo "The [change] variable was not set from the command line." set silent; echo "If you want to do a build which is not a development build" set silent; echo "or an integration build, use the make command, not cook." set silent; fail; #endif #ifndef version echo "The [version] variable was not set from the command line." set silent; echo "If you want to do a build which is not a development build" set silent; echo "or an integration build, use the make command, not cook." set silent; fail; #endif #ifndef arch echo "The [arch] variable was not set from the command line." set silent; echo "If you want to do a build which is not a development build" set silent; echo "or an integration build, use the make command, not cook." set silent; fail; #endif awk = gawk; c_incl = c_incl; /* * The first item in search list should be the absolute path of the * current directory. Assume that it is. */ search_list = .; search_tmp = [tail [split ':' [search_path]]]; /* * Try to shorten the search path in command lines, too. * * This takes a little getting used to.... * 1. For development builds, the search path is dev dir, then branch bl, * then ... project bl. Thus, bl in a dev dir winds up pointing to * the branch reporitory. * 2. For integration builds, aegis deliberately omits the branch * baseline from the path, but include's the branch's parents and * ancestors. Thus, bl in an int dir winds up pointing to the * branch's parent's reporitory. * The idea is that integration builds in a branch are like a * development build of the branch's dev dir. */ search_name = bl; loop { search_dir = [head [search_tmp]]; if [not [search_dir]] then loopstop; search_tmp = [tail [search_tmp]]; if [not [exists [search_name]]] then ln -s [search_dir] [search_name] set clearstat; search_list = [search_list] [search_name]; search_name = [search_name]bl; } /* * This file is generated by autoconf. * It is architecture specific. * If it is not found (not cooked yet) the following * symbols will be undefined. * * Must be included *after* the search_list is defined. */ #include-cooked-nowarn [arch]/etc/Howto.conf if [not [defined prefix]] then prefix = /usr/local; if [not [defined exec_prefix]] then exec_prefix = [prefix]; if [not [defined yacc]] then yacc = yacc; if [not [defined libs]] then libs = ; if [not [defined cc]] then cc = ['if' [find_command gcc] 'then' gcc 'else' cc]; /* * determine the short version: * no change or delta number */ version_short = [fromto %1.C%2 %1 [subst D C [version]]]; version_shorter = [split "." [version_short]] _ _; version_shorter = [unsplit "." [word 1 [version_shorter]] [word 2 [version_shorter]]]; project_short = [fromto %.[version_short] % [project]]; project_minus = [project_short]-[version_short]; change_source_files = ; #include-cooked-nowarn etc/cook/change_files.[version] etc/cook/change_files.[version]: set shallow nodefault { echo "'change_source_files ='" > [target]; aegis -l cf -p [project] -c [change] -unf | [awk] "'/^build/{next};$2==\"remove\"{next};{print $NF}'" >> [target]; echo "';'" >> [target]; } project_source_files = ; #include-cooked-nowarn etc/cook/project_files.[version] etc/cook/project_files.[version]: set shallow nodefault { echo "'project_source_files ='" > [target]; aegis -l pf -p [project] -c [change] -unf | [awk] "'/^build/{next};$2==\"remove\"{next};{print $NF}'" >> [target]; echo "';'" >> [target]; } source_files = [sort [project_source_files] [change_source_files]]; c_incl_exclude = [addprefix "-ex=" [fromto common/ac/%0%.h %0%.h [match_mask common/ac/%0%.h [source_files]] ] ]; /* * Speed up graph building by stating the leaves explictly. * This also gives more useful error messages. */ if [count [project_source_files]] then if [count [change_source_files]] then { leaf_file_accept = [project_source_files] [change_source_files]; leaf_pattern_accept = /%0%; } /* * If this is a development build, the version will be x.y.Czzz, * so look to see if there is a C in the version string. * Include the baseline in the search path if this is * a development build. */ if [match_mask %1C%2 [version]] then { baseline = bl; set time-adjust; set fingerprint; } else { set time-adjust-back; } /* * This list of commands to build. */ commands = bogus; if [count [source_files]] then commands = [stringset [dirname [match_mask %/main.c [source_files]]]]; /* * The default recipe */ all = doc.targets [addprefix [arch]/bin/ [commands]] internationalization ; if [not [defined baseline]] then all = [all] integration-build-targets; all: [all] set default; /* * The source files. * This is given to us by aegis. */ vs_file = common/patchlevel.h; lib_obj = [stringset [fromto common/%0%.c [arch]/common/%0%.o [match_mask common/%0%.c [source_files]] ] [fromto common/%0%.y [arch]/common/%0%.gen.o [match_mask common/%0%.y [source_files]] ] - [arch]/common/version_stmp.o ]; common_obj = [arch]/common/lib.a [arch]/common/version_stmp.o ; command_list = [commands]; loop { command = [head [command_list]]; if [not [count [command]]] then loopstop; command_list = [tail [command_list]]; [command]_obj = [fromto [command]/%0%.c [arch]/[command]/%0%.o [match_mask [command]/%0%.c [source_files]] ] [common_obj] ; } source_files_build = [collect ( aegis -l pf -p [project] -c [change] -unf ';' aegis -l cf -p [project] -c [change] -unf ) | gawk "'/^build/{print $NF}'" ] ; source_files_non_build = [stringset [source_files] - [source_files_build]]; /* * how to compile C sources */ if [defined [arch]_cc_flags] then cc_flags = [split "%" [[arch]_cc_flags]]; if [not [defined cc_flags]] then cc_flags = -O [debug]; if [defined [arch]_cc_include_flags] then cc_include_flags = [split "%" [[arch]_cc_include_flags]]; if [not [defined cc_include_flags]] then cc_include_flags = ; if [defined [arch]_ld_flags] then ld_flags = [split "%" [[arch]_ld_flags]]; if [not [defined ld_flags]] then ld_flags = ; /* * this next section is for gcc * comment it out if you do not have gcc * * The gcc include files MUST be first. */ cc_flags = [cc_flags] -ansi -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -Wmissing-declarations -Wpointer-arith -Werror -Wcast-align ; /* * include files from the common directory. */ cc_include_flags = [cc_include_flags] [prepost "-I" "/"[arch]"/common" [search_list]] [prepost "-I" "/common" [search_list]] ; /* * Build %.o from %.c */ [arch]/%1/%0%2.o: %1/%0%2.c { if [defined %2_flags] then extra = [%2_flags]; else extra = ; [cc] [cc_flags] [extra] [stringset [cc_include_flags] [prepost "-I" "/"[arch]"/%1" [search_list]] [prepost "-I" "/%1" [search_list]] ] -c [resolve %1/%0%2.c] ['if' [in [cc] gcc] 'then' -o [target]]; if [not [in [cc] gcc]] then mv %2.o [target]; } %1/%0%2.c.d: %1/%0%2.c set nocascade { c_incl -nc -ns -eia -nrec [stringset [cc_include_flags] [prepost "-I" /[arch]/%1 [search_list]] [prepost "-I" "/%1" [search_list]] ] -nsri /* no source relative includes */ ['if' [not [filter common/ac/%%0%% %1/%0%2.c]] 'then' [c_incl_exclude]] -prefix "'cascade %1/%0%2.c ='" -suffix "';'" [resolve %1/%0%2.c] [prepost "-rlp=" "" [search_list]] /* remove leading path */ -slp [arch] "'[arch]'" /* substitute leading path */ -o [target]; } %1/%0%2.h.d: %1/%0%2.h set nocascade { c_incl -nc -ns -eia -nrec [stringset [cc_include_flags] [prepost "-I" /[arch]/%1 [search_list]] [prepost "-I" "/%1" [search_list]] ] -nsri /* no source relative includes */ ['if' [not [filter common/ac/%%0%% %1/%0%2.c]] 'then' [c_incl_exclude]] -prefix "'cascade %1/%0%2.h ='" -suffix "';'" [resolve %1/%0%2.h] [prepost "-rlp=" "" [search_list]] /* remove leading path */ -slp [arch] "'[arch]'" /* substitute leading path */ -o [target]; } c-dep-files = [addsuffix .d [match_mask %1/%0%2.c [source_files]]] [addsuffix .d [match_mask %1/%0%2.h [source_files]]] [fromto %0%.y %0%.gen.c.d [match_mask %0%.y [source_files]]] ; #include-cooked-nowarn [c-dep-files] /* * A few explicit things, to make sure the .d files * are constructed correctly. Sigh. */ cascade common/ac/ctype.h = [arch]/common/config.h; cascade common/ac/dirent.h = [arch]/common/config.h; cascade common/ac/errno.h = [arch]/common/config.h; cascade common/ac/grp.h = [arch]/common/config.h; cascade common/ac/libintl.h = [arch]/common/config.h; cascade common/ac/limits.h = [arch]/common/config.h; cascade common/ac/locale.h = [arch]/common/config.h; cascade common/ac/pwd.h = [arch]/common/config.h; cascade common/ac/signal.h = [arch]/common/config.h; cascade common/ac/stdarg.h = [arch]/common/config.h; cascade common/ac/stddef.h = [arch]/common/config.h; cascade common/ac/stdio.h = [arch]/common/config.h; cascade common/ac/stdlib.h = [arch]/common/config.h; cascade common/ac/string.h = [arch]/common/config.h; cascade common/ac/sys/stat.h = [arch]/common/config.h; cascade common/ac/sys/types.h = [arch]/common/config.h; cascade common/ac/termios.h = [arch]/common/config.h; cascade common/ac/time.h = [arch]/common/config.h; cascade common/ac/unistd.h = [arch]/common/config.h; cascade common/ac/wchar.h = [arch]/common/config.h; cascade common/ac/wctype.h = [arch]/common/config.h; cascade common/libdir.c = [arch]/etc/libdir-h; cascade common/sub/expr_lex.c = common/sub/expr_gram.gen.h; cascade common/version_stmp.c = common/patchlevel.h; /* * How to use yacc sources. */ yacc_flags = -v; %1/%0%2.gen.c %1/%0%2.gen.h: %1/%0%2.y single-thread y.tab.c y.tab.h y.output { rm -f %1/%0%2.list y.output set silent; if [exists %1/%0%2.gen.c] then rm %1/%0%2.gen.c set clearstat; if [exists %1/%0%2.gen.h] then rm %1/%0%2.gen.h set clearstat; [yacc] -d [yacc_flags] [resolve %1/%0%2.y]; yy = [collect echo %0%2 | sed "'s/[^a-zA-Z0-9]/_/g'"]; sed -e \'s/\[yY\]\[yY\]/[yy]_/g\' -e \'//d\' -e \'//d\' -e \'//d\' -e \'//d\' y.tab.c > %1/%0%2.gen.c; rm y.tab.c; sed -e \'s/\[yY\]\[yY\]/[yy]_/g\' -e \'s/Y_TAB_H/[yy]_TAB_H/\' y.tab.h > %1/%0%2.gen.h; rm y.tab.h; if [exists y.output] then mv y.output %1/%0%2.list set clearstat; } /* * build the programs */ [arch]/bin/%: [%_obj] { [cc] -o [target] [resolve [%_obj]] [ld_flags] ; chmod 755 [target]; } ranlib = [find_command ranlib]; [arch]/common/lib.a: [lib_obj] { ar cq [target] [resolve [lib_obj]]; if [ranlib] then [ranlib] [target]; } /* * The version stamp is to be updated for every * integration and development build. */ copyright_years = [collect aegis -list version -p [project] -c [change] | gawk "-F'[[\\\\]]'" "'/^copyright_years/{print $2}'" ]; [vs_file]: set shallow { echo "'#define PATCHLEVEL \""[version]"\"'" > [target]; echo "'#define COPYRIGHT_YEARS \""[copyright_years]"\"'" >> [target]; } etc/CHANGES.[version_short]: etc/CHANGES.sh [vs_file] { if [not [exists [dirname [target]]]] then mkdir -p [dirname [target]] set clearstat; if [exists [target]] then rm [target] set clearstat; sh [resolve etc/CHANGES.sh] [project] > [target]; } configure: aegis.conf.d/site.conf etc/configure.ac install-sh { if [exists [target]] then rm [target] set clearstat; autoconf [resolve etc/configure.ac] > [target]; chmod 755 [target]; } /* * Different Linux install methods put the packages in different places. * We need to find the autoconf package to get the install-sh script. */ loop install-sh-maybe = /usr/share/autoconf/install-sh [glob /usr/share/automake*/install-sh] /usr/local/share/autoconf/install-sh [glob /usr/local/share/automake*/install-sh] { if [exists [install-sh-maybe]] then { install-sh = [install-sh-maybe]; loopstop; } } if [not [install-sh]] then fail "Can't locate the ``install-sh'' script from GNU automake"; install-sh: [install-sh] { cp [need] [target]; chmod 755 [target]; } [arch]/config.status: configure { if [not [exists install-sh]] then { /* * Cook says it is up-to-date, so it must be in the * baseline; autoconf needs it in the current directory. */ cp [resolve install-sh] . set clearstat; } local flags =; if [defined [arch]_cc_flags] then flags += CFLAGS\=[quote [unsplit " " [split "%" [[arch]_cc_flags]]]]; else if [defined cc_flags] then flags += CFLAGS\=[quote [unsplit " " [split "%" [cc_flags]]]]; if [defined [arch]_ld_flags] then flags += LDFLAGS\=[quote [unsplit " " [split "%" [[arch]_ld_flags]]]]; else if [defined ld_flags] then flags += LDFLAGS\=[quote [unsplit " " [split "%" [ld_flags]]]]; if [defined [arch]_libs] then flags += LIBS\=[quote [unsplit " " [split "%" [[arch]_libs]]]]; else if [defined libs] then flags += LIBS\=[quote [unsplit " " [split "%" [libs]]]]; [unsplit " " CC\=[quote [unsplit " " [cc]]] [unsplit " " [flags]] [pathname [resolve configure]] --cache-file\=/dev/null --verbose --no-create --srcdir\=. --sysconfdir\=/etc && mv config.status [arch]/config.status ]; } common/config.h.in: etc/configure.ac { autoheader [resolve etc/configure.ac] > [target]; } [arch]/%0%.h: %0%.h.in [arch]/config.status { /* these 2 env vars control what is generated */ CONFIG_FILES\= CONFIG_HEADERS\=[target]\:[resolve %0%.h.in] [resolve [arch]/config.status]; } [arch]/%0%: %0%.in [arch]/config.status { /* these 2 env vars control what is generated */ CONFIG_FILES\=[target]\:[resolve %0%.in] CONFIG_HEADERS\= [resolve [arch]/config.status]; } #include-cooked etc/document.cook /* must be before archive.cook */ #include-cooked etc/archive.cook #include-cooked etc/i18n.cook #include-cooked etc/cfmt.cook #include-cooked etc/tags.cook fhist-1.18/etc/Makefi.file.sh 644 0 0 1442111265752627 152530ustar PeterMiller 0 0#!/bin/sh # # fhist - file history and comparison tools # Copyright (C) 1990-1994, 1998, 1999, 2002, 2004, 2008 Peter Miller # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see # . # case $# in 2 | 3) ;; *) echo "usage: $0 filename resolved-filename" 1>&2 exit 1 ;; esac file="$1" rfn="$2" depfile="$3" TAB="`awk 'BEGIN{printf("%c", 9)}' /dev/null`" case $file in */*.y) root=`basename $file .y` stem=`echo $file | sed 's/\.y$//'` dir=`echo $file | sed 's|/.*||'` case $file in *) numconf="no" ;; esac yy=`echo $stem | sed -e 's|^[^/]*/||' -e 's|[^a-zA-Z0-9]|_|g'` echo "" echo "${stem}.gen.c ${stem}.gen.h: $file" echo "${TAB}@echo Expect $numconf conflicts:" echo "${TAB}\$(YACC) -d $file" echo "${TAB}sed -e 's/[yY][yY]/${yy}_/g'" \ "-e '/#include./d'" \ "-e '/#include./d'" \ "-e '/#include./d'" \ "-e '/#include./d'" \ "y.tab.c > ${stem}.gen.c" echo "${TAB}sed -e 's/[yY][yY]/${yy}_/g' y.tab.h > ${stem}.gen.h" echo "${TAB}rm y.tab.c y.tab.h" if [ -n "$depfile" -a -r "$depfile" ]; then dep=`cat $depfile` fi echo "" echo "${stem}.gen.\$(OBJEXT): ${stem}.gen.c" $dep echo "${TAB}\$(CC) \$(CPPFLAGS) \$(CFLAGS) -I$dir -Icommon " \ "-c ${stem}.gen.c" echo "${TAB}mv ${root}.gen.\$(OBJEXT) \$@" ;; */*.c) root=`basename $file .c` stem=`echo $file | sed 's/\.c$//'` dir=`echo $file | sed 's|/.*||'` if [ -n "$depfile" -a -r "$depfile" ]; then dep=`cat $depfile` fi echo "" echo "${stem}.\$(OBJEXT): $file" $dep echo "${TAB}\$(CC) \$(CFLAGS)" $extra "-I$dir -Icommon -c $file" echo "${TAB}mv ${root}.\$(OBJEXT) \$@" ;; lib/*/LC_MESSAGES/common.po) ;; lib/*/LC_MESSAGES/*.po) # # Assume that we are using the GNU Gettext program. All others # will fail, because they do not have the -o option. # stem=`echo $file | sed -e 's|^lib/\(.*\)\.po$|\1|'` dir=`dirname $file` echo "" echo "lib/$stem.mo: $file $dir/common.po" echo "${TAB}\$(SH) etc/msgfmt.sh --msgfmt=\$(MSGFMT)" \ "--msgcat=\$(MSGCAT) --output=\$@ $file $dir/common.po" echo "" echo "\$(NLSDIR)/$stem.mo: lib/$stem.mo $dir/.nlsdir" echo "${TAB}\$(INSTALL_DATA) lib/$stem.mo \$@" ;; lib/*/man?/*.[0-9]) dir=`echo $file | sed 's|^\(lib/.*/man.\)/.*|\1|'` base=`echo $file | sed 's|^lib/.*/man./\(.*\)|\1|'` stem=`echo $file | sed 's|^lib/\(.*\)|\1|'` part=`echo $file | sed 's|^lib/.*/\(man./.*\)|\1|'` if [ -n "$depfile" -a -r "$depfile" ]; then dep=`cat $depfile` fi echo "" echo "\$(datadir)/$stem: $file $dir/.datadir" $dep echo "${TAB}\$(SOELIM) -I$dir -Ietc $file > tmp" echo "${TAB}\$(INSTALL_DATA) tmp \$@" echo "${TAB}@rm -f tmp" case $file in lib/en/* ) mansubdir=$dir/.mandir dep=`echo $dep | sed 's|/en/|/$(MANLANG)/|g'` file=`echo $file | sed 's|/en/|/$(MANLANG)/|'` dir=`echo $dir | sed 's|/en/|/$(MANLANG)/|'` echo "" echo "\$(mandir)/$part: $file $dep $mansubdir" echo "${TAB}\$(SOELIM) -I$dir -Ietc $file > tmp" echo "${TAB}\$(INSTALL_DATA) tmp \$@" echo "${TAB}@rm -f tmp" ;; esac ;; lib/*/man?/*) ;; lib/*/*/*.so) ;; lib/*/*/main.*) macros=`echo $file | sed 's|^lib/.*/.*/main.\(.*\)$|\1|'` stem=`echo $file | sed 's|^lib/\(.*/.*/main\).*$|\1|'` dir=`dirname $file` dirdir=`dirname $dir` dep="" if [ -n "$depfile" -a -r "$depfile" ]; then dep=`cat $depfile` fi case $macros in ms) macros="-ms" ;; mm) macros="-mm" ;; roff) macros="" ;; *) macros="-$macros" ;; esac stem2=`dirname $stem` stem3=`dirname $stem2` echo "" echo "lib/$stem2.ps: $file" $dep echo "${TAB}\$(SOELIM) -I$dir -Ietc -I$dirdir/man1 -I$dirdir/readme " \ "$file | \$(GROFF) -s -t -p $macros -mpic -mpspic > \$@" echo "" echo "\$(datadir)/$stem2.ps: lib/$stem2.ps lib/$stem3/.datadir" echo "${TAB}\$(INSTALL_DATA) lib/$stem2.ps \$@" echo "" echo "lib/$stem2.dvi: $file" $dep echo "${TAB}\$(SOELIM) -I$dir -Ietc -I$dirdir/man1 -I$dirdir/readme" \ "$file | \$(GROFF) -Tdvi -s -t -p $macros -mpic > \$@" echo "" echo "\$(datadir)/$stem2.dvi: lib/$stem2.dvi lib/$stem3/.datadir" echo "${TAB}\$(INSTALL_DATA) lib/$stem2.dvi \$@" echo "" echo "lib/$stem2.txt: $file" $dep echo "${TAB}\$(SOELIM) -I$dir -Ietc -I$dirdir/man1" \ "-I$dirdir/readme $file | \$(GROFF) -Tascii -s -t -p $macros" \ "-mpic > \$@" echo "" echo "\$(datadir)/$stem2.txt: lib/$stem2.txt lib/$stem3/.datadir" echo "${TAB}\$(INSTALL_DATA) lib/$stem2.txt \$@" ;; test/*/*.sh) root=`basename $file .sh` echo "" echo "$root: $file all" echo "${TAB}\$(SH) $file" ;; *) ;; esac exit 0 fhist-1.18/etc/Makefile.awk 644 0 0 347611265752627 150160ustar PeterMiller 0 0# # fhist - file history and comparison tools # Copyright (C) 1993, 1994, 1998, 1999, 2008 Peter Miller # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see # . # length <= 72 length > 72 { if (substr($0, 1, 1) == "\t") { printf "\t" pos = 8 } else pos = 0 for (j = 1; j <= NF; ++j) { len = length($j) if (j == 1) ; else if (pos + 1 + len > 72) { printf " \\\n" pos = 0 if (pos + len < 70) { printf "\t" pos += 8 } if (pos + len < 70) { printf "\t" pos += 8 } } else { printf " " ++pos } printf("%s", $j) pos += len } printf "\n" } fhist-1.18/etc/Makefile.head 644 0 0 750511265752627 151320ustar PeterMiller 0 0# # fhist - file history and comparison tools # Copyright (C) 1990-1994, 1998, 1999, 2002, 2004, 2008 Peter Miller # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see # . # # # directory containing the source # srcdir = @srcdir@ VPATH = @srcdir@ # # the name of the install program to use # INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ # # the name of the compiler to use # CC = @CC@ # # The compiler flags to use # CFLAGS = @CFLAGS@ # # The linker flags to use # LDFLAGS = @LDFLAGS@ # # prefix for installation path # prefix = @prefix@ exec_prefix = @exec_prefix@ # # where to put the library directory # (contains architecture-specific data, don't use exec_prefix) # libdir = $(RPM_BUILD_ROOT)@libdir@ # # where to put the locale files # (contains architecture-specific data, don't use exec_prefix) # NLSDIR = $(RPM_BUILD_ROOT)@NLSDIR@ # # where to put the shared directory # (contains architecture-neutral data, don't use exec_prefix) # datadir = $(RPM_BUILD_ROOT)@datadir@ # # where to put the executables # bindir = $(RPM_BUILD_ROOT)@bindir@ # # where to put the manuals # mandir = $(RPM_BUILD_ROOT)@mandir@ # # Which yacc to use # YACC = @YACC@ # # extra libraries required for your system # LIBS = @LIBS@ # # shell to use to run tests and commands # SH = @SH@ # # command used to construct libraries # AR = ar # # program used to place index within libraries # RANLIB = @RANLIB@ # # The program used to compile the message catalogues. Ideally, you # should use the msgfmt in the GNU Gettext package. (The SunOS one is # brain-dead, and the Solaris one is hardly better.) # MSGFMT = @MSGFMT@ MSGCAT = @MSGCAT@ # # The program used to format the documentation. # GROFF = @GROFF@ # # where to find the soelim command # SOELIM = @SOELIM@ # # Set MANLANG to English, to select the man pages to be installed into # $(mandir). If you want your manual pages in some other (supported) # language, set it here. # # The man pages for all supported languages are also installed into # $(libdir)/$(MANLANG)/manX/Y.X, so that it is only necessary to append # $(libdir) to $MANPATH, if your man understands $LANG. # MANLANG = en # # Set HAVE_I18N to ``yes'' if your system has the gettext() system call # and the msgfmt utility, or ``no'' if it does not. # HAVE_I18N = @internationalization@ # # Set HAVE_GROFF to ``yes'' if your system has GNU Groff installed, # or ``no'' if it does not. # HAVE_GROFF = @have_groff@ # # Mess with the names of installed executables. # # The prefix is added to the front, the suffix is added to the back. # Both are usually empty. (The suffix does not include the executable # file extension.) # PROGRAM_PREFIX = @PROGRAM_PREFIX@ PROGRAM_SUFFIX = @PROGRAM_SUFFIX@ # # This is the file extension of executable files. # It is empty for UNIX, and .EXE for the unmentionable one. # EXEEXT = @EXEEXT@ # # This is the file extension of object files. # It is .o for UNIX, and .O or .OBJ for the unmentionable one. # OBJEXT = @OBJEXT@ # # This is the file extension of library files. NO DOT. # LIBEXT = a # # You should not need to alter anything below this point. #------------------------------------------------------------ default: all fhist-1.18/etc/Makefile.sh 644 0 0 1644611265752627 146670ustar PeterMiller 0 0#!/bin/sh # # fhist - file history and comparison tools # Copyright (C) 1993, 1994, 1998, 1999, 2004, 2008 Peter Miller # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see # . # clean_files="core common/lib.\$(LIBEXT) .bin .bindir" man_files= man_i18n_files= po_files= install_po_files= doc_files= install_doc_files= test_files= progs= progsa= progsi= TAB="`awk 'BEGIN{printf("%c", 9)}' /dev/null`" # # Emit the rules to build a directory, and all the ones above it. # recursive_mkdir() { src_dir="$1" dst_dir="$2" flavor="${3-datadir}" while : do dirvar=`echo $src_dir | sed 's|[^a-zA-Z]|_|g'` dotdot1=`dirname ${src_dir-.}` dotdot2=`dirname ${dst_dir-.}` if eval "test \${${dirvar}_${flavor}-no} != yes" ; then echo "" if test "$dotdot1" != "." -a "$dotdot2" != "." ; then echo "$src_dir/.${flavor}: $dotdot1/.${flavor}" else echo "$src_dir/.${flavor}:" fi echo "${TAB}-\$(INSTALL) -m 0755 -d $dst_dir" echo "${TAB}@-test -d $dst_dir && touch \$@" echo "${TAB}@sleep 1" eval "${dirvar}_${flavor}=yes" clean_files="$clean_files $src_dir/.${flavor}" fi src_dir=$dotdot1 dst_dir=$dotdot2 if test "$src_dir" = "." -o "$dst_dir" = "." ; then break; fi done } echo for file in $* do case $file in *.y) dir=`echo $file | sed 's|^\([^/]*\)/.*$|\1|'` stem=`echo $file | sed 's/\.y$//'` eval "${dir}_files=\"\$${dir}_files ${stem}.gen.\\\$(OBJEXT)\"" clean_files="$clean_files ${stem}.gen.c ${stem}.gen.h \ ${stem}.gen.\$(OBJEXT)" ;; */*.c) dir=`echo $file | sed 's|/.*$||'` stem=`echo $file | sed 's|\.c$||'` eval "${dir}_files=\"\$${dir}_files ${stem}.\\\$(OBJEXT)\"" clean_files="$clean_files ${stem}.\$(OBJEXT)" case $file in */main.c) progs="$progs $dir" progsa="$progsa bin/$dir\$(EXEEXT)" progsi="$progsi \$(bindir)/\$(PROGRAM_PREFIX)$dir\$(PROGRAM_SUFFIX)\$(EXEEXT)" ;; *) ;; esac ;; lib/*/LC_MESSAGES/common.po) ;; lib/*.po) stem=`echo $file | sed 's|^lib/\(.*\)\.po$|\1|'` src="lib/$stem.mo" po_files="$po_files $src" dst="\$(NLSDIR)/$stem.mo" install_po_files="$install_po_files $dst" recursive_mkdir `dirname $src` `dirname $dst` nlsdir ;; lib/*/*/*.so) ;; lib/*/man?/*) stem=`echo $file | sed 's|^lib/||'` man_i18n_files="$man_i18n_files \$(datadir)/$stem" case $file in lib/en/*) stem2=`echo $file | sed 's|^lib/en/||'` man_files="$man_files \$(mandir)/$stem2" src="lib/$stem" dst="\$(mandir)/$stem2" recursive_mkdir `dirname $src` `dirname $dst` mandir ;; esac src="lib/$stem" dst="\$(datadir)/$stem" recursive_mkdir `dirname $src` `dirname $dst` datadir ;; lib/*.so) ;; lib/*/*/main.*) stem=`echo $file | sed 's|^lib/\(.*\)/main.*$|\1|'` doc_files="$doc_files lib/$stem.ps lib/$stem.dvi lib/$stem.txt" clean_files="$clean_files lib/$stem.ps lib/$stem.dvi" clean_files="$clean_files lib/$stem.txt" install_doc_files="$install_doc_files \$(datadir)/$stem.ps" install_doc_files="$install_doc_files \$(datadir)/$stem.dvi" install_doc_files="$install_doc_files \$(datadir)/$stem.txt" ;; test/*/*) root=`basename $file .sh` test_files="$test_files $root" ;; *) ;; esac done echo '' echo "all: binaries po doc" # # The variable parts # echo echo "CommonFiles =" $common_files echo echo "TestFiles =" $test_files echo echo "install-man:" $man_files echo echo 'install-iman: install-iman-$(HAVE_I18N)' echo echo "install-iman-yes:" $man_i18n_files echo echo 'install-iman-no:' echo '' echo 'po: po-$(HAVE_I18N)' echo echo "po-yes:" $po_files echo echo 'po-no:' echo echo 'install-po: install-po-$(HAVE_I18N)' echo echo "install-po-yes:" $install_po_files echo echo 'install-po-no:' echo '' echo 'doc: doc-$(HAVE_GROFF)' echo echo "doc-yes:" $doc_files echo echo 'doc-no:' echo echo 'install-doc: install-doc-$(HAVE_GROFF)' echo echo "install-doc-yes:" $install_doc_files echo echo 'install-doc-no:' echo '' echo "binaries: $progsa" for prog in $progs do echo '' eval "echo ${prog}_files = \${${prog}_files}" echo '' echo "bin/$prog\$(EXEEXT): \$(${prog}_files) common/lib.\$(LIBEXT) .bin" echo "${TAB}\$(CC) \$(LDFLAGS) -o \$@ \$(${prog}_files)" \ "common/lib.\$(LIBEXT) \$(LIBS)" echo "${TAB}chmod 755 \$@" echo '' echo "\$(bindir)/\$(PROGRAM_PREFIX)$prog\$(PROGRAM_SUFFIX)\$(EXEEXT):" \ "bin/$prog\$(EXEEXT) .bindir" echo "${TAB}\$(INSTALL_PROGRAM) bin/$prog\$(EXEEXT) \$@" done echo "" echo "clean-obj:" echo $clean_files | tr ' ' '\12' | gawk '{ if (pos > 0 && pos + length($1) > 71) { printf("\n"); pos = 0; } if (pos == 0) { printf "\trm -f"; pos = 13; } printf " %s", $1 pos += 1 + length($1); } END { if (pos) printf "\n"; }' # # emit the constant part # echo '' echo 'clean: clean-obj' echo "${TAB}rm -f $progsa" cat << fubar distclean: clean ${TAB}rm -f config.status config.log config.cache Makefile ${TAB}rm -f common/config.h etc/libdir-h common/lib.\$(LIBEXT): \$(CommonFiles) ${TAB}rm -f \$@ ${TAB}ar cq \$@ \$(CommonFiles) ${TAB}\$(RANLIB) \$@ .bin: ${TAB}-mkdir bin ${TAB}-@test -d bin && touch \$@ ${TAB}@sleep 1 .bindir: ${TAB}-\$(INSTALL) -d -m 0755 \$(bindir) ${TAB}-@test -d \$(bindir) && touch \$@ ${TAB}@sleep 1 sure: \$(TestFiles) ${TAB}@echo Passed All Tests install: install-bin install-man install-iman install-po install-doc ${TAB}@echo Installation Complete fubar echo "install-bin: $progsi" exit 0 fhist-1.18/etc/archive.cook 644 0 0 2052111265752627 151010ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2001, 2003, 2005, 2006, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ integration-build-targets: archive/[project_minus].README archive/[project_minus].lsm archive/[project_minus].pdf archive/[project_minus].spec archive/[project_minus].tar.gz archive/[project_short].png archive/[project_short].ico archive/[project_short].html archive/.htaccess archive/ChangeLog ; source_file_order = README [sort [stringset [source_files] BUILDING LICENSE /* * These two are for time stamping the distribution, * and cranking on the version. */ common/patchlevel.h /* * These four are for building the distribution. */ Makefile.in common/config.h.in install-sh configure /* * This is for building the RPM package */ [project_minus].spec - README ] ] ; /* * These recipes build a Makefile for a user. They do not build a * Makefile useful for a development build, because no arch * information is included in the Makefile. */ makefile-per-file = [prepost "" ",M" [source_files]]; Makefile.in: etc/Makefile.head etc/Makefile.sh etc/Makefile.awk /* [vs_file] */ [makefile-per-file] { cat [resolve etc/Makefile.head [makefile-per-file]] > [target]; sh [resolve etc/Makefile.sh] [source_files] | [awk] -f [resolve etc/Makefile.awk] >> [target]; } %0%,M: etc/Makefi.file.sh etc/Makefile.awk { depfile = [match_mask %%0%%,Md [need]]; sh [resolve etc/Makefi.file.sh] %0% [resolve %0%] [resolve [depfile]] | [awk] -f [resolve etc/Makefile.awk] > [target]; } archive/[project_minus].tar.gz: [source_file_order] set shallow { tar cf - [resolve [source_file_order]] | tardy -una Peter -gna Miller -unu 0 -gnu 0 -ms 0644 -mc 07022 -now -prefix\=[project_minus] [prepost "-rp=" "" [search_list]] | gzip -9 > [target]; } archive/[project_minus].%: % set shallow { cat [resolve [need]] > [target]; } #include-cooked [addsuffix ".d" [match_mask etc/%.man [source_files]]] /* * This is not in the integration-build-targets because it takes far * too long to do. */ RPM: archive/[project_minus]-1.i386.rpm; archive/[project_minus]-1.i386.rpm archive/[project_minus]-1.src.rpm: archive/[project_minus].tar.gz etc/rpm-build.sh set shallow { sh [resolve etc/rpm-build.sh] RPM-temporary [resolve archive/[project_minus].tar.gz] ; mv RPM-temporary/RPMS/i386/[project_minus]-1.i386.rpm archive/[project_minus]-1.i386.rpm ; mv RPM-temporary/SRPMS/[project_minus]-1.src.rpm archive/[project_minus]-1.src.rpm ; rm -r RPM-temporary; } [project_minus].spec: etc/spec.sh [source_files] { version\=[version_short] sh [resolve etc/spec.sh] [source_files] > [target]; } archive/[project_minus].spec: [project_minus].spec set shallow { cat [resolve [need]] > [target]; } archive/%: etc/%.uue set shallow { uudecode -o [target] [resolve [need]]; } etc/[project_short].html.d: etc/[project_short].html set no-cascade { c_incl -nc -ns -eia -r -nrec [sort [prepost "-I" /[arch]/etc [search_list]] [prepost "-I" "/etc" [search_list]] ] -prefix "'cascade etc/"[project_short]".html ='" -suffix "';'" [resolve etc/[project_short].html] [prepost "-rlp=" "" [search_list]] /* remove leading path */ -slp [arch] "'[arch]'" /* substitute leading path */ -o [target]; } #include-cooked-nowarn etc/[project_short].html.d archive/[project_short].html: etc/[project_short].html etc/ssp.awk set shallow { roffpp [sort [prepost "-I" /[arch]/etc [search_list]] [prepost "-I" "/etc" [search_list]] ] [resolve etc/[project_short].html] | groff -Tascii -t -P-hub -man | [awk] -f [resolve etc/ssp.awk] > [target]; } etc/[project_short].lsm.d: etc/[project_short].lsm set no-cascade { c_incl -nc -ns -eia -r -nrec [sort [prepost "-I" /[arch]/etc [search_list]] [prepost "-I" "/etc" [search_list]] ] -prefix "'cascade etc/"[project_short]".lsm ='" -suffix "';'" [resolve etc/[project_short].lsm] [prepost "-rlp=" "" [search_list]] /* remove leading path */ -slp [arch] "'[arch]'" /* substitute leading path */ -o [target]; } #include-cooked-nowarn etc/[project_short].lsm.d archive/[project_minus].lsm: etc/[project_short].lsm etc/ssp.awk set shallow { roffpp [sort [prepost "-I" /[arch]/etc [search_list]] [prepost "-I" "/etc" [search_list]] ] [resolve etc/[project_short].lsm] | groff -Tascii -t -P-hub -man | [awk] -f [resolve etc/ssp.awk] > [target]; } LICENSE: lib/en/cat1/fhist_lic.1 { cp [resolve [need]] [target]; } %0%.y,M:: %0%.gen.c,Md; %0%.c,M:: %0%.c,Md; %1/%0%2.c,Md: %1/%0%2.c { c_incl -nc /* no cache */ -ns /* no system */ -eia /* empty if absent */ [sort [stringset [cc_include_flags] [prepost "-I" "/%1" [search_list]] ] ] [resolve %1/%0%2.c] -nsri /* no source relative includes */ [prepost "-rlp=" "" [search_list]] /* remove leading path */ -rlp [arch] /* remove leading architecture */ -o [target]; } archive/[project_minus].pdf: lib/en/reference.pdf set shallow { cp [resolve [need]] [target]; } archive/.htaccess: etc/htaccess set shallow { sed '/^#/d' < [resolve etc/htaccess] > [target]; } archive/ChangeLog: [source_files] { aereport change_log -p fhist -c 1 -o [target] -pw\=80 -pl\=66; } /* * Catch 22: You need to build these to be able to automatically discover * that you need to build them. Sigh. */ cascade etc/fhist.html = etc/version.so; cascade etc/fhist.lsm = etc/version.so; check-tarball: archive/[project_minus].tar.gz etc/check-tgz.sh { sh [resolve etc/check-tgz.sh archive/[project_minus].tar.gz]; } archive/%1-%2.png: archive/%1.png { convert [resolve archive/%1.png] -scale %2 [target]; } archive/%.ico: archive/%-16.png archive/%-32.png archive/%-64.png archive/%-128.png { png2ico [target] /* --colors 250 */ [resolve [need]]; } fhist-1.18/etc/cfmt.cook 644 0 0 245511265752627 143770ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ cfmt = [find_command cfmt]; #if [cfmt] %1/%0%.cfmt: %1/%0% { local extra = [stringset [cc_include_flags] [prepost "-I" "/%1" [search_list]]]; [cfmt] --style\=miller [extra] [resolve %1/%0%] [target]; diff -B [resolve %1/%0%] [target]; /* * Make the file zero length. We don't need a redundant copy, * only a time stamp. */ > [target]; } etc/.cfmt: [addsuffix ".cfmt" [match_mask %0%.c [source_files]]] { date > [target]; } #if 0 all += etc/.cfmt; #endif #endif fhist-1.18/etc/check-tgz.sh 644 0 0 214611265752627 150010ustar PeterMiller 0 0#!/bin/sh # # fhist - file history and comparison tools # Copyright (C) 2005, 2008 Peter Miller # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see # . # set -x here=`pwd` tmp=/tmp/fhist.check.tarball.$$ fail() { cd $here rm -rf $tmp exit 1 } trap "fail" 1 2 3 15 mkdir $tmp zcat < $1 | ( cd $tmp ; tar xf - ) cd $tmp/fhist* ./configure test $? -eq 0 || fail make test $? -eq 0 || fail make sure test $? -eq 0 || fail cd $here rm -rf $tmp exit 0 fhist-1.18/etc/configure.ac 644 0 0 2064111265752627 150740ustar PeterMiller 0 0dnl dnl fhist - file history and comparison tools dnl Copyright (C) 1994-2009 Peter Miller dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 3 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program. If not, see dnl . dnl AC_INIT(install-sh) AC_CONFIG_HEADER(common/config.h) AC_PROG_CC AC_PROG_CPP AC_EXEEXT AC_OBJEXT AC_PROG_INSTALL AC_PROG_YACC AC_PROG_RANLIB AC_MINIX AC_ISC_POSIX AC_HAVE_LIBRARY(w32) dnl DG/UX wide character support AC_HAVE_LIBRARY(w) dnl Solaris wide character support AC_HAVE_LIBRARY(intl) AC_CHECK_PROGS(SOELIM, roffpp gsoelim soelim) AC_CHECK_PROGS(MSGFMT, gmsgfmt msgfmt, msgfmt) AC_CHECK_PROGS(MSGCAT, gmsgcat msgcat) AC_CHECK_PROGS(GROFF, groff roff) dnl dnl Make sure soelim understands the -I option dnl if test -n "$SOELIM"; then AC_MSG_CHECKING([that $SOELIM understands the -I option]) echo ".so version.so" > conftest.in 2>&5 $SOELIM -Ietc -Ibl/etc -Iblbl/etc conftest.in > conftest.out 2>&5 if grep 1998 conftest.out 1>&5 2>&5; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) AC_MSG_RESULT([]) AC_MSG_RESULT([ The FHist documentation set and manual pages]) AC_MSG_RESULT([ will be formatted and installed installed if]) AC_MSG_RESULT([ you first install GNU Groff 1.15 or later and then]) AC_MSG_RESULT([ re-run this ./configure script. Remember to]) AC_MSG_RESULT([ use \`\`rm config.cache'' before you do.]) AC_MSG_RESULT([]) SOELIM= fi rm -rf conftest* fi dnl dnl Test to see where TIOCGWINSZ is defined. dnl AC_MSG_CHECKING([for TIOCGWINSZ]) AC_TRY_RUN([ #include int main(argc, argv)int argc; char **argv;{ #ifdef TIOCGWINSZ struct winsize ws; ws.ws_col = 0; exit(ws.ws_col); #else exit(1); #endif }] , AC_DEFINE(HAVE_winsize_SYS_IOCTL_H,1, [Define this symbol if your system as AND it defines TIOCGWINSZ and struct winsize.]) AC_MSG_RESULT([sys/ioctl.h]), AC_MSG_RESULT([not found]), AC_MSG_RESULT(cross)) dnl dnl Test to see where struct winsize is defined. dnl AC_MSG_CHECKING([for struct winsize]) AC_TRY_RUN([ #include int main(argc, argv)int argc; char **argv;{ #ifdef TIOCGWINSZ struct winsize ws; ws.ws_col = 0; exit(ws.ws_col); #else exit(1); #endif }] , AC_DEFINE(HAVE_winsize_TERMIOS_H,1, [Define this symbol if your system as AND it defines TIOCGWINSZ and struct winsize.]) AC_MSG_RESULT([termios.h]), AC_MSG_RESULT([not found]), AC_MSG_RESULT(cross)) AC_CHECK_HEADERS(iso646.h libgettext.h libintl.h limits.h locale.h memory.h \ stddef.h stdlib.h string.h unistd.h wchar.h wctype.h widec.h) AC_HEADER_DIRENT AC_TYPE_SIGNAL AC_TYPE_SIZE_T AC_HEADER_TIME AC_C_CONST AC_LONG_FILE_NAMES AC_CHECK_FUNCS(atexit getpgrp gettext iswctype rename setlocale \ sighold sigprocmask strcasecmp strerror strftime strsignal tcgetpgrp \ wcslen) dnl dnl Check to see if wint_t is defined. dnl The ANSI C standard states that this symbol shall be defined dnl by and . The GNU people also define it in dnl , but this is incorrect. dnl AC_MSG_CHECKING([for wint_t]) AC_TRY_COMPILE([ #ifdef HAVE_WCHAR_H #include #endif ], [ wint_t x; ], AC_DEFINE(HAVE_WINT_T,1, [Define this symbol of your system has the wint_t type defined. It is usually in or ]) AC_MSG_RESULT(yes), AC_MSG_RESULT(no))dnl dnl dnl Test to see if iswprint is available *and* works. dnl AC_MSG_CHECKING([for working iswprint]) AC_TRY_RUN([ #include #ifdef HAVE_WIDEC_H #include #endif #ifdef HAVE_WCTYPE_H #include #endif int main(argc,argv)int argc;char**argv;{ exit(iswprint('a') == 0);}] , AC_DEFINE(HAVE_ISWPRINT,1, [Define this symbol of your system has iswprint() AND it works. (GNU libc v2 had a bug.)]) AC_MSG_RESULT(yes), AC_MSG_RESULT(no), AC_MSG_RESULT(cross))dnl dnl dnl Test to see if getpgrp() or getpgrp(0) should be used to dnl discover the process group of the current process. dnl AC_MSG_CHECKING([for appropriate getpgrp argument]) AC_TRY_RUN([ int main(argc, argv) int argc; char **argv; { #ifdef HAVE_GETPGRP if (getpgrp(32767) == getpgrp(0)) exit(2); #endif exit(0); }] , AC_DEFINE(CONF_getpgrp_arg, 0, [Set this to a suitable argument for the getpgrp function to discover the process group of the current process.]) AC_MSG_RESULT(zero), AC_DEFINE(CONF_getpgrp_arg, [], [Set this to a suitable argument for the getpgrp function to discover the process group of the current process.]) AC_MSG_RESULT(empty), AC_MSG_RESULT(cross)) dnl dnl Test to find a Bourne shell which understands functions dnl AC_MSG_CHECKING([for a Bourne shell which understands functions]) if test "z$SH" = "z"; then if test -f /bin/sh5; then SH=/bin/sh5 else SH=/bin/sh fi fi AC_SUBST(SH) AC_DEFINE_UNQUOTED(CONF_SHELL, ["$SH"], [Set this to be the absolute path of a Bourne shell which understands functions.]) AC_MSG_RESULT($SH) dnl dnl If the gettext function exists, assume the msgfmt program does dnl also, and arrange for the Makefile to install the .mo files dnl from the .po files. dnl if test "$ac_cv_func_gettext" = "yes" then internationalization=yes else internationalization=no AC_MSG_RESULT([]) AC_MSG_RESULT([ FHist will emit much more useful error messages]) AC_MSG_RESULT([ if you install GNU \`\`gettext'' and then]) AC_MSG_RESULT([ re-run this ./configure script. Remember to]) AC_MSG_RESULT([ use \`\`rm config.cache'' before you do.]) AC_MSG_RESULT([]) fi AC_SUBST(internationalization) dnl dnl Arrange for the existence of groff to affect the Makefile dnl if test -n "$GROFF" then if test -n "$SOELIM"; then have_groff=yes else have_groff=no fi else have_groff=no AC_MSG_RESULT([]) AC_MSG_RESULT([ The FHist documentation set and manual pages]) AC_MSG_RESULT([ will be formatted and installed installed if]) AC_MSG_RESULT([ you first install GNU Groff and then]) AC_MSG_RESULT([ re-run this ./configure script. Remember to]) AC_MSG_RESULT([ use \`\`rm config.cache'' before you do.]) AC_MSG_RESULT([]) fi AC_SUBST(have_groff) # program prefix is the bit to add to the start of the name if test ${PROGRAM_PREFIX-NONE} != NONE -a ${program_prefix-NONE} != NONE; then PROGRAM_PREFIX=${program_prefix} fi AC_SUBST(PROGRAM_PREFIX) # program suffix is the bit to add to the end of the name (before .exe) if test ${PROGRAM_SUFFIX-NONE} != NONE -a ${program_suffix-NONE} != NONE; then PROGRAM_SUFFIX=${program_suffix} fi AC_SUBST(PROGRAM_SUFFIX) dnl dnl Evaluate some of the variables, to remove ${prefix} references. dnl This way, they can be used in C programs and Roff input. dnl Make sure that fhist is mentioned in the libdir and datadir paths; dnl add it if it is not already there. dnl test "x$prefix" = xNONE && prefix="${ac_default_prefix-/usr/local}" test "x$exec_prefix" = xNONE && exec_prefix="$prefix" eval "exec_prefix=$exec_prefix" eval "bindir=$bindir" eval "mandir=$mandir" eval "libdir=$libdir" eval "datadir=$datadir" eval "sharedstatedir=$sharedstatedir" case "$datadir" in */fhist/* | */fhist ) ;; *) datadir="${datadir}/fhist" ;; esac case "$libdir" in */fhist/* | */fhist ) ;; *) libdir="${libdir}/fhist" ;; esac case "$sharedstatedir" in */fhist/* | */fhist ) ;; *) sharedstatedir="${sharedstatedir}/fhist" ;; esac dnl dnl support for NLSDIR option dnl AC_ARG_WITH(nlsdir, [ --with-nlsdir=PATH specify where the locale stuff should go ]) if test "x$NLSDIR" = "x"; then if test "x$with_nlsdir" != "x"; then NLSDIR=$with_nlsdir else NLSDIR=${libdir} fi fi AC_SUBST(NLSDIR) AH_TOP([#ifndef COMMON_CONFIG_H #define COMMON_CONFIG_H]) AH_BOTTOM([#include #endif /* COMMON_CONFIG_H */]) AC_OUTPUT(Makefile etc/libdir-h) fhist-1.18/etc/document.cook 644 0 0 2072111265752627 153000ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2001, 2004, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ source_files = [source_files] etc/version.so [fromto lib/%1/readme/main.%2 lib/%1/readme/new.so [match_mask lib/%1/readme/main.%2 [source_files]] ] [fromto lib/%1/reference/main.%2 lib/%1/reference/ref-index.so [match_mask lib/%1/reference/main.%2 [source_files]] ] [fromto lib/%1/reference/main.%2 lib/%1/reference/ref-parts.so [match_mask lib/%1/reference/main.%2 [source_files]] ]; etc/version.so: set ['if' [or [not [defined baseline] ] [not [exists bl/etc/version.so ] ] ] 'then' shallow] { echo \".ds V) [version]\" > [target]; echo \".ds v) [version_short]\" >> etc/version.so; aegis -list version -p [project] -c [change] | gawk -F'\'"\'' "'/previous/{print $2}'" | gawk -F. "'{print \".ds w) \"$1\".\"$2}'" >> [target]; echo \".ds Y) [copyright_years]\" >> [target]; } lib/%/readme/new.so: : etc/so.sh [match_mask lib/%/readme/new.%%.so [source_files]] set ['if' [not [defined baseline]] 'then' shallow] { sh [resolve etc/so.sh] -r [fromto lib/%/readme/new.%%.so new.%%.so [match_mask lib/%/readme/new.%%.so [source_files]] ] > [target]; } /* Sigh. Must be before the next recipe, and before the generic .d's. */ cascade lib/en/reference/main.man = lib/en/reference/ref-index.so lib/en/reference/ref-parts.so; lib/%/reference/ref-index.so: [match_mask lib/%/man%%1/%%2.%%1 [source_files]] etc/ptx1.awk etc/ptx.ignore etc/ptx2.awk set no-cascade { [awk] -f [resolve etc/ptx1.awk] [resolve [match_mask lib/%/man%%1/%%2.%%1 [source_files]]] | ptx -O -r -w1000 -i[resolve etc/ptx.ignore] | sort -t'\'"\'' -f -d +5 -6 +3 -4 | [awk] -F'\'"\'' -f [resolve etc/ptx2.awk] > [target]; } lib/%/reference/ref-parts.so: [match_mask lib/%/man%%1/%%2.%%1 [source_files]] etc/ptx.sh set no-cascade { sh -f [resolve etc/ptx.sh] [match_mask lib/%/man%%1/%%2.%%1 [source_files]] > [target]; } /* * formatting documents and manual entries */ doc.targets: cat special; /* * manual entries */ cat = [fromto lib/%3/man%1/%2.%1 lib/%3/cat%1/%2.%1 [match_mask lib/%3/man%1/%2.%1 [source_files]] ]; cat: [cat]; lib/%3/cat%1/%2.%1: lib/%3/man%1/%2.%1 set mkdir unlink { roffpp [sort [prepost "-I" "/etc" [search_list]] [prepost "-I" "/lib/%3/man%1" [search_list]] ] [resolve lib/%3/man%1/%2.%1] | groff -Tascii -P-ch -t -man > [target]; } lib/%3/man%1/%2.%1.d: lib/%3/man%1/%2.%1 set nocascade { c_incl -nc -ns -eia -r -nrec [sort [stringset [cc_include_flags] [prepost "-I" "/etc" [search_list]] [prepost "-I" "/lib/%3/man%1" [search_list]] ] ] -prefix "'cascade lib/%3/man%1/%2.%1 ='" -suffix "';'" [resolve lib/%3/man%1/%2.%1] [prepost "-rlp=" "" [search_list]] -o [target]; } %0%.so.d: %0%.so set nocascade { c_incl -nc -ns -eia -r -nrec [sort [stringset [cc_include_flags] [prepost "-I" "/etc" [search_list]] [prepost "-I" /[dirname %0%.so] [search_list]] ] ] -prefix "'cascade %0%.so ='" -suffix "';'" [resolve %0%.so] [prepost "-rlp=" "" [search_list]] -o [target]; } man-dep-files = [addsuffix .d [match_mask lib/%3/man%1/%2.%1 [source_files]]] [addsuffix .d [match_mask %0%.so [source_files]]] ; #include-cooked-nowarn [man-dep-files] /* * specials */ special = [fromto lib/%1/%2/main.man lib/%1/%2.pdf [match_mask lib/%1/%2/main.man [source_files]] ]; special: [special]; lib/%1/%2.pdf: lib/%1/%2/main.man { roffpp [sort [stringset [cc_include_flags] [prepost "-I" /etc [search_list]] [prepost "-I" /lib/%1/%2 [search_list]] [prepost "-I" /lib/%1/man1 [search_list]] [prepost "-I" /lib/%1/readme [search_list]] ] ] [resolve lib/%1/%2/main.man] > lib/%1/%2.groff; groff -t -p -man lib/%1/%2.groff > lib/%1/%2.ps; rm lib/%1/%2.groff set silent; ps2pdf lib/%1/%2.ps [target]; rm lib/%1/%2.ps set silent; } lib/%1/%2.txt: lib/%1/%2/main.man { roffpp [sort [stringset [cc_include_flags] [prepost "-I" /etc [search_list]] [prepost "-I" /lib/%1/%2 [search_list]] [prepost "-I" /lib/%1/man1 [search_list]] [prepost "-I" /lib/%1/readme [search_list]] ] ] [resolve lib/%1/%2/main.man] > lib/%1/%2.groff; groff -Tascii -P-bchu -t -p -man lib/%1/%2.groff > [target]; rm lib/%1/%2.groff set silent; } lib/%1/%2/main.man.d: lib/%1/%2/main.man set nocascade { c_incl -nc -ns -eia -r -nrec [sort [stringset [cc_include_flags] [prepost "-I" /etc [search_list]] [prepost "-I" /lib/%1/%2 [search_list]] [prepost "-I" /lib/%1/man1 [search_list]] [prepost "-I" /lib/%1/readme [search_list]] ] ] -prefix "'cascade lib/%1/%2/main.man ='" -suffix "';'" [resolve lib/%1/%2/main.man] [prepost "-rlp=" "" [search_list]] -o [target]; } etc-dep-files = [addsuffix .d [match_mask %0%.man [source_files]]] ; #include-cooked-nowarn [etc-dep-files] README: lib/en/readme.txt etc/ssp.awk { awk -f [resolve etc/ssp.awk lib/en/readme.txt] > [target]; } BUILDING: lib/en/building.txt { cp [resolve [need]] [target]; } etc/%.txt: etc/%.man etc/ssp.awk { roffpp [prepost "-I" /etc [search_list]] [resolve etc/%.man] > etc/%.groff; groff -Tascii -P-bcu -t -p -man etc/%.groff | awk -f [resolve etc/ssp.awk] > [target]; rm etc/%.groff set silent; } etc/%.man.d: etc/%.man set nocascade { c_incl -nc -ns -eia -r -nrec [prepost "-I" "/etc" [search_list]] -prefix "'cascade etc/%.man ='" -suffix "';'" [resolve etc/%.man] [prepost "-rlp=" "" [search_list]] -o [target]; } all += etc/release.txt; /* * Catch 22: you need to build these includes, in order to discover that * you need to build these includes. Sigh. */ cascade lib/en/man1/z_cr.so = etc/version.so; cascade lib/en/readme/main.man = lib/en/readme/new.so; cascade etc/release.man = etc/version.so; fhist-1.18/etc/fhist.html 644 0 0 1276011265752627 146140ustar PeterMiller 0 0.\" .\" fhist - file history and comparison tools .\" Copyright (C) 1998, 2000, 2001, 2003, 2006, 2008, 2009 Peter Miller .\" .\" This program is free software; you can redistribute it and/or modify .\" it under the terms of the GNU General Public License as published by .\" the Free Software Foundation; either version 3 of the License, or .\" (at your option) any later version. .\" .\" This program is distributed in the hope that it will be useful, .\" but WITHOUT ANY WARRANTY; without even the implied warranty of .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU .\" General Public License for more details. .\" .\" You should have received a copy of the GNU General Public License along .\" with this program. If not, see . .\" .ad l .hy 0 .so version.so FHist \*(v)

fhist \*(v)

The FHist package contains 3 utilities, a file history tool “fhist”, a file comparison tool “fcomp”, and a file merging tool “fmerge”. All three are bundled together, because they all use the same minimal-difference algorithm. .br

The history tool presented here, fhist, is a minimal history tool. It provides no locking or branching. This can be useful in contexts where the configuration management or change control be being provided by some other tool. .br

The history tool, fhist is able to handle binary files. The file comparison tool, fcomp, usually does a line-for-line plain-text comparison, however it is also capable of a byte-for-byte binary comparison. .br


.nf [ SourceForge Project | Aegis Project | RSS ]

.fi

Files for Download

File Name Description
fhist-\*(v).README The README file from the tar distribution.
fhist-\*(v).lsm Brief description in .nf LSM .fi format.
fhist-\*(v).spec RedHat package manager specification file (RPM)
fhist-\*(v).tar.gz The complete source.
fhist-\*(v).pdf Reference Manual, in Adobe AcroRead format.
ChangeLog The change log for the project, sorted most recent to least recent.
.br

FHist is also available from a href="https://sourceforge.net/project/showfiles.php?group_id=75707" >SourceForge's download mirrors. The download mirrors will probably faster than the other links on this page. .br .\" ------------------------------------------------------------------------


.br .br FHist is maintained by Peter Miller and is freely distributable under the terms and conditions of the GNU GPL. .br .br .fi FHist is developed using Aegis, a transaction based software configuration management package. There is more Software by Peter Miller at his home page.
.br .\" ------------------------------------------------------------------------
This page is hosted by SourceForge.net Logo SourceForge.

This page has been accessed approximately .nf .fi times since .ds MO1 Jan .ds MO2 Feb .ds MO3 Mar .ds MO4 Apr .ds MO5 May .ds MO6 Jun .ds MO7 Jul .ds MO8 Aug .ds MO9 Sep .ds MO10 Oct .ds MO11 Nov .ds MO12 Dec .nr y4 \n[yr]+1900 \n[dy]-\*[MO\n[mo]]-\n[y4]. fhist-1.18/etc/fhist.lsm 644 0 0 530011265752627 144130ustar PeterMiller 0 0.\" .\" fhist - file history and comparison tools .\" Copyright (C) 1998, 2000, 2001, 2008, 2009 Peter Miller .\" .\" This program is free software; you can redistribute it and/or modify .\" it under the terms of the GNU General Public License as published by .\" the Free Software Foundation; either version 3 of the License, or .\" (at your option) any later version. .\" .\" This program is distributed in the hope that it will be useful, .\" but WITHOUT ANY WARRANTY; without even the implied warranty of .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the .\" GNU General Public License for more details. .\" .\" You should have received a copy of the GNU General Public License .\" along with this program. If not, see .\" . .\" .\" LSM = Linux Software Module, an archive description file .\" .\" Descriptions of the LSM file format can be found in the .\" /pub/Linux/docs directories of sunsite.unc.edu and tsx-11.mit.edu. .\" .ad l .hy 0 .de SH .in 0 .br \\$1 'in 8n .. .so version.so .SH Begin3 .SH Title: fhist .SH Version: \*(v) .SH Entered-date: .ds MO1 JAN .ds MO2 FEB .ds MO3 MAR .ds MO4 APR .ds MO5 MAY .ds MO6 JUN .ds MO7 JUL .ds MO8 AUG .ds MO9 SEP .ds MO10 OCT .ds MO11 NOV .ds MO12 DEC .nr y4 \n[yr]+1900 \n[dy]\*[MO\n[mo]]\n[y4] .SH Description: The FHist package contains 3 utilities, a file history tool "fhist", a file comparison tool "fcomp", and a file merging tool "fmerge". All three are bundled together, because they all use the same minimal-difference algorithm. .sp The history tool presented here, fhist, is a minimal history tool. It provides no locking or branching. This can be useful in contexts where the configuration management or change control be being provided by some other tool. .sp FHist runs on almost any flavor of UNIX. Self configuring using a GNU Autoconf generated configure script. There are no modifications required to compile it for Linux. .SH Keywords: history .SH Author: Peter Miller .SH Primary-site: http://fhist.sourceforge.net/ .TS lf(CW) l. fhist-\*(v).README Description, from the tar file fhist-\*(v).lsm Description, LSM format fhist-\*(v).spec RedHat package specification fhist-\*(v).tar.gz The complete sources. fhist-\*(v).pdf Reference Manual, in Adobe AcroRead format. .TE .SH Secondary-site: sunsite.unc.edu /pub/Linux/devel/vc .TS lf(CW) l. fhist-\*(v).README Description, from the tar file fhist-\*(v).lsm Description, LSM format fhist-\*(v).spec RedHat package specification fhist-\*(v).tar.gz The complete sources. fhist-\*(v).pdf Reference Manual, in Adobe AcroRead format. .TE .SH Copying-policy: GPL 2.0 .SH End fhist-1.18/etc/fhist.png.uue 644 0 0 42404011265752627 152470ustar PeterMiller 0 0# # fhist - file history and comparison tools # Copyright (C) 2006, 2008 Peter Miller # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see # . # begin 644 fhist.png MB5!.1PT*&@H````-24A$4@```.$```#A"`(```"QT44M````"7!(67,```L3 M```+$P$`FIP8````!W1)344'U@@7%S(#F!W!2P```$%T15AT0V]M;65N=`!# M4D5!5$]2.B!G9"UJ<&5G('8Q+C`@*'5S:6YG($E*1R!*4$5'('8V,BDL('%U M86QI='D@/2`X,`JQAS*D```@`$E$051XVE2\V:\EZ9$?]HN([\O,DV>[:]W: M>ZEB-\ENDDURAJ0X&FHS9"FG_^; M!P_>NWE[+F7S\8]_0FGOVLG;W_[M'_S^=]Y'NM*DPA`Y2N?KP^/I9%)>O7[\ M%W_E5\_/%O_7__E_4Y@\?+1Y?G;1#T/3K.;'X]=>NPX@%J3NEY>7,4X"%V=G MJ]/G%T."Z=!MKJM M*AP<\7@\'KMZL$7O_SVO7OW[G_\X:R>#VE]]<;TK\^<7E.2MB@9['@PJ2`H@"`)3ZE'(5.4BH@XA(*2!F:'*".?;TWKM_^.Y[PWR.S[]3 M_C?_[7^74AK=^B+ZLW_X7_P#N7.K3,.@YG`E=G?``\`PP*FJBGHR>OSPL02X M#_/Y:._@*):C.D[ZM)G.M,;VQF09;GUE?./-JY/^WH>[(5W& M$%^\>/;^3W\X'X>K;_W[>[?^CNSCM_^/_^N[WTMEH12K?LBK]?KQX]-Z*BD/ M+UZ<0JW9MO<_>C`,%F(ML9K-:HDYEES75=:.V')2">'@X$!">/3PT:.'`T>] M=N5*/VSWYJ,A]4RH2DAP=M\V2R::C4=E#&E((*O'I9LN5VDVQW@:JZIDIK(J MZWI2C>L88]/FQ>6V;2'$("F*NB@*=W.0B(B$$"6&JJKJHBI'HS)$AGO;;MV' MF[>OW;IU,^=^M5E9[W]>KU_+G_OPWP`&I.]@_E$^_5JNJ&P'F<"(P%\+1$4)1CD>C>EQ+P.MW M7]_;GQ7E.,;:G;?;X?'SR\]^YO#5UZ_^T1_]WA_]J]]8W?^]5[_QEZZ^_N:U M^562>3?(W3MO*#^CW_\8=-Y5O6F[Q<5YES=$N'']Z/57;TU&92C#=KO) MJ9].IH?[!RG9:GVI">K;=S[_V:/#O>7E6=_ZN,!L4EZ_=GRTOY^ZSCUI2CF; M*8:NRSD5!?8/B\FDJ*HRQEB.1N/QK*A&C'*Q:+?;QMR#%"1%494Q1GE&;9-=V^>?7X>`;OS(?1*+*' MU6H#E3082RA'HZ(LG&Q(?9?T]'3;=UG5B23$"`X`F_MFLQZ-RE%5DF>"E9&9 M/#O("Z*PJS8F@,!N@$<1YEV-`JZJ:CEG\R#!@!""B(00F,D,JNKN9KOVNBLL MVKW(*;LY$PA$).Z>S#21NF7"D'E(/AA2MDPTJ`UJJFIF`$!"Q,P$P(D`[/JT MN9N;F3DT=3DE72XOU^WV\.#PYLT;YING3[=/GMS[M;_Z%T(4.-U\XW/R]ILS M<\")&.1.)&4YKHIQ6=0QEG4YJLKXF<]^^LZG/SV?3%XL+E>7JZ;/JV5WL6A? MN5W?OG4(:_?&_+5?_E(\NH;L\+I>`.W!^=O[\M"'#I,:7W_E"P7QZ^GQ0 MW9L5Q\>'K[YR_?CHJ&E6Z_5JZ&TRY1B\:1`";MPZG,_+\:2N1W6(04+)*/K! MNRX_?W&>DU3UI*YJY\`<8A&)36T@,I;`8L*1&21.\&VS.CJ:)>NJ$7?]^O+R MQ='1X=YT5%?EM>N'TWGIE(C[@MG4MTUKB83+T:B>3B="U+3M>KO9;CJFDJED M*4*,Q(4#JN:6UNM^-(E551&;L!=E(+*^3RF+NP!PSP2P90*(+(H$L#`!8#@1 MD2L(4E:[4<[,N[(Q@_NN3&W71_')X>ZJ:@8SF+F[NK(Z)4=2F,<$*`67H"3J MTIL:R/SEFY#PS][-X(#O:E1AJNIFGE3$G7RYQME9VVP715T>[.U=N18>/EH= M7YGNO6R95IWZQ&A=_]\I>>O?NGJT>7T]M?^9_^\3_^S=]X5$W*5U_] M5%G6H0A%+&(HZZH:U[.F5?(X:-=VF<2S#8>'X>M?>^>MMSZ]7JR;33N;SCW; MV?G"7#_Z\(/39T/7X^2D.CZ:+R[.EXOF^=.VKNT+G_O,FY^ZJRE=7#PO!0?[ MXZJ,N6LOS\_*8(=[LU$50I"^[YIF#=>ZDOG>?#J=UC7-YM/9K)Y,BZ(2D<`4 MLU+;#)>KS>7YYNF3"^:PMW5RT72M@T;5 M3$()"!&IP@%W9>:NZT9U*$L1L1!CC!@T]7WN$^!PRX!3-B)GHA"8B9F,040< MA)@Y%&6(!8O\K/YVO7/7ZLS4?3?>_6>SWMTIZ\NK5JC"8:;!0,V0DXEQP6%$ M,5(,V3E9%@Y$Q"0L@8@P M/]N3B\OE6Y_]]/C@`,3RV4]-X9[5F(B8121(C+$DDIRS:E+K'C[Y^/SBQ6J] M?/KTR;;)<%>+UZX>7K]6?_&=-SEW@?SFYS\[ZFU^>`VKQ:__^N]#,)^?K+;] MMW_W][__WOOSO?&-J]>WF_79B[/-IKU]^[6CXVO;[8OM-I^=(V>3HBDD+-;) MGKDN5V<`1G5AEMRU3\W9Z>ET/CK8VQ/A&,)\-HTQ;K;+V3R:#UDU)6O;O%GU MYXOUIR+B/V#PWHT2JH2K2@%I&`MRRH60200N>8NY2'E]NJU*Y-)R<&R M;H/H?(;9O'3HN(SN`XD%848>>C6C*./1:&*&MNV7B]5B>;G=;B1@5$U510UN MI#DKS*%,(A$@)8`IAR!E$1T8+#.%E#(C$,AL@*F[QX!"8H`3$1,S4V`*83?> M&41F;F:J.T)#P,\J$F8*^.XE$9D9S,R@MNN%,"`YJ5'3:&^:J8"(AS*[)-.L M2A`F!@CN1KNW@KL9=D0'YJ;9S#RKFCF58U,WL))V/18+[?I+3F;S]YAS8866*#'935S-+J6VZ=:]-TJ%/Z[;=(&C3#FV/KLLI]:^^ M?NWMS[QR[X/W?N=;WW_MU?E8^X_OW;]R]=8']Y[_/[_QX<4*JO;%7_ISB]7J MUW_]Q?)B68^ZNZ_>GD^G13F*H6S[AH4.#T9%L3D^+)JV04Y,HMG.GI^?/GY. M@9\\?M!WS=Y\7)9#5NW:I]]\[<[= M:T7@NHIIZ,:C.)V,"#D&8:BG(3!%EB)*W_>+Q4HUC2<5J._ZIFV[MNG;SMMF M:%K/`UTL4E5B/)O'(%UNF4"L3;N)11D"%PPB=S6WI-J;]D>'LQAM-BU4^\F( MKU\]$LY,.IO410Q!F,A4-6`08N3='?5,A)>HD(B) MAYQ?-DBB3_@[N:X>A&7('[J^W_PG>6-&^.+1=?W].S9T^?/ MMO,9?O*CMN!G\^E48KB\O%38FY^^^^HK-T^?/SD[ZP#$0,UV*R[73J[,ION3 M>C2=%+.]Z?&5O1B%&3%R[CJ6?'E^H9YGXYJ8UJOET&V@VK5K2WD\J?UU\XOSG,>#@X.VZ[]X(,54?^E+[_]XL7#KN^:31Z&/`RD MQNK,7&XW3546U;@D1M)$K"EUB\5%UW4IJ^5,3"$B1(H%5U48AJ8,=//&R="M MB?+1\;[V?5%P'K(($VO3-"GE&`ORF%5SMN7JSV)51FS9F)416W)(P=3RSY8S@"B!`F!"43$.[WG)2HD M$(;T<^%I=SIG2RGM&*$9W.WG@]Y\Z"`$"1RD`DHA95%&*8HBB,0$1]=AN]K/:B7V^@GNL*9V=X^AB? MNE-\_<]]Z7#*3QY^J'W[SMNWGCY]N%TO7_GL%__Y__8;RS7*>G3_45-451XT MM9M?_J4;-V^%?_T'[;B^_.5?_N79?-YL+\]>G"X6+_[=?^>O_N&_^?[!8>$* M*,=0+9;+S793E))29[GKVI7E`3[T0\>F;;]U,X=UV^UZLS`U)D^I[]IMUVPV MFR5;2D/3M5N8!J:JC#GU]:@JBJ+M6LTZGX?@].#^`X6N-B@+W+KY^L'!<=_" M7/;F!_.]V8?WSBX6Z_V]2(':=NMN95D.0VJ;_M;M:XO+9=LT>_M[Y\^?UW5< M7JZWZW7?+8X.#\HB7IP_)\\'QP>7EY?U>%2$.F>#2Q%'GG6];"[.+\B\*HNB M".1F60-1%'8F=],\F";7).Q%B&6,R\7EE>/]Y;*]N.RO7)^',BY7ZUD]KJ0J M17(:MNM-[E%57(]K#A2(`6)""*&,D9B&(;5-`^9=$PTA%$410F`69DXI[=@( MLQ#MY"9`X0K+<+B:;;IAU:AS*.I:*0Z9MKUVR;IAR.9J;H;`LNO91*1*IM"L M*25P4+6A'X:A3\GM99ME*NID9JJFRNY%"$5`6=C!;/3PT?.ZHNUV\_K=V\'- M%.;F9AXB`'0-8C01I(S_[._]C?_X/__?@8^`)YNOCX^/CW-S`59__B)&E!%,1(S=:.L4RT5GMO[&KQ[! MV_>^]Y.JIKHNZGJT7"Y?G#^Z?3-\]-%P<%@\OQB&H2?"I`ZKU:*,`#(!S"H` MFP'&:@$*@QB@"4@F)5N"6BELGMN^ MNW-K:%:+Q9*`:@01VC:7R%;%$$OJ-DU9%MMU.T2+L=*DYV>;=KW-W@,P3SN4 M%TUV4A:BY-72!#%R`,,8<"#!4%?"`54-:]"L-]6X#B)]KR-5-S!3"&'71\U, M6%+*.SXM(@"8.(AXC!3CSVB[:C;SOM=AZ#\YMZ,U!L`<,###`#48LX*=*<2&'Y^B+\L]IU'X.8__RV]1!H)$#-C!D#`SE;`9M-R M@!F_]]Y[O_;7OQG,TB?J`'9N4]^CKK&W-[G_/,;G7A^?G3V_N#Q]]=57M\WRE5>N]MK,]EZ;SH8[GWK;T,WV M?W#[ZMYJ_>1BL>G;;55=W'WCYO'AGFJS7:?G3Q]^XU>_LES\02EQ7`V5H)[/ MRK(X/3T+(S!A-[38X?3RNS-D9M-LKC"#:BL&3:#(4'.#&00PSRP!S`$P,TML M2!ZBBZ(L@GJVP!ARPOG%"LRPDDMK6OGF-__R8E9W(XE[\TG7K"$V'8^C2.J&")J.1R&B&?JRJI>K+BK/ MRSU-S;,GY\UVF,]"%2W&$".)@"T0!\#8$6(B8A%$`"!7F,/,IG4)V+0N4AHN M+I9''*MJTG4=&T5P%!Z5D7,.#M84&'WJ`9"(F641`!($0/[DSMF.#*FFI*KY M$UP`]QTH!0!ED$,-R>$I]\I]0M*4$+D0*>N11T5*UF9UJ#&Q.?]E*E,K\7^Q-?\@%@!M`PO#/_L7_^C]_^[=_Z\D# M_:4O[KW^ZO6A6JZ'A55 M+&(0*H*490A!HGA.%H'(*"**@D5D1T]C43`S$9MY5LLYIV$8AJ'/0P@L'-W< M*;!`'4VS_M:W?W+M^NCNFW?G\VE2O;A8#$.^>N7:=ML0456.UNM-WPYF`[M< M.3F":5F6Q`"L*LJJ*@B2S9C+-B/0R"V<7:R>/%RD'M-I+"+*BJ?C.!D7HR(( M,I+EU,4*9;0B2F0/PBQ6`"(2`\$]!DYIV*Z]K&4^G37;)F:C'3N"D[J[,7,( MDOIAQXIV?91>^C/>O_0\?Z8]&4``?2+?_]QFVB'8G)$R^@&=HDV^[=$,GMP@ MA7E,8%75A)RS.',05=LQ^9^;56``2=7]_X]-S90<9`20:`"51)$I,`?F*'IX MM/_B='MXB$>/'P1S!\!L0*CJD4&F$UXM5Q?/V\-C'!W@C[_S_M%AK6GQK7^) M^?R?5G%\<;;ZX(./'SW:3"J\=@ODJGV;NLWZ\GD]/5XL,9UB,N(88Q$L1I[/ M1TR83J=EW._"L+A8K3>#^=F-J_/I?/S!!_>$UU_[VE<^^.G#NJK7J_/58E,6 M.+DZ@0]N`Q1&+R'B]/RCCYX>'TR.K]Y)7=-V'?I4UV5=5J[)S"+BLFG`HS[3V<7BZ?T7 MVPUF4TB(H[H<558&#Z00MC5Z*X051T0@'\F?P+8&4)F#$!>^NGD.Z&(86:[ M"6:,!*@C&;*A5Z#+"1U(E44S+(.9)^.C\[,5F808NB;-YGQT M>+!9M'W_[&`^.[ERV"Q6'[Y_[_3Q,^MI4F(^X^O71X+A8*]8+YZ-Z_+FE[]Z M^>!'CY]HV_=GB\UJO7E^^N3TV:-NN^RWF^>/%V4QJJM,8CI@_R!=O7+E]/39 M?+9_YXW/?>?;WUTL6I$PF]19\[@J-74OKPVP3T#,2]@B\A)LB1WFAS/;'Z@T%!!B+!:$H4A1E M$8.K`ZBK2HV;30NVT6A:`)05FN'.S,0,=_A.]=PY^"_3(:H*,!&)T.XYWWE( M*64S=;==3>\FOKN;J3O,88YNUR`"B'F`FT&)AXR#=/\+Z[,'C*P_:#=*`_6FXLG,W_M7CO8-\<.!#LN?/5\='12E`V&E\8>=39/C!P4$,T=U2 M2L:Z*]:<4M]L8\$AA&H$S3M:P*:`!$"R6DJ6]66K`C"*!WUJ4G*`P:894J"J M@\2XN-P8,)W-.%0IXX/W/_K6;__TEW[IU1B##:[:[S"6"/JF18_('*-X4H<4 M(0RJZ[95I<5FO5P,Z_7`P*@:C^IQC!R"B"`*$3AR&`F5.VR*%,DX[A1)(6(X M&(R2)02)Y60LD_%RW>7E68$02`254V6*;`#.SW60+_8 M.@'XCC81B#ER)-)80(@9')D$8",XV.%]&I=0U7X[3&<(.?<`0@A&:;TX.]S? M7V\N%Y?/BH`RXN3FX=>^\O;9^4<7IT]>O,A0[.VAGL[-/;7]G=?N-,T32*E9 MN[15[^?/[\?(J0<8=1QSK+/W\%X,S!C5<=LN^P;U%/$0Q'CZ_-$''SP[/AC; MN?R-_^@__-'[__UBA>6ZK\HPG\_'=5U*+.H08P%`<^Z'(:=T<7;)4=C0:P8L MQOB2/"*-JFHZGU;5""Y]UVU73==U*9DYDP&P(,(Q"A7$L4M9$YAC514(2'E# M"H9HKT6)NIYUO3Y_=KH_GWSFC==??U6'?MB?3OJ^OUPTW6"%X.3:[.1P_]&3 M!U?V#F(1V[;K3:?55"'-LI-R;]NL%A<#$L;38C8MRI++BBQW5<1X5):Q%H.J M]4.C@YL9!")!I`@04S9C.$1`4H`I1J[*@4(92QV#J2HY=VX M=DH&9C,!A!(PJ,I+;XM^EO'[Q*_O'&9P$(2)A`L6$HJB$W;M[ZX(,/4LY?^^H;?_$;7__4G:N/'MS[SK_^ MUN7R-!)F3HRL5R^2M?_]6BNGCW)]\OXBI$6W[XPWHL,:)K MH(.I&!B$H,A!T*=M71>S\?S9\^5\CN4E#D[V_N9?_UMX]KTG#U;(S9V[GWIQ MVE\NNY.3O;/EXO3#I3MU[;;I,H`800PU,",!J<-R@QAQ?-Q>N5*,ZE&L]K[[ M_:=GSS9EA2IB;XR3*SP93V[>O)55NUZ;MMFVO3F#(IC8E(*EU'>=5%6L1X=F M63O=N2U-2F5=W7EU#\#EQ?/M=@N@[RZGT_KHJ+YRI92`$!!BOW\THIBR.2(Z MTWZU3MD0QD^>)K/I=!J&9IGSD-)`4M1Q-)_%(A95@>!(FC3#C,$:90Q`$U(/ MS6Z6W-BLCT4$&32QA/E\O+C8#MLV#[99+J.P`9LNC2K4TSH6=+Y8%I'[G M6*1`D`P@*XO0]MNU0CV,L MQX@PL(0E6,203#.&O)-11J6IP^V M#%0",&8U'5ZIQ88@],FTC4!BYKS3!=Q,Q0R6@YL9PT#]8$"?X(QJ-Y0MH6L2 MQZC6TR>*3E9-[B&&EW%EL)FHP,V)23C"Q"61`H`I:0*`ON]=.<$`5D/NJ4MF M'F,LM=\H+#DP@"63]H.%-G6`&.#F`/)+W@4@PSF"/TE/PSX!'LPD`9_`"A*A M6+`$D]V%VHYN!,#)Q`0*&?HV1G*'*@*<29@A`.[_?*MIVGOWSB:S,*JGB\66@<;0-,]3;U^],KI^+-OC MD_#6VU??_[.+BXLE2UE4M:GU"9&QMS>_/')[8V$``"``241!5%N>GZ\`;)MV MN<7BHJE_\)WCPUL1/IWLK=>P#!%T'88!H4:(($+!*`N,)RBK`L@'!_-8,A.E ME,Q]EX91XZ9I`.P=8&^OB&9MFW.#KL-LBI3PX;W^_?_O3=NN8\2JJI#0-?UZV2:-58P=F_E+CAP)15%/I_O=^M3,%9;-H$8XM@@)78V-TM`0Y63=FM-D1I%11>ZC>.)DO<'['NHI2Z]@ MB08#!$8O'P?DG5E`,&8BWNDDZI;5-!0Q!(XA[,I41'9U;&"0@QF`&V`O8UDQ MQFZ]5=40H>H!`$.("0A$D9G[A+9%`JIZ&U&F'C>N%_?N/3P^WG_SS5M=LKMW M[W(H?_=W?J?K>F8T&VS7&F5O4E^]>/'LR9/'GW_GS1=GW_W@W@#KJ819<@]^[UM-TS3KW:R7Y=Y=QSTGYH+BXN M4\*V0]-@W>#Y"SQ_L21>'NYA/"X.#@^N7;T&H.LVFZYOFG76'"0@"A,CA%TR M-R>MJGE.J>NZKMMLMUU5Q5B&0`R+FM010UV#3-,Z#>S@HH[SF@5UL]T$8#SA MLBR;IM&L#$V`JD(M&>`PF. M%1'3+A`"H"P+-HAX&LP!4W,#@C#84K_+4NU(.!%4>`1DU@?AF3&9J00ARL#D)WO`P!J1AQ@Y,F)<@9X8&;`)(3=;1)!68Z(#!!` M`04;&P'A):S^<3@),)].P6%L_Z/Y^-9G-BZ)'1XQ/FV*=>-1T(*$-151*#5&6(,40A9H)E@ILF$7%W(G$X3!SNYNX0X9R'>E0! MWG6#?.9N)`*1`SRNIUV[O3R_.+]HR'!\/)Z/I_W0I@[/G^V&@&_:]HTWWKAQ MX_B/_^1Q&3&=!9@6!6;C^NK)C=EL>G%YWK;KF[>O'EZ9G9^=G5]B.L6DWNO: MX?V?/#D]794%YE,,/OWW[SIS^Z]_C!4U/INE;`D[V* M0XJE%5&`#$X.WWDB90D1L+@$(1(W,'&(I2.L-EO+*$=@S\/064I]WTPGXQ#% M*9ME"";3>'*UNGU[7(8.P+,7>/@X/WW6-4T3XU!6Y=Y\+Q8%$;N[[11:N&9. M@Q+%6(18%(#`F4#F%B2X!2`.*2\OF\7E8A@4Q$.OIEW?;CWC\!`WKQ[4E73] M-C!LMU+A[!!E4D,V,Q`I`T$SJ;*IYX0TI'[H)1:JE!,''FF6H3U;.P,06Z[76I$3=V(B-VY4\U._:#9P''LQ2@9NE[; M#E10ES49Y0PU2B!WAD0UWL6D/G'1&7"!(R>0$R`!L92R".6H+`K9X=$8(K,S M$4@)ME.3B)E`0`#X9:`/N_B5";EZ3D.6S[P1=QH%S"\7E^/Q^&C_P-%NEYIS M*B-+<(;]_;__=[_YS7_K[.SBQS]Y\-/W'Y]?G%Z]6FM*3!H+3.?CH8?"IN/) MMEWW>2.%C49Q;[\Y;5,_=%)4 ME\N&@=FL&L5`1($,T*;=NEM1Q6I4%*,H`B(R=3>-T69C[,\PF\`=SU_HQQ]M MCX^0<8.)A*0.VR'J0`S]92-`#/?;IO%Y3KE7,1B,I[N[7]I]P11&[BX`D1D[V!WD M@(J@*&-5Q:HLRE)"C,(.F`0/(B0&)V8+D8.4(0A39"Y`X%U`]&6PU4/@//1P M$_$`]&9@9K"4A:24ENEBN>R)<>W:_F?NWHF1'MZ__T_^R?^8$JY<&1T?SYJV M47`_]"/SJM1,1U/RSK\](,'\SF_\_FOW[Q^]Y_]T]^Y M?Q]%B1@A@G)DS8`W/HU?^_?^`FY>O?C3#^>S&<#O_>E#$&*)D^/0='E(:%N4 M(X2^YV":?Q;8`1"`S"BB1"I@UL)B')5FSH084912E-$M!8/#RDJ8U-#!..V6 M=XDDABO'!RE95@6@.FPWV^<76*[P!_]Z=1K;@8;4DR& MILM%D$HI!J%,NBV%D#YDYB3`&L3,P1 M0-P)J9:C"%1!1"_A-Y.9,R/&:M-TH8K%J)0O?H%3RB`=CZLT^':SKD=560:R M=.WJ\<'>_.'#!U&XKLNR1-_W;9\)3$Q$GOI.9'=Y(03?-&[6?.K-.\O-Z?YQ MU;5-WP\I^5>^\M6"NX_O+0VX?@NQP,U7<'"$O_QW_Q:>/?)A.Y_.AQ?W/_>Y MVTU_<7K:IVS;+4(`9"=`2@PE07;-4YA-G5`01;/=>!&B4I56FV51R69C)U=F M.@RJF4RKNC1+<$LZ#$/*K@X5EA`"([([2)D]1!_5Q?%AV%O"@0`\A4<^NOWGSU]HV]Z=3%CHX. M+RY.?6B)M6LWDUDQ&T\O+E>3<06"0YB%1-0X)U-%7=8@,9-LR+I3PH6BZ">[ MOQ0J4$D\RNI]W_76-VU_L#<584M=%608>B'/0R+W0D1B,$AV3WT>LM;59-,E M(P&%]:9OVAY>9..^S5UR1R'EV"VN-_UJV74IE:.0S-RIKNM8%'U*JAYBU,%H MM_:1%0ZB+,3"-)L4HSI69:R*(D@(XD$H"@LQ'&X*__C>[5=OO?5K?^LO_LH[%Z>/ M?_C>RAQ%A1!0[,`VL1F(`L`AE,Q""+"@:BF195=W`]2UW?CA4;5#BP(/$:J9 M6)F)V3FR"!&;&Y#4X4Z)Q&-`""0"$;Q^]YK9LAKA]=>.#H].5JMUW_='1\?5 M2(@UI5ZUER`Q!H>KYAC#;EO=-/=#M]FLFFZM.7W\X/[#AXM1A1LWCJHJJ/:! M:#2*OK/%X0!R1I]S2J::G78X3<@+`,DH64I9W4$L@#@(6KISWV,8AFW;N6-_ M;T+FJ6V+(&Z9@0@$=K#8;E%>W9YSRCD#(`812`@OMZE@SL5H7(\/(7RQ M7#U^UOSINT]_^9=>O7K]ZK/'I]>O7=TLUQ_\Y'US_4_^X=_K-X^Z]O*=+_$W M_]-_(/WI>W_RW9S2:Y__?%`+A8=^O7C^XMGIZ7*YK$JH(T:4Y4A8X`QR\D`, M\MU6&9FZZBYGZ090X*S#:H'#HTH`9@]$+&:F+&"16!`)B1"S@\#FQ!Z"E9&+ M@H*`Q(EMNUJ7D5ALM6G6RY4P1PY]VQ15W*T`.-3-U1*1$N_@*;'0D(=FVS3; M1DV%\>)R=7Z)6_>S(R,R!-QSMG# M6ML/)ZO$3L1#/@8B3NR]AO___BA91`'$+)Q55@2RG+-P3E$BQ]=7BR1*`2XQ M><]M%Y:G'1%VYF,"8O3.&,K)&M.[[*$R>HX$09`SU'J3-FWLFJYM(T##T=": MHFD;4L8GKM?M\4F[KFO?AM/-YGC93F>FJJP2+%==:+O1<+0]VYG,QIUO.7-& M0H8QUA6Z+(NR+*Q1QI(QAA11SXS((CD;8_I6Z`V5":F>>U)`=.\I.=,8B.2, M7MFG^FE!5OJ//OX;'_N/_]';G[J(W'S];W^PNS-ZQSN>NG#AW,&=_5=?#3D= M;\WGZ]-5+PM02H&(%&6%+"R^';SUQ_\,([WGGIR:?>1+,I)@][=Q;//=M,QM#7.&:T-D+,H`*25[V(^&U.H+%"426FE*2L*,:Z6 M>7O7&,!HI0%M,K)`9>C^U'Q=,$9PY+11VHJQI+409SN;E>5*:TJ2YN2$$$9HY22E+-DK;1V-N>L0$0FLY*<.>4HB5ER%D7] MT"=G=L*JZU+=-:?K(!H[VUO.4)8T,,I2+ASES%D!D*R5-C8;$JV8=.NE/HVA M`Q206:D,!4XAIF@,4DIM@YBRM6*MELPGQV(U#\NR'!@+:KU?GBR.#Y>ELU!* MD[:6K-.%L\Y9;6&(E,J:="]7[LM3(C+6YMSC1:@O$]%S):A0ZLR=TC^D.?>- M?[_`Z&VK6?_9'_^KO_SSW]_:FO[B+W[T'_]7OSX9%2\^]^S^:[?/S>=7'QBQ M#S=N'&W-7*]^)5)D21%Z!ZPFC,ERO6$6;._@M5N0=&B-J0K: M;);CL2U*\B'5Z\.CQ>S,F3T[3R?=>NO'\<_>.3UJB)D2Z<^OP MSNW3V:R((9(A8S21RED$41&4RBRI_P=066+_861D42J&5)_*]MQ91=J0!OP0K:%W:S7(8;)=&@MEB?L/283K!MD M9E+*:&NMTQJDM+!DJ-XM3$H;ZZRUI'04\<%[[H+O0FPD>N]]N]FT7=<#$309 M%@@K@2)HJ[72I#6)HL1(D9-(OV]D)42DE,X944Q@-%UJV[#L`@3SK8J(%,>! MTYF]T2`E&5`$,JP=*:O[\KD%*_R3WNGV%#*B<&5`0Z35^^L=^U*W7 M_-F_N?$[O_.77_O2__/\\\]IY.EL9K6JZUI"FLZ<,[97;Q)1?UY+S@HHB]): MVW;QY.2TKKNZYI0P*"&,J]>PV>"[+VZJP>K:`^:=UZ83^(2; M-T]>^OH7'[T^5C2X^",?WLK++">CR7B^?3%X>^-[![?O>%=`6S'&`)Q5`@3] M#7Y6.%J@]WL%3HF1LZ*8\GK-YW9+$H$2RJR(E8)D3I)%(`!I$,$JY=LD(EEE M1:QUUEJ4(=)HVZBU*JIA68R-=J0#*28BI7*,Z#K6I,>3Z7`X89;-IG7%X.RS M5MH8IY!#3%WHFFXSGE23R7!0.>.L;[M-TQH%16=`&3"GK'K19T;.I'+.+$I8 MA!4+D#,47_CW/_+1CWWLHQ_] M#R;CZ?']PZ/%:K/QS;K=K+NNVU3%P);&%K8HC"Y(:V1AR>*,/>/P*"@E;\CZ MEEWNGPTG@WPF*CT3!6;)&+Q:))@?O//_J/+T_:U.\>N5%WL`$S'F`P0CIK_]_>^8$_N/O+^ M#SSP_G]RZ8FW#\+I=UZX]?V7%J&ZXR*:$LD@4JY^,U1_@8 M.F.H,/;^P?'^;70!.UL#9!)&%D6@3$I$(L>08F(6806C0!G"X(PLF8F(24M6 MPI2BZEINVDX4=Q'3H2T+72@N2R6IHPRK8:@7)@.D)2MM2+DB"Y16FJ3K6"GL MG<=\#+_!;(JLD#@'SZMZM7__![=OO?KJ*R\_\XWG7GSAA?OW[V<.X]%@.!Y6 M566LLL.,46&F(V.(RK+, M(?7/*(#<3_!`2HDP3FM_<@2RV)E!&0/HR7@08T<*FTVX=-D-RU#7#7"[>/`# M/_+@+X"__^G_\[<>>-/T]JLK&+Q\Z\X[GG[@SLU[=__EQW?W/L%(93&^>'GV MX$,C[]<*4`*21*^[P*``,4FD/]1[K9>U`@5D=)$UM#:P))$E,S.1`"),9`BB MW>NF+T$&K!81"$$$G($((A'@SO=.%XO3JL2U-UVR=GARNFB:<.'2H&ND*$=% MJ9NFW;^[(L)L-II/YZ>KE:(>7,A9LC9PUCJMSU=VTVV:(!?VAE>N7D7DMKX_ M'*$LRQCCF93$*@*8A1,W(2F-0CMKN=>3D`CG7F9LC2!"`UH(O1S)V:'&IN\V ME+5:@_7K:F6",;US)$"3TK;21<-A/G:.BMAX.\+CC[])$;U(WV_6H`RM498( M$:W^NU?2ZFH04(>M^DG'F]2/*F?F-P>O?_;%^_&'*.5F'R:"\<'X\ MM#:G!&8E8HPAI5)*QM&J;@.+*\DYQYR,UCNSK2]^8=EXD(8`ML!\2\HR-\W& MF=0/=XSA1Q\:*:C%][]W\)VO[>9#&JD'W_[XW`THMB,8NK+0#/8IF<*RB-+D;(&LU;QT=;DZ*P3==* M2,)9Q[Q>KH_V#[.H"^>F6Y/A]0>O=VUWLEY"8SP;%>-!UJPT$5%ARE(;E04B M)*R5LL:4KB1R6H^TKIH6!\>KT]H3Z=QFK9)AWMV9G-L=;]:+MHG;NZ,L@FQZ MC*-6,):,BI2C2MX1EQJ3"H7EU>+DWIW%>HU-A[;!UC:]]8FW7[I\J=ULVK5W MIB3QPZ&!A+K=<$(UHK(JR:B$;$JE#93MEP%"*NJ-3T$Y8X=%F]5X>\L.J[IK?(S&.9!MVTWIRA2C$ABC,@?]R(/L M2I-%EL?'`V.Z3>O;3B%;Z[36623&L-G$\=C-YQ.EU'+93";#G_^9G_W/_^%_ M\9&/O'D7/W=4F-O[+SQ_ M>3;%]:=F#S[UP/96\%@IHU?O\&:-W?,XO[L=F5PQM+J2E$,,*HM2`L`'C"N76#:U"*,<*&VT:#:] M0)C(*"@%88%`9R*H*-D5KBBU,9P)R(@1'.$&0^^C"$@A,$B!#*6$T6BBK,U9 M8DJ14V1T+8Z7:3:FOOXA4I`84THQ$I2/;)4MM"Y<66ACE$DIQ92.CP^;9J.= M4T9UW699UX&]<8:#(B')+,R28B^0R))/5G6&+0>CLIHKLEW(/G*,0,K@9"AO M;573<<'<`;X:EEF$E#9*:Z.M(:VST4)*K#*%,8:RIJQU=D9E=68W[CQRRD+A M]*2^?[C@A,FD4BI,)F4Y*!4X2M)&0^F4D2GGG!51!BN`"$XIRFI@"JW):DM& M]U*<7M.<"4!.S*+48#"88T];.[,JU036HCTZP_UJ[:;TS*G2Q[1KO`ZED M#%F;B8"LVBZMUQ#!<`3CM$_,*5D-4J21D;,"D"-E!G)DMD;K`AG!@N;]_>+)L#*<;DTGTSD9FT6+ M@)6&4H#-@LR9LM%:*T6&C#:%=06T5F1?GV=3#]71UJ;$(41#9EQ-IK-I-1B7 M9F!H<'AP_^#NO>ZTSB%P:*U*TY$;#W3;'*U6AQ?VQC_VXT_K][][>GC4;C;- M>%2<+E?<(R[4&?$L_>D,!(:&NLRGDH0=W=O=&(6PLX?R%T?IP,9WO MMEZ&5Z[]Q6_]TR_]U5_[3B#FRN7+WOOSY\ZWC7_\S8^-1H/ZU`>.@X';.;\S MFHQ26BDMTYE)J1_V0"D8S<9H(M$672NWP?(4#K.!P.2N>8F1E9@WNG&TEB MB!#&9*S+05DX)R+MIFO:P`PBHY7I:QXBW=>81EEC"JW4&^T[*YT%`4A)%$A8 M:;)E5."$U\NC_?W]&R+KG_FI]__#__1C M[W[/6^OZ6/_RQ]Z=8IU"1RHWIU$36>-8$&.,D;5UY:"RA9O.IM:5BY/5K3M\ M="R*4(V,,:6VRI9\^^[Z#S[^I=__W8_?/[KYGJ=_Y+_^C=_^Q7_P,U=W1S=O M/O?BB[)<-GOGU,,/73-J\>3/_]Q$]!>^\%72PVUR?_HGWWKF&?S@QNFSS]]S MMKUY^RX1G=;-0X\\=N]@K^_<.#R=;H\3<_/AH7]UX[G&UME^5@ M8)TS*N<<.4H$"XPVQ@Z(HM88C@>%<^1T5169DR)6`"&3ZN5?.#.2J[,-G"V@ M#74-'Q]O@B=M!F6QY=N\7+;,0J1C2K:@HK1*(26V6@U*J[4225G8>DW=E0`` M(`!)1$%4>W0M%#KC"J5(*:.@.*=,R)DR1V&0SDX;8_1SS]UWA9R_N+.SNU.6 ME;9F5(VVM\X5U4`;JXW3UAE7N+(TMBS<8+GS>GI7K;4V_ZX/O?_HO_ MWD]70WSCF2]_XL__^-O?>DG]3__].T2D/EW4B^7B_JFUI(WAE&(41:BJ0555 MI%1=U\W&:XM1-=4&79M.FXW1KHD!@"M!A,ZCV2!ZQ(1WOFOG/_OE7W[J)WX* M./C;O_B7G_^;3]<+//D8+I]W.SOG5W5^ZD,__S_^^C_[QC?PY%-H-OC.BQB- M<&$/LQD>O#9X[+&'ZLWRXL6]H]5BM3JV!>WLS4LW.CAWJ!8A)DK94*"C(&:8&,!I*PUK8$C'B MX!@'=['9H"HQ&4\;C\5Q;:T=#46HHQ>(_"8#8?65W&&)7DP\/3Q1&T MP72"\7ADKV(=,1"YB\QPJE?[NG(FASUE3=H4+-)V<>#&GJ5K4MTEW^6N">LU-BW.GW,@;6W) M*%:-7]:!]'`P/7=:MXMZX[W7MK36,O4S@=)2-AJ*5#\\B2ERXL1LK252A2O* MLAQ455$X4@26>;73-`TA//3(M9_\T(^,KI][]9M?^<0G_F2].NZZIJ[KX,58 MF)LOOU*6I5\W!_=/1Z53&>P%($VDM*;-8X6J^#A"HS'M`YA MOKUE+!:+DQ0PG@_&$UHL-GN[V_MWCG[U5W^3\)L_^9/#_^AC/__K_\VOI>;P M[LVO:\6;&IWOL.@,X9&'\P6+0'Q\]]X`/O\@P`TZU1 M4=G5:G%S>7,VV?G@C[WO/":3.$CF8D3,(*"P.UC@YPOUR55@DAK%&H(60?/(=>EM] M.3!*`<1%:23+=#Z$;%:GV&Q@3/?&MCIFG5DT1`-"Z&*2B"UMZZ:),8W'@T?? M\LCCCS\RW9EG$6@;0W[=N:_/_"$>=_:/JO$Y6TQ6I_G@L-Z_N[BU?__P\'#_ MUBO"X`#O$6,4;.[^Z1_]\Y/3@U5]U#0U M*8E1M,)L6D"L&505MWZSV5@-9VWH,>N:BL%`:\W,3=,0V=.FE8S9U@C`Z6H= M(QC&.G5P<&(,AF.G@>6B!5"-1P<'QUKC\C4(X_-?W'SJTQ]_\#J>>`+O>7)P M87=V_Z!YTT/O^.2GOGCC94QG&!2XR///_J`:R^5K M.Y/)O-X<;38;K=%T]?//?N/BY9WUNCDZ2LR]>`^<$"-`8@AEB;(L+IR_/!R5 M]Q?')\NC:ECVL$*8S*0LB'4`GZ$XF!$%-D.7;G?7S::ZJC8'=U,38+6SA;76 M,'/7M:-!T70^,:H!7&$!>-\!Z#I?5=7.N1&P[CJDE&+(67NMBIA\3!Z`52BM MLU8!_(,;=Z*D.UK6J]6Z(`BZP&@CFL#,0;2``=TK7Q12!F"4BB!+)HFH),SH(A3! MZ*C($)+64#EUD4.W'E9;>WOGKEP;!N^_^48R1_=OOW*2]]= M+`^\KYF"2+16G9M7I%33=HT'8&(D]:N_M*V`U6K5-*G09*UE9A^2-C29C`'3 M-$WC6ZT-P8KY.SQ+%D`K("=*/S1Q-1#%P8_'HZY9:T+IL%A@9PN_]NMO>\?; M'OC,O_F3<_.''WGLZ5=?7;WIH;=]XYD7O_:-;S_SS/%!6%BG:0D^J4?!^L3@1P:""(D";G.UJ M%;6:;FH<+3H?`*6,*5+R75A;#?90A*T9QI,1%'_!28+]J-B2Q*DH-"KXQ1%7E3A?K^7R2F.\=;'S$[AYLZ3;K((2B,$H0 M?`+@"@-0YQ$2HMC52NJ&(UN!V]F[_.BC3SSSU2_5ZT7P:\GXP-/3G3D-G,3- MBAB%@[/.:`V.2L-:*JWBVFM`]TMR@/GL92VB!S2L+9!)A*PNJZKZR0^]_^1T M<>?6_BNW[NW?/SHZ0=<@`@QT`8U'9$`#%E87VD(;9DDQ0@N,05F:RA6N<$^_ MYSU//_WTE7>]&W#K[W[S\U_\[(WO_J#=+"J0U=R/T#QW`,A:6[IFG=J`QDL6 MJVAHVJ;9K%MML+4U;$XW/?3"&B)C4N* MG2\_E__MS\3_-G;GGS7W__H/_C5 M__;R9S[Q9Y_\JW]S<"]%A9-E^\4O?;W>I.U=?/I31_/YT8=^^LKU:UNK5$ M^T=WZE6].EEOC:;3Z50I;#:K>H.R%%M8:UWEYEWH@!A\$QG.96-0.".<%,'H M,_+4#^]"B`!BL!H,:#P5`">+Q6!<66O!XCDB93`,-/?%@PB`\1"SPNSM[5;3 M*:=XZ_8=K0GZ;(5&2@M38<`I.5?ZPM>U!Y2UI6_J5UZ]$7R(,?Z=\_D-RA,C M1B"';(PE]#4#=ZG2X(@N(/9<10U+4!8Q(F800Y$'3.A2(!]Y_<]^YP\N7J3' M'GWBW_FY'Y]M;8>H3A;-LNY^^W<_3@3KD`!;&%L6UCHB7+ZXL[L[O_;`@QP\-J'SJ0G@"),C@V&ML4I+!L>D"(/20:O(78@"P-J"SY`3X%[9 MH0E*SG)4>G:ITC@S56@?N]'8E06%9K-8@!D?^.#VAS_V"S>^\HDK5ZZ.ICO/ M/?O2\3&LP__WV;_]]!?^MBSQ[O<\]2N_]FO;X_&G/O69O_K$YQ:+5`YP>ANG MISBI,?GZ[?'0[NUM.VWOW+FW-1U;76Y/BZ[V30<1A`BCB9E!;*UUSOL(1)P% MP`FL!E39=+R)?M.*ML-I5:R.%F59E@-;EA/H*"*25.FJ5=,T363FR$B<$)!) M.TM@&`UM0$0B&20:22L()=U7Q(`;#*:(31/N+]ISI=:%!96QZ23*6>$;P0P? MN'!N>^=<495E::,7'P/!(D8BLMJ)Y!0CL@`&PI01?+=>"XP?D-ULT#:-#S'% M^#H(#!I$_8&"!`%2WPY:I2$B,2(*`2`C!$A`TR%[M(P+.R`'8TU1%!!-E@%H MK78O^KJ3SW_UN;_Y\G.C(79WSE^X<'DZV_NGO_4;&$\QN03L`A70`"<(2RR/ MUJO%O8/C_5=?^N;^W<7R<+->^Q#$1T`*:R]<&%Z_4C#S\>+X>R^>7#N/?LL- M22($E,@@[8`JB>U\4Z^Y"UG])Q\F:RTIBC'&F'R`M9B,AT)8KS==@#6PU4AR MSDG%S#^$ZGWC!.U_R)IQENWGE(M=RW%C#>9SK-9XVY-X\Q/G+!:7+E[=GCW\ M^[_WUY_Z9'CLL>EIP_?NK6=S+$Y0C;"S#;]!7<,I%`7*"N,).*.+>/J=>.BA MJ^-A^9=_^;TW/[YMS?CVJXM;-T^;#IGA'(K"10E%2;JH!+JN-XM5B@)KT8>N M&0T0D@=I[&[AW-YT7(U\4V>)PU'9A/#22YM;=X",O?/@",ZNIPR+Q$QB-33! M`M9269%S%L19`@"?43B#7'@?,S2@ZU6S.)7QG(:3<6%LT[3BXZ"_?&,P1+V% M?S@J;>F8N8V1$\>N8TZDR!4:G+L8N`$5D=%[]PFJ=UV]$0$/??#M/_/>P^<_9W2AL%4.)WOGCIHUQX3K#YY?-T?3 MK32=83BFMA.?H"V@8:RY_5KJ&BB+[U98KV\]_=Z'GWK;5JA3#!VQA`!F%!8A M@#G8$HE%8A3DX%/3($2X`MHA9X06(/3R/(XX7:V<7ETX5]A!43=<5>-K5Z6J M6HBYZ`/O7A0X1VI*SE@3,@IQ(03)2A+5"6A@I,XRUU:CPW*Y; M464R9+4VMM#.6@)B2,-J4M=UL^E\\-I8(K+6%-9UH%D6A$9;>?GSA5VH"V.C@Y3C$W3Q$X`#!W-QX4Q MY29TH>-U%[P`G"S)P%FM;;TX+K4;%\X."FUTEIB8F7VS"K9`8?M[`LG#1\_: M:P,(D&'TT.A!EXNFM5V#FS<7;;1=1!"`R(Q&18S1^\2"HD!2,`8LT<GJPOG^X*@+XZ6<,QT6J,:N1A#8I\!K4U5I;%UX_$LQ,C,P@PD M4A!$#N([//#(]OO>\\XN==_Z]C<6BU59EL,1N@:SF=[4O@V(,69.B84TM`$' M4&$(%H@Q1M)G<.U>[,/*H[]BP<;2>%HT)[[K6@ME^CY=Z^1]A*S6-20[5UAK M,K'W8;/9B&`\'&A34LHQM0DH+43`$;;4S$81C<8S02FW]C=MTA!G2(S+J4T9 M8`%#96U!KM16&9UUBM''5G)_I!5O_XFGZ[I>+!:O?O/9]683(TC!&?2ILYS0 M=4@,4M`$)I0EB%`HHZTQ+#&FIFF9VZ*`UC2?#;2U1KN.8]-UL?47YCN('&/D M3<<`+`;685!MCVS7;=HV"&`M7`FCC+QMTF^^*=_]*WU1B*O<\9X/#:E MMQ(&!6)$C!B/:7YQ+T5SX?*#=;UL-B=_\8DOA("=.7[BQW&Z6)3%6"N:C,?. MW6T\#`B`M:ZTCE-`AK76ZK$NV!:CZ7B^?W"_ZYKUVH>0C$:?*J$U;GS_V)IG M3T\7=UX+YR^A'`P+5Q760DOHENLF9`G*@J57A?=\&TV*1(CS66RK9-@"B9%% MM":R%B(,@C:Z\#%*'=>CX;`L3(R1NR09I\UZ.!P.RY)(,8RUQ(P8PZB:#@>6 M?5PL6TEPSHF2=9=*:VV2QONNV[C2CD8E([!XO%X$,X.Y5P9;K;6U6H.,:*.4 MT9HY9$F^XZ]][9D0V<K^XO"6&NM*TH`(77M>NT9EGI"#H8#8ZV5 M+.W&MQVVQL9:C52&I.N3YO`D[N^O#H\W<-,,$B51,E,PB\4&&5JA+`R1F'(@ M62*WB6$*6$6>I<[J^@SIQ2"1!D`PC$#"N[7*ZZ[NR6\0%W#N[> M^-XS.^<&?_TWGT6\4->X<'YZ_YB/[J_+P7:WJF%A"%6)"^>F#UZY/JK.+8[J M[[WRG8.#^V716T\1(HB4J\:+PT4YA-63D+'I0&;31@Q4BE&E`"B014(,/C6; MDV;M(:2(+$$T#%!85):T!2EZZ?OW]N]@>P]7KSS,T(OC_7(X%FXB@QE$((5> M`Q!\?ZEJ0'&FOION[QFKX3TRP5FRU@J#/9-@5!:+E>>(POI(6B)'C@:J+`NM M=1M\US5:FYV=[:M7KSKG%L<'H^&PU9TL3>(`LH#$F(25"%8K^+"9SJ*SKBH4 M,FG\169;^^!3"1*N9$5$7&%,5JGY.M-*T!9T>YPO#[E?`)7+P_6JU83 M[MS=?\M;WK*W=V&YVC@[.:HQV<.=VRA*V-$@^`TI],1G`,:JF,)BN9Y.IN-A M,=!EZYN"("S+0ZWU?#8^V7#3-$T,`$4Q`(GFMN,H=CKE9I,X!"(U=,0Y MKC7;BBDA%3AW?LNBR[%C$@U;55,%>]HT)\MUT_B0(,!T"R!4`YR_Y!YY\*&' M'GIH-M^#J5#-(!9ULW]G_\8KK]S>O]G=WX\Q##78GW7$,*(U"J=+8V.,@HPD MDJ4GAUF2(.2S):.UA:5L)0EBYDZQE-:RYPBQA:F&C@$?^+@.U?9#!Z=\<%0O MCDY/-]SI(9R)L)R1^G@]#0T8T="9B"Q#-TW:-+QNT#%*+53T)!6492$:3K\Q M#.RO>$Q'I2!ED2A>@L2(KO.+A=\:NPBAR,I".RR6^,(7O[)8W+R\.RMM510@ MDD)#C[3511,QJ""(TW%A'<4.RR4N[^&A1\[/+\^5B@]=OU(5=CZI+K[Y(8QV M@/D7_^!__NY++S_V^%MF,^P?8#+#E>L[+SQ[],3UHL?;BB1`&;!28C7NWEMM MC:DJ[-:HFHRK%+NF/H68]7K=!+0=2"$R.K^)<1,37&DVZX0,K0D"82)C.?JH MH9@]D64&`TJ(3%9]E":R0!'Z![1O(*TRX%`092NQ"^2@7T^5)3(`"PPAGT4E MZMPTK3:(48RFI*B+*72HZ_#\=X*U,!;6HJH`CB%*W:*83-A[LB@!8U2?[&EU M:<7X+C6QK3?=\L1W`_*@;E9A.87X:^'O`$J@P*2Y> MPL7W`G@9_@^_\,E/O?"-Y^O%B4TRG8UB%Q:+T%E_^<+4^QJ`-D:=P5"YGXTG MY9DL409$2)"2HDP0*+8%":L4BKYNNG6P6\\&"`%"VCK`'0I]MC]GHX2'87?/5:,!NG"R`&?,=R\]^=1C-Y[_JK6VK#`<%X-1R\H0P!H* M\967933V5Z[Y]SR],Y_/Q^7HYOX=OVX`_N8SS]ZY?30J<>7*EB;:VAKO;.^% M#D?W3][USH>AAY_^ZV]][SM'6^/72:V@G$F0M=%%0487A-9:V[:^;;TDEBS< M`1;&%"IZHZ`UJE%AC8TI=VV[;E.,*"P*5YR%&UD;-25FK824ZL=MI%/.Q!!M MSE14O4_^K!0"C-'>>VLM$)LF9)'A:,HI]0_EV6T(W>>Z$*'OG/HZE[2),<8( M;7#I,D)`?8JZ1O`83T0[E`-TB8,7:S&;(J4LK2>+=>#IT$UJ/IUD.//OKHT^_$ MX+$?_7OON[[S?[SP[/,OO?3=DY.U4;`6R#@Z6@V,48K0&Z,36*+T/U`3M((F M6`65D17Z3!AE$@N@#&L26$!OHL34[>_?;R)B7^B3Z?>J\L;,M.]%`:/($2S! M@/3>Q0N#3;.PBU6S]E[J("*!&2D!),;T>DTH"P.HOCW(8A42J(LLB3E(C'+E M^B4DW[2=+NC"7E'7[5>_].W/=:MWO_5Y@24M/V MN7X@ZZGJHZ!LX3(0"C-PA8LQD:+T>I$C621G)!`)`WU&F^*>1WSVF/;GJ$C6 MFF)*I2M(4;ULB=)8J9@S!-3S'/`&)@XB61%Z.FY1D+966%.)JAIO[UWBB7"WJ&.`(HQ&EE(2E'[4TP:^:3=NDP""+RF*^,[QT>?O\ MQZ+G[G.R^N&\QW"B,X7G@S)4O2Y[N(2I*#")%-`XUT%CX+"/JM MCM8`$2=)&:8<.C?:=/'P<'%PM&X]>I(S:0.R(H@Q=QP!RJ3?<#894DJ3%E"6 M_,";'O5,(F)=,9V,I[/9<#3JX5)1V`-_* MN")#>/"!Z6./7#\\NG-X]^"U>R<^[HS&]MZ].];8[:WQE0M[UZ]=;IK-<]_Z MEB9CE9"BX7"4Y>`+7_CZU>M7'W[DL5=NO*KZ*[:?NB$*@40[LH&E<@-,I@H- M1+K.BT";@5)A[34YGR&9FEJR,ADBFW+-M14%^YN<^W#1-UT;?<5TW M=_>/]N\?-1M9=[$LJ^G6CAN,NC;V.8Z^8WU&E,7V9&X(NAQJ"VL'1XO%&5Q_\/JUZ^??\Y/ONO''@8#E?01<_T&"B83`1! MS,*1M;$"$"R30,00+)$5D03UK_[U7VXZ\:UO.KP1[ICH==Y=84;3\7RRM;VW MN[,U'PW+:]<>'8[LSGP^GHUG6UM;V]O;\W/0MH;USV[;8TAJ[U?1(+4U& MEK@X.9R.JZW9=#09[^\?C0;%]M:\KNO2%IPZ#$H0H?-F%.]:JVU1\M58O3LI1@! M)&VLT?V-3'TY`4`2M/VW4@S?D"Z(2";D+%I3?[*6)3BA[3JC=9_J*?)O)=20 MDC_\@T^6`XS'Q:B::EV0(FOM_\_6FP59DIWW??_SG7,R\^;=ZMZZ5=5+=??T M=,_T-'HP@\9@9BB`0X!8"9`F&80I<1%-R@HI'+9$VT&+#+_YQ99LR>%P2%Y" MLH*+N`9-BHLH$B!`#DB"&&``##"8#3V]=W555]6MN^6]F7FV[_@AJT>DPO5T M'ZLJ3YY[SO?]O]\OLMG960S77'<@E4RREG1.6F.\"\%[X4$,K;4UJWXG(;AE M:6IGG4-M("7R'.?.G;EX\9&MDX-_^\N_LG/_7E7@J:>PL=X#X"N@+5JJ5U=^ M,IW5=9VFNOS7_UFNOG=S8RK*LW^OO/3@P)FYLC,KEKO4F>%92 M9HIB5)"^,6HT)W'_SJL*BMRJKSHIY,0<#688DQ7#8'VT.0'9___Z-M^Y)C=$(62LYV%\L%NCE MV-P\<7@PR?/VQF#HG2OK^7(Z+2LL*UR\!@*'2*JAL3%19"IK9R`1-10$2RU90$<92]N,5Z2) ME)`JD4S0(.X-.F`/!)624II(6!N,,7G:T:#(CF2KFRO;F0>'Q=RZK3Q).C67 MAP='.DLW1B=U(I?C.;OA$^__Z/I&NZK'TYG=WCY][^[M8CG.$H#Q^!/GM-)? M_.*7O_S2O-/%E2O]G_F9_VQG9V=GY]ZI4_VR*EY]]?[1(:BA0C0%RX<=,,&0 MA,G![GQEJB72!&N#-EC-YZO)9-5>4R!?EJ8HC/-H[G]$$)J.#01$',&.`>,L MLA3'J@\\'#7QQQHN9O]P$U7'^PB#B!.=V;KVWN=Y7E>FMN`8)8GFVD0D!&0X M;B?S[NZTW:804,S9,+2B!JM1ED!D%B9-L=;/I)+.NZJJLXR4YSQ%JK0#LBRS M55B:U<$A\AQI@JR-+&M%=KN[NP\>W$U3;&SU\SQ=+HM62VUN=?.DZRP]?OF, MJ]Q\OBK+N0LN:R6MW*\%6DT72I'6;(S)6MU>=[1<+8\FBTZG'0)L@`L(HE$Y M1B6%9"V:;2H"K#@2H!E:ZG0Z*7?'\VE1"ZT[_9[Q*(I9)T\$8O0.2H,-8B"P M`IP/@.0`!@LF\?=^<#--LFE1[DU6*Y?7+.$11%`Z2U.I=48B3F=%@),BT2EQ MH-(L*4J=4$>F(`\X(2.`2$(3"6AB2J30$HI<`BNUR[73NOKH"V>5K(OEG(BR M+-O=F0*X^NS3WW[KK?&1N7AQ)*5ZY;4''_C`A54YOW%C_+$7WON[O_?U[WC^ M[$<^^4EL7@;:P!;\5S_WR[^^M_=@M5RN#48G-[8`[.SL[#V83L:0#*CC)V0" MZA+&`0P;,)UAT.\52S<95QLG3Q2K*>`8S`P"F(Z+1TJJA_UOU;"UF&,=;-,] M[W:@=1*\Y0BMB01Q]'G>BFC@X;[1;RH)H66,Q`*(DCE&Q\::LF1K<.GBZ=5J M:4PEE=0"(800K)"H`X;#M-\=AH#]_:/]/;M8(3(2#:U1UP`PVAAHK:?3V6IE M`V,XQ/IFK]_56>85QZI!%?#YZY_[/_[@=S\W'"I7Y^!DM:KN[Z\" M<';[I$STC9MWE41S?\\T!GWT>^U$@6L'PYTTAY0!Y%@[B-+&PCCH[-O7[]_= M00"2#"[",5)"KM%MI5IE2U-;ZXSCND9904E`09`*WH<`>?7QMH]R95Q1NI45 ME8W&.6>]]]X'MM99XZ(0D4%$DI0'A\",**%`DB($12$H2@@B8BF$2%2BB32@ M1!3P"EX(+T1(4`O!)[8V=*+OW!D;BW==.?GDE4MOOO'FUHF^UGJY7+;:8;:8 M=+JMK1/]&]??'J[A]NWY@_WKBYV;U<&-@^M_^4O_ZI>F1T?CL1D?Q>5RI;5[ M]]-/OO"W?^K]G_JYC_RG'_S`$X/*'A7+15%@N4"B,!R2DE(`1].X+,RR].U^ MZ_''+@\'HQLW[]?5L6U'-LB=9HJDX2KZT"1H8V1&;%(^B8:4,G*,B`W2-0): MIV".B$VB0TI)4C2&3D%"0$*`0!QCC"%&Y%G2A-\`0<<#KC$B*HW!8*W;Z2=) M.AR.+EYXY)%'3FQL=)VK^]U>DI*40JMQLWL M#!"QMH:MK9',U'(U*\ME(H2I2I*2F151M],[<^;LI8]^&OHG@?_O:X>'JRM./WMVY69IZ=O\H4[AT^?$'A]<(^LLO?>NEKZ+;Q>4GU6`P?.'# M3S[]S'-87S?7W_KLY_[X7_[K/WBP@Q_[D<>>O_K,]__7/XW@[[WXXF<_^YD; M-[!<<9+QZ>U1VG$WKL^+)0;KY!L9AE.7J7SXNT-=S:-.5!X8Q2U.OWRC+4=1V89)K[HI(` M!]!QL8(AB23FQ;[UOK^69/U\,I]3Q!.73[_PH8^D3UP%4F`$#`$`4V`%",`! M\6&VT\/7X>#@P='T&]_X!LE4RBQ$84JG7"3CV03$R#K1`C`I(1$?*J2`P&#+,D@B12&12+7,,I%IL;M;#=>0)G.9&"EQ M\^:U5IX'[YW%K9LW[MU]X!QD%'FK1\3;CZR_^O4C)6].)W`7\`]_[K_[AX/O M!`B8`0IV=WKSYOZK;RR7\RW??_4-[MWY'(A($FQOMQ][ M_+'-DUO,L:[K$/R77_YJ9-O M`[!-Z24$Q:+18X&8WKG(%X7)6[F4*7.#@=8`8D#>`D$)H?,\S=+SOXD.5K7_G:JWN?>ZE8_-KUMQ?]+KK]EM1N>WOC[/;FF:U3Q>'"KDH@ ME4EB7;E8UI1":PU.`EG!<`'FH;F=&5!>9I`).[^OOK[:/HMNIC[P@1=/X.B-S_[1G[SRZNN+I6MEK8W-+6N,B.ADJ93> MF;*N5^S,]WWB8ZY>C?OOV[O_[6U^>3G#IRDF@ M^XW7KN_N<;]/[-@::(VU08^T7!1%57H`[6[JG'..(R-)*9P"* MHB@*#@YYKDYL;6UN])TO#X[N&L?]#EJ,+,/V^=,;)[?F\^7),Q?N[AQ"YP]V MIN<[7K:W]GU,9.M[OBH/AS/(?.\UYY. M%X@F.J\D!GVVAW.SKO#`:CM=%F:>M5799+ZT+=5/7S MI)WG.0(WF5=(H:326B=I2R=IGG<=@Z,.3&"MF*.-(32[ID-3$P&@I!)-D!`0 M0C2XZ*8$K:1LD*U`JD@2N8_^BN?.7U>/?-,YWWO>_;B MA:?^MW_ZOW_UY;?N/MC/DGZWMY5W=99UBJ)@UIKDLHP13C"U]%IOH#_SF<^L M==OO>OSBI[[WD[N[=U]YY5MOOO5&C.[)IYZY\\S.M;?W#@[WDL2>/;_M_,[N M`^YF*,OF.V&A,PJ!N]UT;6VP?WAP'#<%(G,('LXU94C'U@L3&V=)9M=O[;SR]:\:OW2`#3B< MS%2666L#(%MMJ0'=4$FTE-)[Z=@WC0EF"A`*6F8Z%]5RA<-][.PL#9;./5A5 MV#I-=H:E4%=H[2('JJQP#L7(&2:9*II M/Z.)LSVL2".(X_Y*4(*5UE`$IS2T@A"(%)G`@J&E`(+60DMHD"0G!92"U)22 M7$Q7:\-NUFK?O7/_M3_[PI/_R8`_PYNX77_RS+WQQ.,333SWC M4'_VLW_Z!?&5N@)B&EQZ9W]Z_M&1I&S_<-GOK8G(D6.Y*JIE+:(;#3JJGY\_ M_]C-:V]_X<^^^9ZKTRN7SN??\>Y77GW]Q1??OG'K[N;)LR]\U_-_]/DOC8^. MWOD)/SQ MWP*&"Y`*@\%@[V!R]LR9H-*BMO/%\E.?^EM'L^)@/"DJ`Q'7UD]Y[.Z/%UNG MDJ;6*2.(A-):4(@KI`*%$%&!!FC@`FHCA&FF&$K%AJZ1: M)XH&H_6]O7O;Y]:VMT]]ZRGO M*%."9>6`6_=O__"/_,2E9_\&Q(>!Q_[ZTW\`_/G7/_^[7_G2%[_UYK5^IK:W M-I.4[MS;N7OO[M:)]JGMT7`C7+MV=/[Q[*FGGCX<%Y__T]?N7']59_VK3U[< MN3PY$ M&I(4"=;$1$H(`![4E+4B(B,0OV.%;>?99[$ M"H0DR;K=?C?/.-0)R!,G&NM==>[,N?/G+MVZ^V>SH\)@U[NHL3V?3:5E6;%A)F5%(4HZDJT6P M!J[IYNM4GC^;&ZM8M(+L^*A$HDEKE:1*)8*D5)J55#JWCFOKG8]1R"AD8.&% M<_5RIU>5 M5;FVWIO-S*./;;[KRKL$Y,T;-ZNR6LU-9"")/_TS__E'?N@71J?_/L3[@/7_ M>(-"![AR\M$?>M]W_=0'O^]#1]=O/]A=SA;SK)U!FJ5U)JPBN=-GMMYXX\8K M7_OZ<+A^[L3ZX<&.6\Y.;:VGW;7KMW>.)J@9>P=8++&V@?Y&?[I8-?R`5$%* M*>"TDGFFZ[KV/C23(4($DD)#!.=5,RWK8V0&<],X2(@DB*,3B!Q"Y,`AR,B2 MH"1F4R0J#'I=8^H00I)0;2,"\C19%69\M+*KZ>[>_:/Q86_0K:IZ_\%42:^T M/C@,&T.Z=/%BM5SE`3(PHL]TDB:9<3P=+Z9'2!36^MU!K^^JU>'NO:W1\.A@ M=6*@$I4_V!M7M5_.[')IUGKKLW'A;;AWZ]:[+S_AJHJ=[V6=_9W=Z&C8:G_J MN]]OB_TTE9Y-##5I[.]5PT$V/UHH2/(!#BV-82>VT@`;,I752UZ6UCJPB%%` M)EJFBCEZZTQPP04A):!\8&-=M5SYX"FX&`+[@,#11V="HE7E@G6`5EXE\OS9 MK'1P0@NE(J-1(30<<\%11%"(U)RG`$GBV'LD!`37T3)L,XN?*9$FHBVCHA#] M*I-QV,KZ+=5.I4:`M\$Y8Y9K@ZZ4<;:8>C:DM'5^69GU49=T4J_LT>SH:'S$ MX'<]\=AW?^3YC_WX?ZG;+P#G@`8V(/'_\V,!"63`A<>?^ZGWO:MZZ>4O/!@O M781WD!J=;B<$6=;&VQ@Y-!ND=V91%$+W]P_G+,/[W__NO_=?_,T?^_&/GCAS M\L'^X7PZ:U)(0I$20H`E2:5H,K$A-((%2*$D"4@DBB(S!*(``0W-CRB)$1'! MQT@A,DAR8PJ"BTAE6KJ09TC:&?O@A=ED"0JQI!GM+&QD>89TMG>BJ6/IR)7S@""F%3A*2RME0VZ`(SGJ`M2*M4=7S$R-U M-'U5%;.?+!?G'CG[[+//6FN.C@YNW[KM?<7!=MNM5B;GTPE[=_;,9D_Q MWL[=LJZ+,O@8;]WB,^=:W>[P:'].2$4D1:&78VU-)0D'1B);IN*J]H%CTX@* M'`(C.`Y"@(602LH4LBG;D>/@8N!('&,D*0+[X^&X:$TT!);*LY+GSE'E*B^C M5%#!ZNAE=!I>14=L970R6AE,*K@C8QJ]CE[Y.H5+94@$YQ3RZ+-09M&VV'>$ M;\MPZ?1)99;5T4%8S7**W4SEB@0X1IFDG=K6TZ*LK?4^UJ8NK>_W^D6UFDXF M1_-5WL9C[[KPPG<^/[CR.'`$**`/,%`"#M#`.SS_XRHD,`5FP`1PZ#_V_,>O M;JW-7G_C]FJ!1"=E&:)((*1W7*YJE63=;M]8OGU[U>KU!J--!M^X/W@8*K3Q,?07'I($C5".D6[#QPI9#E)+8.'=9XC2*H`$<$1(!"$ MA`2B!`G#/H(8`J0B1"056;"`3O+:&ZE()9JY47&H*'S:2DDK'P,IE;9:E34' MX^GN[J(LH;(P6\!'/')^O=OOS>;S&#@:%T44`J1TDF2`K'VHO4-$"$$(I)J2 M3.[NSL\^NK%WN%S5Q@OTUD.K):]>O7SZ`\^H$;U]\PQJ5Y[N#S3F?WP'SWA[\KS==O7;\G*`%(:K2[LMUK21V] M#T*T5R:4M3$1#C!-OS2*P!18<"0A9!04A>0`&[AB:5DZ+ZP0,0A'$1R983@& M-%T/LC[(TZ>I"BQ(2ZED8'T,0(3B2)$E(L$)#EHB4U**&(.+P2L1)$4-+]AK MKH6O9?!MBMV6[&=ZO+?33>3VUM9:-W.FK.8+)42GVTVZ_?'TJ"CJ=CL#Y-Z# M8E[R6C^M7.V=,\&WVW3EZ@Y*JRSO5)4?SU;%TNI6RUNS7)6) M)JETK]-Z[-+C1T>3B$""I)92R@:M*Y2NG>FMT?K:(,M:/@3C/,>HI/0A#Z&$KCZ]H;AW8W35-- MBO.6K.Q2T!(2HW7D;1#QT21$N7IL:[@VZEV\>#ZJXNWKL^MW0E7-SS^Z=N+T MZ,&#G:/Q[NS!U%N;MCN'D\5X8/)6$F)!*1*2F4<(0:'R@8`@PB(/7B28E(40,+L8@A)!$9;60PB52MI1* M268:J51:BG:>(;`Q-07*.YVU_D"GN0N12>R.QQ%Q.!IY]D=3HR2&H[;UGH7K MK[6?N/+(U6>N)%M;0$0H0$/@/<#'@$<>+LT9,`/F#WMW"DB!%M`&"'@#^%/@ M;4`.\O7@]'1J=G8/0Q`J46FN5"H#8FV<#Y2F:5T&1('`O4ZKW<[W=HN[]^QJ M>2!5X^HDI4@VXA:"%)1EI&P*"MUN=WW4&ZWKX:@W MGZVV-O#H(^=GQ6)5+-,TM67521.M2$H9!0#/"#:XP+Q8H->7,=928_N1C4=#CKM8^^/#S!V94PME5S?W'C\A8]_XM,?_J&__;<^_M%W2X']O=W= MG?OMK!4\$ZDT;=W:F>_NX]39]L'^[.:M79VTP/"!I0Z=+&FWM93L8ZPJ7I7> M^N"%C$*R$(A*2!T\C`]U[6L;:E,[!QN\YV@$+(O@P4(`[".S1^!(B@`5`HSU MWD7%K)5,A,A#"$P(1((]$3F`(53CCM"I!06&9`Y"\D-^H)(JR]).UI**X(/U M9ED;8W#N[+8M"QL<\G9W?:@4S2?3P]F19:L%#_I]X=E5]6B-UM9RYYB$)\+6 M1N_RY'W?.H#'__QGP2>`Q20`7>!NNE%=?KMYY]_IEK%UU\[D*CFDK7*\XYVKBSF M14KYUHF-;[]Q0]*RT^_D[<[AX61Z!/;H=E4([(^CM?(XE\=@Z0!RH;)+[0`RXEAB=DQN\80$%)B)WL$V<6`B8L\L$`@$=H&(HD?-Z.6`!#M/N@$B(M,R M('ICM.YOC4;&VSS/X5V[TS'5:O?N_<%:>V,XO#.=>JUU,[#+#F#2,D\E!3YT M7!8V>.29V=K:>/;J$S>OO>$=Y@LPHY]CMYE>0,82Z MJIUCYQ\"0EA&!D,8XVSPQN)8GDU6D(($"4W$,AY'RP@<`H.1)AI1`3XR2$`^ MLME/54^+O/;P1(&45S(H'80*0K(@#PE)02@7V4,XHD#""1$$I-8BD4)(ZZV/ M+%726NL-1IOW]A^MW[JS-YD^NJW;]S;GYA@@C.];MP%:R>M/%'C_;I:V6Y7MM.64I44*%?<3B-'$,5$ M2RE`'`A14@S6>FM,51NS8NL0`[SG$,`!B$)$1%!L9IY("!8(`!.'$(+P8`01 M`L<`[Y16MO3,&/24D'"5%S*V,X"0)RI$;U8QR9`I.5M,!VM]I2AX.Y].;.T[ M>2))!&=:0B@AA+"(E@0+&26!$)>K:&M$1K<53YULGSNSN;Z>CP_O#SN)68;) M(5SMZY69'SE7V55ABUEE*S$^F(X/%[??OGOWQH&(RE9^,:NKRAQ-2A9X[KGW M.!\.#P_KN@[>"0Y)PFO=;#!,6ID,H>+:KRIG370>440(X7SPGGV(=>V\0[/@ MM$*N*5&*2*2*"$'!*]A$!!FB"(@!6DD(&0)9%BP2^>B);I:T""AM'1,$':*( M$%$(9E@0L[!*$L<0HV>P$`$4(VR(H:Y6IC:K55G5AJ+9.+%QZ?%+EZX\_CT? M_P1D_,9KKW[EY:_>W=V+,4")P%6_@RS%8*@SP:8TJ8RM5!I;]OO9,\\^?>;\ M([ZV,FID9P#[]E>O_:-_]&LW;@>==GJC#1;=HT4P3J2=-=(*)*%D?[CA!/WY M%U[_I5_YO6O?_->?^,$!L`5<`@X7UZ_E+=7KZ7*Y>/OM?680FF.>CPR!"*X> M.7GAZ,%!L43TQMEJ^[=/7JXS=NW)$,+9"(J`!$+R)+04H@B1:$:$QLI2))U/3HJ)VFIJZG!P<`VG&)I!$%B*6`M?6JF-7%O';6 MR>@OGAN\^_(CG_J>%W[L1W_PTY_^@[-TM%F/AZW:N)3D.598A3W#Z!!#K8FY2C58.;RM%N/K4$Y'K;M[3[6&U M]'KMO?_J?_S'_^R?OC1>P(2NBZ*.H18^:A=D78E9>Q!7?EJX26GG3MAV+PV" M;MXH_N(S?_$#'SQ!_2>`!9;WC)V4U9&409-[Z4M5MX71L#<[,D)`$SHYV"6+ MR6(Y1;^#2#@\J((KE\4B%:B=K590*K9SG24R$^O`.$ M<_9H>71XY=)E6Y316_B094A5,IWXV02M%D+-)&._EP1GJQ(D0'##H?*!2>&Q MQS??\YZK=V[=>_.-:P_V8K\/4X,BE,:)=0EVB\E1C'9\R.4J\C%(D5RCQ(Z1 MF:HJ*D*FH84B"M$[#HY"8!-2YHS03M!)T%*)D@$$*9+]@S+-\YWQ8OWD6=7. M;0C[KK9!P7$#X#U6GJ4IM7*EI$S2UG`XV#ZQ??KTB1,G3VZ?WCY[]LQ@-/C6 MRR_M[=R[>>W-W_^-+TXFDQ"\!*14;NF56P8'`"WAA28'9!)GSJ+;AK/(,N1: M":((*Q)L;`U)2BG3PYV#3O_L;_SS_^7%%X_>?`/]4YV:-!"9/`M'LM'686QG M`0:2:F9EM"!-46M1O?A9_/3?_Y7_\[SB4;G` M8N[[W5[6";59[>_S^5-)O[^N]%$=D*5IGAL?F$MWYNS9WJB>'8S'1XO)OLDR M:(U]]_1[KCZW*MS.[JWE"LR8S4",X1;Z?7", M.SNKHL")(;3&;`'1D%*@F6,,<-8[CTZ>:JVUUI*X0=H$-I)YO0\TW#M&#/#! M-V?[CW>'^LE0_\7<^.1J<5"I9'XU(,$E6.DG3A(BJJEXLYLOE MLBQ+YVQ9E`_NO_TG+WW^\'"Z6L)'G-Z"%A`$*6F4$:`DF-EO;$))59?>!Z02 MQG(H`4:FU:KVY0)@2$)P%L!:F^;S^6`XW#^<&Y/6#K_P\Z]QP&@+%>4>*L)X MX:+T0E5$(,$,4`K!(*P\GA6IJW?OW;MUZV8`6EE+4G+KUCQX9"T,AZTT22IG@W5*RR2C\#`4(L3Q8F1F M$PP)0E0`2.C`:)2-J\J2TAZ^=EPYRI`Z=LX%2E(O8T#FV+G@2D-+0\[1A0M/ M3B:3H\FDKNH0.(1@C.<`\B""EI`*4B.1:#`MT\+EG:T15DNW6*U0&Y2UGLW, MU[[Q]>__H1]X[L,O_.HO_N)77UX-AQAM(>]B/D>:(F\U<\^H2Z\!5OC)O_L) MG;?NW#UZZ4M?N_;62FMT.O`!MFJ*Q.FJ=N,Y0@VWIFP@EB`DD.2B"*P,>\/! M!7G+OTY&3O M4/W^'_YA"%BML-XC%=F5J.IC6J=(CGE7UD)IM#)(`0!9E@RZ29:GTX,CG2/+ MVE+*Z$)9K5P%YZ`4DL1'!V["DP%9AN&(VOU3Q7+"LDR3%I+$+>=9"]W1IB.I M.VOW[T_Z_9._^=M_FB! M31('_^L_OWGYO6]N7^B,9[N4CZ[M3%"-AEL7D)G),GHM0TDG\SYI;='OCC;R MX>1@5]0]=133^@D M'P[[G4Y[/#YZ\_JUN9FW2#N`F6)D%I#ZV.O&C#P?-"%I/!SH;5IE(I>RTP>6 MSLTLM0TZ@7P9N=_-0["6$D=U%275S(6WILXZZ=S@:,E%4360B.@0''HY$9.7 M/H6"X"@TE(+(RI6'U*"ASFJN[>$$@_]],_MOG- M5U_]\DLO>6?S(3C">CB'=A=//?KHU?=>O?#8Y6MW[GSMU;=>^^:;\ZG1O5;P MF)<&X.U'UO-V[ERE$]H^QYGNY-G:C>OW''L7573L&"8(9\DQ19;#DR>E1BH) MQ,([A]I'!-#Z^B#ZRGLXYV-0)L`&<@;G+S^R=&$X.M4?;0YF"]7J#[Q#Z>8V MMCI9EB4N#P_KX\[5M7/.;VQMDB"6POG@G"M=6!F(TJ^/'O$AS)QQI:,@M!ZU M1VF2IH?[]W6:,=7..>,X6/3[K;1_:E*FJS*4(0LBK6H4R^D@::7Y<%:%,)ZL MHMR]=?^7?_,MM&#B>CG7NJM!`9PTG#&R3#(*+P"8$-@%%:46DJ$87+@JUM76 M<'AV-/Z-W_GB/_YG_^"+7WOSRI5+\^KFL'5.TX:C@\*67;E%VI9&EK8FP.=Y M)=/&#'_N!)Y^=OOCBB]?O3HIZ M3TK5ZW8Y.,3>I^A2S'K+YY\?'3,\_7[W]M.!QN M;V]_UR=^)$W2X7"CF735.B$AIK/9G=MWOOKZBV_),LR)='NZ2S+BJ7;W-IZ^\Z] M_?U]D/3.R2272H['8X20)FF[E=2FC*:^?/GR<\^_?W?GX-JM.SL[.R$$*:5Q M;E4N2FN&O7X`A&((4DHV3@O'(CIUV^^R%[RS+8CPO]O?W9X=3XYQ. MO'R1]3"N:KNHZ"LTK1:6@1(M6 M)#C6<(3(P0@M,YU"DI-P1#:%\QK#[>%D8F?&=C?QYLWR>S[YL6^_]OI@--HX MJ8=KVQ_]V/#N[?W5JDS2-$V2[>U3"U?W^OWI=.YB<"PBQW:G7Y;E<-BKZSJ8 M,ECO@XW>:JVS+/O1O_/,T;18S.=:ZVX_%U(NYO/Q8J8%>T`I!2F:[+-Q=>W< M9#(!($B2T&@FEJDQYAB.L2H+I75_K1VC,\:FJ5:9+,LRU5I*6=`50RH%P#FW-=S28"E<2T-J:)**4B`-1D26H);0,K);VE7MJL"E M))ME>C8MIK/IYL;FB9,GHG7+Y6H^G_?[_6ZW*Y4T56VL88Y1)UXJ4(:0!*=2 MT4W2-+JE,3-0E>D0V75ZW6H1RH+S;'-\-$[7)%,@9!Z2A`)I(BV$/CK:%_#! M6W9E72]-702VCN2XX"J`*[NHR]G*15>YJF)7=5KI^L;PS>LW#B83[YW8/'-Z M;7VCT^H--]:&P^'91\\_^>XGSYX[U\ISY^*J+H/CWOJ&5JU6.V]WVEE+M``- M2*`%1*!XV%:W`?5J49;EP=Y>O5K,IF,.!L!D,JGK>M3-VY+=:CZ?S*PKX(IY ML2=UN7UF6-:3\QOF@JV6T)FTX&EA!ETU+_QSS[_K<'_<;G=V]P\09;&H>[WA M_H-9=#SLCR;[DR3/%V$N$\D1@[4!2T'0W5YO/![79MEMY:G4/CABI[4^'D&0 MF=9:D`[>,"%-4D'"YWDK3_-,*LG3^`@&&.L MM>UNJ]OMSN>3HBCR/(\<2UOE22=)I346@(2HZ[J5Y[UNMYUESM76!F;GG#.E MZV4Y`B/6SALXRR'`@0-"D'G6#8*651F959X&N%4YR?/,&0-@;3`@(>[>NQ5F6Q7(U.9H41>&<*8M9=,:XLBS+LEHYY[1@I>1JO$]YJK4,KO9U M#7;06FGMB[K5:F>:K"W86:TA`JQ!EF&ZQ-DSHRBP*!?]T5"EHJIJ!.ZV\D3I MY6JE=5841=[*?_AO_O"/_NB/_NS/_NR++_[%J5/K6:Z=,RV=VE#5U2I-TWII MG.,L[4J9UH$A-5JZF)>.D:>=#`DJ2"19WEIA-9Y/ML^>L-:65=WNM%=%D20) MA7@<7"!^)VD/@!)IV#K'_Q]5;Q9C:W;=]_WWVM,WG.],-=VI[^V9\RA2%!6: MM"1;MF/8CI3D(4Y@)`^!`R$V_)(@@#,8B/T2($[RE#PD,(P@1HP(:^?AJR;M0J%05:A3A8/:9^V] MU_#[,??C'+W6FJQN]H=18SPV[1.I,=7"P0`:*808A8?186`=<=CJ*T+X?Z]E_?[%J*K6:&UWFZW77?06A.)G`:H0%MUS5-;S6*(A^'!T=.2&(& MHM9>6]L%$%FE"ZVM,YDQE@R3#M9"Z>"]JZJ%RRK")/2@KEUF@S6]5A96DS6* M;`*8<')RLKI\QM(OETM#M-MN%='RY*CM@R*R"!IBN),P=,T^=,VS9T_S:M9% M>G*]W>Y[A;N?!#,"(P1D'F%`Z*`-K`$9A(`A8'Z,OD>"RS+GN\AH1VV"+U1I-B'($?SLZO-]NSL MN.FV@D.0.J$)2&'0*A(0$\+1\7$,O:;T\[_P"VW3O/W.._O=[O+ITZMKN7=W M>GQ\_.Y[[V999D"A"U56=5U0RFZ:@UACJR(P0#:SA1>+@2F04L(9/=M?'1T? M-\VNZ[I).>D/3999L`*QA068E`4BD8V*?6$ER:BP2I+D7X+I&6VTT3]>T%IK M:S)`QPCF(:6@M"1AX3Z$;E9FD3D%9D8(05B5Y62Q6#S\T>-Q9,3EV=U;MZM% MM7IZ_=;;;XJ(L8@5ED66X+8ZVKJDIK/?%964ZR++-.+^>+V:RT-M,:1FLS)B>(K+5>6^=="@@1 M_1!""$/?A=2SM.4B[X>6F1.KR+3;]^NG3;?;\/H9I(W,C#1P[#GT`N8!T-OM M*HFJJFEF;-_W1NNJFC9M0TIL"I!.<^1P`,<8L5Q.[&3117M^75_O@S%E(E@@ M`U@9$&4D4Q$1$4JP/LNT)65#U(CBO">%$(.(&`%WAQ!;2[H>-X% M!KS5XC+RVFJC]O5FZ/999E]X<.\SG_W(>^\\?/3DAVVSMD;*'%V[V^V4UI:# M92:)H2A]73^=S29D@Q"N-N>F\-H6*1Q"4.!$(8;0%=EB6@1/.]AF0BGS?<.] M]6%H`H03M"*A9`%68BWBT_>V1D-KTL88K?785B8:JAT.F6N6QT7Q M@5N?_]ST1A$;PG16C0./69:=7UQ4DRDY8Y6V("1!'$EZ<3:;C8>-P%W/D26R MR&C#28F!`W"003C*7O+49TW;BP2.S$/3=EW7=1PC89#=M0:LR34Y:ZWU1!9* ML<_`W`O8:N?]M`T(5\U^U6FJDNB>>QK0^`LUIK*IA90AA9H:&+71U#WJZJU:,?/;IW[[GNT%T\ M[D].R]NGV6:U/:R[JCH#%8BRVW7;S?GJ$HNJ]D#=#(6&M3TD'9JA[5'DL!8" M7%Y<9!GVW;4(LAQ#!V[`#8H"-^62FWDZ,N@!//C`*1'=E$RT'K6S`"9E::UU MWA=%4>1Y411%42AO-_MM413S>36?+XS!=K>Z?/+XZNKZ^>GI+HYA/J4P^FW'E$+3]."1WQ&8D8B-M7OGF%F1D")%2@.E M3;#P");@`:U[;6`T:PVBI'0`#0PPPU+K5%N1,MPW`0,?>G%I)+783'N;*:1D MGZY7SAJ$GKN6-6F;2U!MLX/*B$3`<3BD#EK!$[*,C(;!H)/U!$]0G_XSGP,H M),610:RULM:.<0*`8H'BH>DB1P.RUFHP``M MO+Z]W=9YX=O]VEH"B2N]2+B\?%I,3%55[:$#M%(6`QGMG"\8_FK=S19.VO=F MU>'!;?JE7_J3)R?+?=.]\=8E4*Q;OGJZX=0O9L6TM(!`;#6M]KLFQ&XVG1$I MB0S`>S_>5]XO'9%)`+#;[T=7!;\/POCQV^BB'89^'!:.'%D&760A]($[H_5R M.7OPX/F77WQP?G%Q=/'CZYO+B\NEZO5JNZ;A+7]^Z4^\-!!+,9:6T. MAR%T<`[W[]^*,0YM*,O)R'28S6;K]7H8!E+*@!)S"(,,2!$JH6MO/%LV@_=P M&7GOM=:[9[76I+4!18(5XC%"]SP0031I;8S12E%*8H5E/>CTKSS-)`#A[!A0 M`$,1\@PQT.I2WCZ'GJ`3PQ"MC;*.K!Z8(_-VVY)"/Z!MH`76`HPN`!IN1#A$ M$".SF$Q0EBB*2;)9$^RJ[K8'F!?OS1,9K9T`QH[%>FVM'?]/L>]#",O9C'D@ M`2@B#"$$#KU?GYH^O54R716DL&1OL\U_,C MOU^OFL-`BBBA+.U++Y^\\L%[9_<6A[Y>K88_?N/DVZ\=IF6G,G&8>+(#]659 M!`1#28PVWC1=/'^\OG5[4E6+[A!"%*MSB;X/,IF4189]?WCV#!__L$`>[C897!I=-D92UI;&)>4&9Y>H,CA'7(/A[S,"\SVAV:X MZB"("E!ZR*PV&H00))W.'0>T-'C<"#)'I.&A`UMX#Y>CT"@R5!ELD0NG%`?- M;`&GM?GC;_V^4$;*$I%0%`D_AN>,R"?FJ"D9D9UX7ULZJ85^7U#@>; MM-9).'(D2MTFVV;V4Y_Z5*:NN1DNG[QWN6VUQH/GG[M]YU96;&VH)\9"AKYG MXKV&SFS6U9=-MZ\F\\_^U/U?^X<_TJE%%[R9[/?[)C09[+[=[G>[8IJY+%M. M)K?OZ!"DZ5JM?3DK0\=-T^1YUDK3]8TCS!;XU__LBW?.T.RWW'81FW77]]M& M!X9G"5UHX*$GMCHNTT/L#,.G.O2B)$?4,W^CEP9@P`!&=/)^M1UM..HGY`$` M*+.<.880P&!&ZHDY1L;9W("B2`^`+)P&-)AQ<@^D@&:[VEQOMP@!TPIE->L$ M&7FKS&XXU#4T<'KWN#J>U77=[;G=147H#^@:'("ZQF("G6#?/_LI!1B0`N]O MX,;O6T0!#0UK\_1]K8O)TOA./ZWKWC!\^_^!O_[]?! MZ`]:*:J.LCX=7$:)Q.>Z6DX"AU6]WK>U]DX21,9CM5(ZV2PI:HQZ6A;I_BW\ MC;_V,U7>Q.Y**[&2[S;-H18R5!4^LS%S?6YIJ+?+:?[TR2H-6,Y5"HD0N1LL ML9)`*2)US%$DJB"4`B48@LN06TM0/*2VZYTQW(L*R#0R"\WP!H5'-4%983Y!-<&TH,PD MI<`1EA*G%%E$48S*H.^FD_EN-Y!18!!9K8V(,%@E*(&VA#Y8`H:.A4$VRXI, M6'5;F\%J3B*!`Q&\@TY@%E@;V_7EH[:JBI?NG9Y,LXN+BZ=/KI//SCCW[H9%&W$0#1,,KE%XOI?'X\F61UW8T9G+K>,L-[HY0=VO79R4)K/'KTZ.SL MSL7Y^7QQ7!85,P\]BZAJ.EU=;0'U!W_P1P"FY;0.;*RWCHQU74A#'W.K,[97 MS[:[;8>$MD6N/0&[=8=DM+8`1@C9.-<_,DE(&T%,"1*01GT"C"C`B#%DK;4* M(83M]L"`$!Z\^/QJO^*>A:0/<=_T6B.;30Y-+03A!'0:9(4T14+@06@8>H(G M%"[7VBG?DL80X!RTQM!B'UM?>$E$$5T;=8+6&"]OUHUS-2`':RFSY#6,BJ.H MW)14=S)QWK#M#GUD,1!)(2@@TSESC\B(@4?4VX@<%4HL!&1:9UY7SLY\-O6V MR$2A,4@C9YR`\7R=,&19I@%*W="P6.L-;AW/9A67>>C:@6,+B+-6*4*4;@>K M9/[\QP$/5%_Z<__)O_F7OOD/_L';5=D)!(6/C%W=A:T;PXG9\<\A*8? MBBRSA-UVG01WSNC.,;[RF]O_XC_S'_O7?A'X+G9OGYX=677T]!JYL9D-$CCT M/:AW\$6)EQ[<>_3P'6^A@>16?_OA'GSQ^+#R MUM>[IL7=.[?JNN:05JO#-4=0'!-@-8(2*!$@D8"@"`2\ M^+XQ+`:EMK"U*`&A2,24P@0,8.`3.JF/$W)0``(`!) M1$%4D10LB25XB\*AVT,4A$$$)HH#L4@8,':%ZILA25*&-`A:$J(ET22:H!/` MXUREV!O\XLTUS8`31TYIK/;:&(DY:F@B`L%K#6;2)K.46ZDR7^59F5%I834E M3IJ$)`6P%KSOQX(E4A(AD,@QL5)4N"S+YT;OF086*&*K#8'Z(.T!\\4I$(`E M\/O`@__RO_];O_N5O[(?VGJ+U""?5">SDWT3]H=0S!8O/KCUZ-&C(G/27&^? M;HZ7[M;1\79U]>@=H0[_]B_C5_ZC7P+V0`LAB,\FQ+&$+3#?OF8"W-%]7S+YTMYHNZ/VPVZ\O+ MR\TF]CVTAC'0&E4%K;'=HFGQ\LOX[&<^JXUY[YT?<#?$MN,.5^>M=J8J"Z)P M]];\_,FSS3I>;W"H\=)+NZPP+LL`/81&+&`38[`%9AY=C:9!/0P06`]KA-(0 M9`2BC](.:"7:BB60`'S#.(>`;@"32*-MFA``8>CZ M81A"WVH3(X?$T&0,&:42,R?!T*[N?_0O`5?`AX`:>/[?^>737_O5W]UN<'P\ MMSI;76]2T"?+>Z%3?_SZ]X^G)Z?'Q],L`_>0SJDA=_%DCH]_`'__'_TU^'O` MV\`$V0)N&O?TC__)5Q\_30FJF)1:@L(P<<@,C+'U_A`CVC$YE[D04I1TV+6^ M+&_?NG/WP7-'R\4A#&^_\^YKKS]FWM3-!E'&#JP^(G8X].@/J#N\=)_^U)_] MU$OW7WCSK>__X'L_9.:N[EQ6G!V=VMQ94[2'[MUWZZ[OFB9V/>H:`AR=FME\ M#M+UT#2Q5S12=U!D[N1HOE@6TT*<9VM!@%%0!(Q34Q8)T!;.0IL;IN1(AHZ, M!*B1CJ8`#:5NV*70$/7^Z@2"0DKP&:[6V.V1YT,U+4**_<`F`0(M4`*5H`6( MY,:.8(964`S(#>)"1163;#9@W+P>2(%58@8S)$$).$$!I)*F9+521D$%8^&( MK+K!9"L%&FD#1#VK0R_=(/JEYPJ7%4.(@"B1E%BI1):T=4HID1!C[YUR%H5/ M$T^Y3H)6SWAB/ ME%(2H]@2'K_;?N:G7T;V<:`"O@^`RD]^X;/-&Z]_[^F3=GVU7Y9^5AVU=6/@ M7GWY5?3QZN)1N[L\6;C*-C_Z8=OO\<$7\6N__N^#CH&W@`K#&OHE].IK7W[] M:Z]==CW(BK-:J\&"BTRJW-V^>_<#'WK^T>,G[[R+R01=[">3BD/?_"# M%T^>_/"--[PSQXN%0B+C.>H0TV97MVW:[IIAD,@R!"3@T,#D*`ID17EHNRCB M2VVTEIZ'#EIQEF>E\T:GY6P)"=QS8A@-;V`-K`(3M(8F&$`EB(`C9``2:/3& M$*!NH.!D8!T4X*75`@I#"RBE#+:FFV]==X6V80( MB24ELN2MS3CT?_3[W_C4+_R[P)O``T`!K\UO_<5?_O=^D;<_^L.O7H2^G\T: M'IK#[FG?K;B[G%><^^WZ>OOT/+[Z(OZ[O_O%O_G?_%V00_]/T.S@3]$![@NO M__H_^T?_]&LVR\=!"D6<:?%.IADFDU(1O?CJ*U>KI]?7W:U;K@D\G2^0U->^ M_NAZ/7!"4>'D&).%]X5Q5AW-\]+Y$(;]NJWK5!7XP*OW?^J3'_NIG_K4=UY[ M_7>^\LVF7D_*O*D/;7LHRXE"MMTVE\\V[2&&P)M=/#I>/+[LM$$"]C5\`6.3 M+3,1+B=E9KR"DL`213/,.'B2E'>NVQ_:FHGA#=Q-9@=D;R[L(V)3";2`%#(' M,M`:SL!J&`?O8,S-XI2()$@CR(\A`@BL@=-@0;-#.LAS>*.,(T**,)!58E"A%2-`"*?)J]!6E42<#I9(2)8>FMKG+\XR@ MDX!(&W))[-75P1IS1%?S^T>@3P%/@"UP"2P^^Z6__!__IY_Q\JUO?'/-,BR7 M'+EI#[USC;7R\8_A[_SM5__K_^$OO_215X!O`6_`-/#/`0[V"`K_Y]__OQY= M'OQ\IIUA86WC=&KFFW\.++MQZ\ M>'LRFPP2M[MFO1'#0>X*)+8MG:6CCI*HD&V+.[!$,HD(TD2D& MFX+A3J$W8,*@N==]H#10.ASZ*(D!8PB0`+`"O4\_(@6M80V,A<^@[`A5-1W]0RE)C.BZKCLT76BB=(OC__9__/-W?E33=-(+R`.Q*0K_M[ZZ_JM_]6^$@&<;?.`#IBA\,/KT^7`/3UH4P="V\IZR:=%UWM1T^\2`Z"QU9RKS1*CH5C8I6]5[+-%.9$[*L7=0Z M*:O!6C@FCIJ2UG#&.*^*S)$22!26&`*/^IPA2B2O9\\N=O6F.UH>%Q-?']8) M[=&MZ?9P87.02V^_&]Y[LG/#[MX'/@=\"7@=Z(!SX/O`>\"!IF9^^YY?'$,# MJ($=$``%-$`-/``^#50__*W?_8>_^AM/K_K9[,@;[S4R<&7E9&*X.X1N*`NJ M6SD,O2^SIG:_\WOKX^7D:C48A]D2VN*5E^]/BJ.+][97EQL$=L3.P2@4I4F4 M@@1%$`$S?.X4J;J+O4@0^_AIN+S&3W_^@[_RG_\MZOJKR\M]W;==EQ)F\^JU MUU[[PS_XVG9[?76%V[=QSLRH<#F'HE?1EZ47ZMCM$B1`,/=+[X_EU M#8[2#P*@FDZOUWURX`1.$#VN,R@/DT%YV!)YA6KFRJG+"_)>NXR/3B;3I5XN ML\5)-E],BEF63_*\=&55F,+DY62VF$WG4U]XE[G9#.WA<'MQ,BVFT@N)*.8D ML`HQ``R)X`"*2`P523AIY]\['V;+/";_=#]0/M_VTH2$+!-"2!(!5F!"A.[9 M1#MEF\5D`A3(:6M8R:%)/G.14Q^E#=*T8B2$L1>&-`ZA#S+V(#($B@-!6Y;C M9NYW/_%S#7P!7`('H`3F0`?L@`,P M`P*0`R=`!C1``?3`B\![7_MG7_F-_^>;[[Z%W,-I%!/=7%\5$YI5]G16:.6S M0B^7,R&\\)&7O_'MAZ?S3_PO?^^MM]ZL7W@9W8!]C9,S/#H_YV[=';J^[KL! MQT=XY4/^L.W[,%A/T'#62(K2@V.?+4^>;IZ\_5:,J5^>H%RZK[_V_6_]E?]P M:M%N4OOOHP/&&Q3P,334QW'=GQU-%X"@AA*X;G,.]>W=S M[W>K===VW:&M:VB#:N%"-QQJV+XC`P!)W5R#A`""U@@`&#'"""(-B)`$&8N0 M7?V^.1*BS%CP#$&@#7-D,42DM0,0$G-LG<'V:LN"^M!J1YDQ,<88D!)$P1,4 MH`1*D29-9(Z/%^5%'92#R\M)E4WGR-E:=6A6/09K@R;6"FQLL"8IO]X?)EF> M69*V7_5QXK&H4%1.H$9?D!(H$I-DY$LI8BL1FC([GG("&TV9I:S0F=>9M5IK M"R))B<'RKR(6`4I0P@(B4H"1%$7`'$:9QOC>=QQ2;-JV?;>%#B].[UACK]:7 MIV>W8K@(/_\C,_/3F[711OOOW.^E"#[*`4G*=9Z4G:/F"W:YL.9_?\M#IJ M^O;\7/(3,G1]EDL:P/$&(Z\U MZ(:N!S6>ZMY/W!"-^"D(8YQ>'_?[1.A[B-PH)QE1$@8&1PA%$80;8M@PUNY% M8`E)VO&[QV7AI,-3`G-D`L1>K>OWWL5JO8VT98$R%UV$+R"` M)A@+IU$0O!ZL@=8@BT8?+$%Z>(*N4#A8/8RO$QG[(Q6,UO!:VM#%2!9:QJDP M[B%BK2XSOZQR9\F2:`$B.$I(44?CB35LHD!C8Y#PC<9)$G,,0X@Q]5T(0;HV M=%W7=Q)8!^$PH!EP]6Q7S6?E5"=VASWFLUM6UZM5'3CZS(1N^[WOK=]Y^/CL M#&=G1W=N/SP^6E2%F]^_C:,"^//`$^`]X)WX]IM?_?HWO_/ZVY?/T`='[C@[U/G:]S^3NO6-7A+*@MEL+@(3U6F:J_?W?>[,?L+[Z7S_R@7OS;:DM3':D.H!_/9O_XNFD=4& M`(H)^@Y&8586UJ:^1SL`&M4$A=7,H>MDM4)1H.NZ+,N+PBD*DRP3X=7JX!R1 MA=8D(B$$+2B*8K62V0QE"0#6(R]13C-"J-/Y]^8D.CZ?+H_+A MV]=W[A[-JC,.M-WOP-$;8(KU#MT3?.^'UYJN3T^PG$VM_4Z6?=G9_S$RUNOM MY?6NJ0&-,*!K,9N4]TX-X/N6MU?;)&DV*XY.2J4/(71='YL&\PI5E>]UNSPZ M/K[K7_G01R;%O&[IM=<>_LY7SU>KX>7G7SJ_>$9*K,6]^WCIA?+.G;,0PM!L MO8?1#A!F9HYCL[VU9K.*6L,[-!U"A[9!4FB*^L'M6U?/#FV`(M0UH'?S8WWK M9+;=;N=SK*^&Q1*7FS8K<+D:M,9R61X.A\T:U4S.3BN`MU>K9\\NM,9F@]"@ MJM"U:#L0K2?3F\5GU,U5[\=OUD`$C)N;#02*D#3&$?,?:T:8;PQS,OX&C1!N M5NJXLNW[K\DPH*Y;+\K;JCB=/;LZ3TIZCN-R5P;0$.!JTP38==,3(:_<$&($ M070Q@;:]M\@\"N40$+OL^+L[%;?R3"$V7QZ/)\AA=TN M-`UB@LMG":A;'EJL-_V3R_;=Q_7CQ[NK5;W>IM45]\'DQ6E1GEI;7)Y?DS*6 M,D4J<_KH>'IR6DUG+O)6T)-*ZPUR!Z/EXDGRA=GO]D\O+Y\]??+MU[XY7RP^ M_/WGO6M7WNX*Q2H)2B)AU"@+#WOAOB M?#X9AN'B$G%`.84U:!K$KE[.\6?^W.=_^9=^\:573A5ANZ^OKG=_X2]\\5.? M^@3S;CY?*.DG5:[2D.CY;U/M:1B4/0RM8`VL!F_O)":MBM5G! MH"BF,6GMG2^\( MW',\0`7KXZ1$4;++0SG1BX5OVU"4(%L\>AP6B^+6V9VS.R?'IY/M?KUO#D6Q MO'HV_.BM"S)E8K%^*"8IHGMROK^Z',=$89VHQ`F*%"+'Q,D[C\3=T#<-GGO. M_?F_^,4O_=R?F$[+OKGX^$?OW[XUO?O<7>?\:K49(CN?(<7'CY\TA_W;;S]: M7>\T^-`,AL`L2J1T;C[-EK-I[NRA;H8.98[3,S,$J7?K[>;JCU[_]NO?N;06 MQ\>>>Q[S-5K#:*@$,]8;1TM`NNGDH+&$H\#JYCPZ[O5I_/C^BB0R"C+>KL:U MS0RM=>(T<.*(?H@QLK+.91DG-81^B%`:T%`)+(">&5L].;_8'Y)(VA]:TBZD M.)MFSE/NK+/:&6,,K%;.JFDII\=F44V<5<)]#`-BX"@LJAM2'S`P&$G_B4]/ M(H<8AI3`3-[9PJLB4\N97RY=E1%16UBEK5BC20&*%)0VVEIC1_FM$:644DHD MJ:2@S-#ST,=^"'TGPQ!C2#&DP#$K)RPBT(IT[G-GO4JJ;?HWOG>8-7-"6&2TV;)W9*A:7;7/W;M[?'P2ANX/ MO_FZ<3&SKJR6+]S[^%>^\JW+IZO)I'!YOZ^[^C`H@7>8%#@8/WWZG;[K]_O#F M6YL0ACQW"A)"?.[^\7K53$K3-9("=CO>[H//PNG9TGOT71\B-BLI)O`:3;N[ MN-A%1E5BLV6K1V/TS=:LU$B5OXF((PF5;GBH((T(I/3^,B6D]),UJ@F*3$(2 M3LR``A+V.QBOM?7:&F-M&V+3+S+YP]?.^-IEO[/*[7S>F9G2_I MC3>B=?R%+WSZ[MG+MTX?'"W/OOR;W_ZM+S\Z/94O?NDS5YL+JVU(YJ,?_IE_ M_O_]SJ%&TQ_V6SXY1MN@<`@=\ISF\[2<^TE1]EW7=^RL\TXW^]8:I;0*D5<; MKNO&&:V0KJ^>G;^[WNWZ>M_WL=[_09#+`O7UOO$B(/D M!:K2&\6Y1YZ3Q*'K#LP)"EV-DR.O<$"46"!I)L]_09OE@`""_K`'&\N32R(83SH>@D*;$B>),70\#,Q"I)+H?O1>&\0$_=D/*4TF#$/H>^LR MG]D\H\(EY^&=JG(]G4V6LS++0TIYEE65E=A>7FX"'^Z_GIY\>3=)]O-^N'%NT5IVD-]?MD?'6EKN3V@WNV#LM9I6DZ$?-)$V1A,;0&EDWI9Y=G9JEE,WF11%5L2(]>9PO4+38+ZX M.1614II`E(Q!1GC\+I<5GG_^]-:M$^>U,>KL;/'!#]XQ:CN=%4FD.71=-Z:S M01K>XTM?_,*++]R[N'SO\6-)"=Y`TLT=7P%I/&X*DH`%0C>/3;C9W\?ZU*A^ MAR*BI&C\'`K@!*5(H)!(B&)*+$D80]\88^;SA8+4VR;+,9^9W2Y4RVHZF6AM M^FXM8&VU=U"J%V[CT$!0&$Q+3"LL"E\XTJK38$(:U^Y-2H%I2!(X!04B(T3Z MIS^LR!!42@H@79;E;)9-2NL=G-6E]T59.+*)5>04.(DH94SF\\S[W'FOO5:& MH%-2$((F1:HHILXZ;7U6EK-J-IW.75[F>7YR>ZXTID4QFY;>%7F>SV;59#+9 M[=9%7E3SB?%JO:VO5M?>YW?NWG[EQ0>3G-K#[N+QX=&CU;[>>!OGBW(VR4]O M+3*+$!JGHG=I,?,OO7CVZL?NS*9]0K-9';[S^FJWK8].<'&!KN63(U_7?'45 M)N71:G7X_O9ZYJ!.> M?^[N?%J&T*_75VTCD\I,2JL2,XO1)!B(5&:]]2XA!N8LRQ:+ZK#;)F&7554U MUS:3I,N)?O"@VES76FE`0AQ[Q*`U.*`HD!EHU:L4E$CHV_7U]OSQ=36QNUV[ M6H6F`0M$8`C.X6,?_:C+W/5JM=NMC$G&0Q&L1Q0D0(VB1-R$S`$@#0$X0N$G MT50!2FNED!)!08&@P"G=E/NA1"@E,-0H^!-@WZ`^M,?'T_F\VFW6I*@J\^UN M*"?D/%%2WMBKR\9JIC0$[A!"&N`(LPE.YEA,RHG35C-)KSB^CQ!+/R:W!>$8 MQUL=B2+]N8]HJ[5USCJ?%_/Y6OSS#A26FNC%$!&J:2ML38CK0&5`&&.S"$,HVWOV=7Y9G7=]6WHPV:WVN]W M7=O7=6V-?OOM1S_XP;YN>F&LMGCV=+^ZNKAX^'@^R^X_]]Q\:8X6]M:M(VUQ M<;X_'/KMMKY>]66)#WW@>6OX]>^\]WM???BMUQX:5Q>%G2\FFGH`WKD?_H#/ M3C%?+$(_I"A%OMQ<]U=/-]746^O(Q;,3\\W7ZI=?74ZJ8K5>I<36I,O?;P3M]0WU?CF7MBL^DFN]D4VFVMT<7YV=/#\]/3]&W")F, M0@Y22=+W*60$J"4?O!68U"?O,*Y&N]M;D^G6SOQ@,MGN(S;KC:5L/M\_.CK. M\LQ:$F6C"('(:(IP#LT:J[5D6;>_O[M_;:>L@C']>M,O5VAJ>`_KKD3[$$`F M^\$/W__I3TZ[7L]$SB```@`$E$052$[3'FHS#*3``,]Y#>7U4NB3$6JJI&%%TO29`2 M$L0:ZXB,JAA%L/YBTW91VKI>!1<\@:.V;1?KS%CF/C$+XG,]`R34+_H`,&&H MX%5<+8[SD@"TG:Q6.%\,>AZ\1S6&"J93Y%FQ6#1M"V//5#`>%[Y`B#@[Q]DY MJBWD&=8U%@M<'!ZOVN/+%>9SO/KZ8FM[.MTJ\MS?NGV=($='1Y]^?SH-`_8VYE>GF^.CLZ[ MA&[=W;S]NT^>IJ-3M(V[?F??/WYLPL6[7W_E_9\\[%8PR65YR;YOZO63 M1^N.$04=0XZ`=C/=@O=(@F!GRX?/`` M(.QN/\O++`O!DA(26#+O52.37-MV^75X[YF[HV>/\`PVD/=^:RMD61\[&$+? M8;V!-G9\<7IZ>KD\/V^%E]?-R=',>+.GEW?T;Y:;>/'Z$D..US]VJ?)L2.X?Y#+`XNU"@/;AQ/7;\].GAPT'K1W;U[]]9++TPF\\7BI%Y+54R%Y>(BI3YV'9S%FV]^[N677GOR^.BS MSR[(HAQM-XV)O7G\I&T%F_;DF]_ZXO'I_<3UM8-K]S[YK%Y@4D[GT]WM2565 MVG7KND4YPO86)E-,2@J9@6I,R(,!($95H6HT<1+$/G9+&($:(TK<"5F9S\+^ MP=ZFJ0'#'$62,4B)8U))N#@181%.FUH72_01/M>RS)UUWEOO+Q5)Y MV"%-:6OJI[GS1JD7IT(04N"Y_F!H8!)9@8EL8I1>D!(BPUJUWWJK,*))P(+) MUC5FNUFM^P9&D?NB<%6>E;EUSB,+)L\E'U%9:5F@*N$81J`$E>??S,(2-DV7 M4J_#ZUYYJ$*!0150%IC/IH7/5NVRCY&LM=;XW#UYUIY=K,?C8CHM.FZ6EU@M MEAEIN]&0(93%8I4>'\):[-^XL;N]VY_N3R>ZU@]T77[ASY\57#/G[]Y\>':\=H:SFBT4JQO.F6YR= MRV?W\,XWQ]:O'C\]W9F-STZ6R]-49MLNFK+P?7])KJT[9`5VYF%O?U;XL-HT M33TX(,5[$YR#)(:055&DA,)1\$&-6V^ZS2IU$:(SN?.!S4D0^SX\@*/'T;17C498U54E)PU(EK7224\?-)?+MFZ&!GD,)H@ M*[*VY>%5K@H(=/!&#:9F@`C6`@:JB`DQ7LWU:=COR]7_8X)"^6II`X!$2,1$ MI,@@*R+H(OK89CFJ*C<:@U%/R+,J)01?79RO+;"S[;9GHRKS7H7[Z`09D!%= MK8.>2V-0J!*+B)J^EZO'-L%[9[_]M7%4(Z*B9E1-F[;M-G7?JK$(+LNRRH6B M'$V(G`$;5:,L`NDA/9R[VI6)@3+40`G&0`V<0U:$T:B>3$8@3A"4I(?-0B]7ZY.#Z MS;OW'JR7J`J`8!UL0-OAU5=G?2]?^IF$V>S@]6Z&8U')R?+/N'ZC8O/O;B[65W,)Y-4Z^FS M#1*='!_5FXO'3S?K&N,M]`DJ3$B+\\W3IY"$O7VD'D7ALRPPL[)ZLE:)6>I& M&:Z/6+9]'^%R9%E&!LY;T>@LJJH,GD39$485`CI!=`8A,^/*%Y4))`ILE@@. M19Y9"LXX"):7\>FA;-I^:X:#_6Q3,QE\\YMO?NM;WYQ.IP_N/?R%7(IA,-*K ME_4@E`[S@PCZJ&T"!,/Y;X@?]1$IHA<02,2+J"&O3`H;E80I>'M\RB'#9`L7 M%Q#3[^U/J\(;;C.':C05YIWMW<7Y<97CUO6=,I`UPNTZMO!`D;O@G`BS/F]K MT&&,$V6CJDVG`\QB\"&8__8_&FV::)#YHNSKN+=[_>G1R8-[SZP/JB8EW=_? M]V0(?6[%4VNI0]?%#GT/T-602!F\0<25B['M,)M3698MKXF0YZ&N^Z,CC$H` MN/GBM2=/#A\_PG0.9N350.,9J#74==UZ)1!D&>[<&JER'QL64`;O(1WJ&JKX M)__D.^>G1^>7AVUW^;O_]+=&K[T#=#_[O_\5=/2][[[W)W_ZI*[A+421!RAA M:UID(=1U'V/T/H^JZW4S&XW'XVG;QHN+D_-ENG$'_^5_]D9RAS[94Q#H7K&?&9KWI.@BP MU)#@^ZZKZQ0R3*=3,E2W*R-(*>4!95DE[I:KU'4H+:[O85RB#*Z-"1&4.0=* MP.*B[WK$B,QC5%6&;-O&==VLUFAY:-'`>)PYYYHF;C;]Y24F$Q!AM0(11F,$ M8+F"=QA,RM:2&I\8;<^;)EGGQ(`CHB9F1(#3$(,."BLR](2`H5&-($:)U@I9 M1$9;(Q1X^26\_LKM[ORQMV)=\#8?LO^Q[=JVC3$5U@F21&0.N7.BTK=B@G#>C"M5X^O1X8=_YDH5!=[^ZJWCDR?[>[M;6[.G#X^R@,D(XTDH M*R;"S>M[G+K%^67;JK?P`5#$B&"EZS2V+!Q-T@%'8%SPX_FRC>NF=1E"EC7] MIN]:8R3/:#S)QJ-*55;K+B7,Y[A]>UH%GA3.NV"@JI#(;4F+7CJ_8Z&GX5:+;&67#&0%@Z1^0L MI.OJ383"D`SF(VM@"`+AA-+".GBZZI>"N9(CCD[2K1>G;=\=G79E"?ON&X'( MPAAC-'C;MLUH.O$A'#Y;&,%TOM4TC2>RQ-Z"5%0203(+E[L0O,NL\VJ]`8SJ MU2RHBI3012B!2%64R&0A>!\6EXG1,TO7(?;H1D9G[%".+&@-K6#4FA"(( M6!2)D919!=89:Q42BI"7N77$2;HNI@08/'J45#&;T6Q6=6TZ.8YMHV6%Q&`# M,3!&ATQES]Q'34F2L"HGL*@.*WLF*%@-,Y01A31=;:8$BAYB$BPA<_`6J4.[ MXFM[P7EE-EV7B$PH\L2\6"4CPEUM:`W!6*.6X,R5C)`,C",5[07%"(M5 M5XV*NDMW/\6`^3.PUH*,0E/4KIV.R]LW1T?'Z_7%.;QE[0!/1`QP)SSPJS2% MO)0DHIZ,D4`Q1CBQUK%TFTUB!D=T';I.L@Q515D6YO.."3&*=8#'N'#>^]5J MU?5)%=8BRUV1CS-G56(CJRS+`;1MVS:;Q`##>Q@@12P6S?$)%HOEG1=W%^LG ML^F-Y?%ZN5B8$E4U/3M9K-?(R@3!=#JMZT8(6>Y@[*!K>(<8T;3(?9O##MD/ M0S2JIJOURB#W'MXA(+/.BJH%[M[MJA&VQP@9Q2@D*$<8CT=;XRF9E>A2$F!( MU0AL)S@Y/ZMK>`_GO766#,C#>^.,-V2]:UV30D:SK:GW/K8+CE<\;0#>B_>P MQI6EJ(BU(0N(ID^,Q`*P<58&M7-@Q\8^/'1Z*]^MQA=V]3$7[ MV,O5`77@+$B,&-)-$5>Y^&&H$G>5,Q:")"CZX6L22$$0@K='"%&B(GL8%XX+FB22`Q,M#4R.&C3YM$ M^)5?V['O?,GRE6XF8`6DZ=JB&NWN'2Q6%T?'_=;4@Y.U-O?6@LB(,`^R1407 M^UZ4G:50Y%D9)N/)UG2:E4'!AE*>D;,>RL935I22>#:?CB;3D(6\I#LOW/C" MW_D[6]NS]6:=EZ&JLO'(%UG(\BSSSGOJ^LX'2];$V+4MJ\(96`LHU:WV+>9S ME"6/Q]73I^M163DW/WNVW"Q%8M?V<`Z9I[Y7XWA31\.Q*+PE$[LH!D4)1R@" MR,`84Z]::_'UMV\O%Z?<=]?W7XA]O'WKQ>EHNVW;\_/3HV<;*SC8P714Q=@+ M8SS"=&OJ?=ALVL5RN5HCR=)-Q,9U, M8VHO+KAMVY#9^6PR*3)H[#II6PQL814!#(LQQA!98P@Z9'955)DD"D?FKN>. MD88/P>4E3Z8TWZZNWK5`;!7 MW]E<42(433?XY,`*&*ASB4TO4K=X]!B1\=6W=]YXXW5'9/K8`;`11)EU5*\W ML5WM[.SL;<].3YX!L8_)>1,CK+=D'1G04%_N'-"+0%2&^T8'%=@A>,_,AD!D M@4#D5:AK-Z/I%+`^#^KL9#K=V=\]/3WK^LY[[S+;MFWL6]OWF0D`UTWG,WA/ MUMH\)P#$$*'8I9O79_5FT46Y_P"OO)KO[A:'A\?7KUV?[TS/S\\6"U0CC.>C MON6+RR;&U$;D.4;,SMGQ&"'`>Q1;P?F@[`V1]\ASA"RHBO=>5-JFA=1]C;I> MU0WZ#KN;C>;-<83[.\?^#PLEZM//UVL.XBBS-&')(`F)*#K4$U1EI5J M%$EE11;$G)S%H:(MALEIGE\6SLO/<^#8V@DB`&WA-'@24R1,/9 M#3$Q."5;#'9]]`DI7L5"R*"J\/;;[[SZZA<>W+__;[_WWO'1(@^X<\>M5BD: M$##4?$1&3&C3H*-?[6+H;["5$J^N)<3G6RO5!%#D;FB=E!ZPR#)7EEGPG5@( MX*PMRU+Z&)FMLV596KMD1A.190")"&B`$1/T*MT"L:0B':'VYMER^^,#HY60^50@T4;(M@'3E# M'HB^R%,C8$1A2,V7)3C MLZ=/G[!$$C#'MEO'&H;04C/@`X9G`UE8ZP:?KHB,QZ/#9Q?-&I,IE/'A!_=? M?'EO!>'8O_K*S>!Q_\&9M<@L]ZDABQAA`4\P(I[RLAQ9VZNFD-M1.1*U(J() MV[MN/!X#,$0GQ\_>__'2T3*WL!:3"OD$N:>N3FV#W&,ZJ8R1BXO+DY/EQ1H` ML@P^AR'7=BDVB,!DBLR!8R,JSB+WA2'JNW3]VM[IZ?%J@SS'[B[E>0&`.9U> M++AOR*(:NQA3WX&!)`2RK+C*+Y('03DR8`'O'5%208H@0IZC+*O]W8/'CP]_ M]*.?/WJT6"T0`HH"?9\Z/,^-,!C/Q:8($.3YT^T7;WR`A"3^K4@)8U!5!0(C MH@P+Y!FVIOEX,G(^=-W%Q2JIHJI*"C[UD1/G>5:6M-X(1S`CLXXL1)(0H!#K M+(@!B=)Q6M98;$`.__@??XN"^^%/?FS(N(':S,R,+O8)G";CR;KM#A_>O_/* MJR^_>/O1HY^7)<#8M+T*1++9:'C6-=UU_77K]\`T&X:3FRX&;;+B3&MLN`])^YC M(P)GX9!!;!NCL]C="3'UXS&\+6Y>?_DG/_KKMOGD*[_TSGB:U_7%R;FL5DT7 ML35&O0$\B@!K'1$%Y$SH8EHL&^M@304@Y#0:E5FP2;HR\_6ZN5P@]\BG*$DIYGL@BZHB7XPXV;I;M%$ZQFM?F#7MIFU[ M$1A/,4;FU'4X/CYN6V0!DVGA/?5])R)EEC5-8X$0LBS+VC;6==.W:$P_FU4B M,J13(,X0&2(#Z3K)2@HA$XE=*\9C.IW.MW8.GYVT;2MBKE\?X>[*VK"J%DJ677MQ_]O14%#`( M%N0=8!6&#"DG\YQ[QBI$1-980MVTS-RS$37,DI((`U`5KIL^!!>CK#>U"R%X MGU7%>EVO-YNF;J\>YTD)*`M75F5=;U+J;]PXN+A83R85&+%/`*F:U,<^H>^A MFA*W;[[QN=/3)_7FP@5.GZ@)>>FFV7%T@75GE(4HD67#C4>:]'V;*^;S:WMXE M8_L^.4[KNKX<511%25!6(?->A(TP@#RX MS:H98BV;=0))<-G99:<6FT:RPI,QQ\?\]`C;._AW_[TO=K%)DMJN7J]7+,9^ M]34A,H`2&9N4"-8X&%ACR!BC$&.$VTV=5BN`X*VR"*MQSADK1H;EDABB`?E/ M1#&QJHJ:(4)IA@2X$D@CBR&(-4G@O`UY`35-7:?$R@(:S&$:K`U9YIUC8;)F M5%7KS=I[)TF@U/=QZ%<93.:68"TI8EEZU3[%)BO]]O;6;!YB6I^?87\7Y,B` MR!I/3@S6J\W%@F_=1&2HLK/X]&[\Y5^^G67=Y?K8.?K5;_WJYU_^PFNOOGQQ M>>_P4.;;.-C/YI/9[L&V"C[[[.+Q$\US;.^``D*13<83FV>K97MT+'V/LL*H M*L`]H&9PRUM82T161+NN:ULPP[D(-8FCJK'>6\`HJ\`82T3&&$[2]]RV(),` M#%9=Y@0#ZTT?E0%5(THIG]8HW&S"#",Z!`&4D0>JTZR5U M&AF9\T1>`$/>#)!U5:/&YU7NLV"#L=;!1&'MD2(<85IA=P<[\Z+*G:0ZMFW7 MP@:-'5*$=;TEXS'\&%P59=VN4X(RZ@Y=K<;&V6P4BK"W/__PP\N[GW$UQ;O? M.'C[G2\_>'`O"L,8[UP2WJS6]C>^M0^CW$:6:-5?F63LD)R#:E1)L^UY75\N MEX-G>UA5D/=D50`CQL`82\Z2)[*`J5.O!A`C*FR,`(!74H6F)$1&('T4[WQ1 MCF#H\G+9]S%%AAJ"984E9ZRSY%356A<"-6UM#$B)R,5>E,E:YWVP%FHDI;[M MUJ^^'.G?V]V7C*/_Q1'=M!^^;8]U"NBK"S;9)*2IC/ MW&0Z_M$/NW_T'[R\;IYMZK/C)^N#_5F]Y)??^NJ\''WZZ2?<(R_X^NZUX/UR MN3P\ZF/$WB[F\TE69-/9MK/A?''YZ&%DL:N M9[DR(/>]=FTCJH:\@1J6R)P$0@3K8&Q,FIC3H+A8:ZQCU39*%'7D635!50`Q MS,I)AF7FQ042PQC)`HK"^2!]Q&J)8,"`M61M80R)D@@G0==SC"DIBS(@YHII M8T^?7;9M/3CN-"4#!(>\0%%@>X;M^:@JG?9M;/NNARJ(H'SU836&8$-PQFB* M*7&W6$(%>]=&6UO%JNY.SOJ0X_V?+\H*58777M]^\\TOWKMWOXTULS1]NZ[7 MJW4=>]A_YYU9;#LH!QN$V8B"C(6QQJB!40,CT_$$EHCJ%-'W$(7SAJQQK"JB M,&3).D_6&&,4Z/I.F)E555G%7#'3V!AA425+,)'5.5=48^?H[/2R;>O4Q\'3 MSXE51%4T"7.$41CAQ#!,L,%G@#7&.A."SYTW*NA:;EJ?/$ZD3Y] M^NSL_&1K:_3Y5U_]SJ^_M;<7-LW)>JEP"$$3\W(EK[U>+9;Q_$S6FVX^QW_^ M>[_]\/Y/GCQ9O_[Z'F"_]]<_.'ET6->M=;6SW?9V%J-Y\.C)^44WW\;MVZ-R MG+L\GTQF>3XZ/#S\\*/FY!15A8,#-QJ-^A@=6%E%89T9SF'#$S0O0EX$2](V MVG4@PR#$EMNV'P1,,A!5%54%D?$!+*K*SGDRIH\<(P0,&U0-X`"U-L"PB`IC M>R>H\F8-%FQM%?O[.[/9:#36]65TA-P'%[R%38F;#=<-\@QD018P:B!J&(85 M_:C,RBKDF2%)'#%8\HH%0XXM0U_28-]2:Y!P3D*2,5A@I"CE&99WE8 M7%[3\/,/N^TY0H9_]%OO[%_;_8N_^'-KE3EVW89C MBFU,`F'8;[^SFU*;>S<>C3?+]95I>SAC6C($@1'EK!$E4=+CJ1,2()N<\E*W/C#$Q(62A*B?.NXNS98R1 M$T.-BDG,W#,G99:4(L`QQCP/+.R,S4)AC%.%44-$@WP=D\0>I\]0%/WVUO9T M-*WRTHB<7ESD'%Y4=R]^]G]^_7Q*48C7#M`-1H!9"0Y MBKQTSL?8)8`<`!N[/O9#`B08LC%Q'U,2!=F\+-N^ZR/(P86@X)A4%`(G8E2' M)BE+1"*I[Q$C[^U-W_K*J]_\YM>^\I4O'^SOM6U[>GH"X>!@C1(IA)-T20&# MHKH:@X845)?0M>@:A,`J21+W":K#"(_M[6)49493;)J^4>Y!`U>'D#KD61X< ME*6/L$:RPA9YUG:;HJSZF))TUGO%RG&]>PLX=?__O?/#H^>G#O[F0V M.3V[W#_8.3M;N8#@0W#.&^=^^,.[L4.985PNYA,:9C>)"=Y13,8Z??OSP MP='C>\VHPN_]L]\]>/W&@X????SX8K/`T;/C:8[Y3G7GULV]_:VZQFR&]5K& M8_0=#@^;7A[O[LZ)_-'1T7OO-<;@X`#;((<*F`6(/O/5>'IP+8.EU6JE!E"; M!FX7)0`B=''9#-1O9AB"+S$>5Z.J.C\_1TRIAWO.B4@1VB$!W$7R-.2>5RN$ M?..]"5EV?'*9SO M3.'<\='9LD8PB+$7!4(2L6P`@!,/TOUS+?.YU&;=? M[>Q]]L8;+WWKW7<_^/2#LD+;MHF7#Q[]]/'3]XE(!-_YM=]\XW6-73!$!^_\ M!G#TZW__.]@-#[[W_W[ONX^6)_#.7"[.'S_6:H3Q>+RLSPX.)BKR\.%Z>:]I MVB>P].Q0ZAK7K^/Z/GE?;-J84B*XY_5.$(!CK/NAP!(`I),.';PSY)T8815A MP)%)*2%&R?-0544(L6W;MNW:MADX*#%BM>A"YLB0$F*$SZSU7O0J)F>C(J^>/#W\X&,PX5O?N/;UM[^ROGCRT0<_,T1ML_%%,WYHX3Q*!+7/>MLU:&CE&6`6:9``^::_? M?F%<3F/3]>TZ>$@+`4$I"EGU!B1@%B%K1?@7./ZK0,`@"XL8%15AOKJ@!UU* M1%-*0@3R2`#(DQ$,BPVPP.>9V;@8DQ(WW)-X6$O/N=D#?W64NZY-;8V0`XIG M3W!Z^ME[[WWVXN='>[NS6[?'+.W1R?')Z7KX+?Q/__Q?AVM&V[<-B)&$0$-['I+*7:`6FL- M$&,_`#^$!BFM\WD^KD8E$9:+CM''F.<5B=1]TS;(-65AN/[AR`9K$P/$SCD" M-%."W6PVJY4PN0!98D\C,B1EUC'U-4@8#!!L4!BVE]^QV4YA6#S,IN,)B[XNEY/9UOKNBV*;+.)619B%TFA*3:KE<9Z M-IW'A.UJMSQGI7C$(Q3L;6/1M?&/+&^RO4%=A;.&=$C))7855D MN9M,QEN3Z71:GI^>&U%69185:Q`4(0EB8A:I:[@"("9GZ[YO8R)8'J(&*GW; M]CT,X!R8A0+((248H,A@`_J(#S_H/_UL>>^SDXO3B[W=R:_\RM=>>_56XLW^ M;C6:DG?)9S@]B7=N9,?/^+WO/?G+/_BSTT__:)S,K7?>J;PY/#^>[^_%E M%K"SG]V^?:L8CR_.SAX_P[H&*5[[?$5"W'4DFAL$0@&N2JIK;D3**CQXPE][ MYP6?2^&]:M\GK<8!+(^?]M[S?#997'8IH<@!!Q7T$KO(,&8TF>[N7EO4]6I3 M+]=1#$(.XP?#LG!$Z<4Y%6XX)D.FRLJB++JN->R="7]W-!V/K*3QR(TSK"\/%^=/J6^/ M'J^N7Q]?GG59P-8HI+ZKF^[6[=EH,C\[67_TX8/+9>]"8:?34>D"6#_\]*$G MQ(AR(GE55*,R,5M+JI)EWH@G*]YJ86-9>I=E/F"YZHV'S\-JM7S\]$F>ESO7 M]E:KI3=$+$(`R`Z&%9#WWMM`1$`24@!=K.O:1&YC9(VB3"(0AV'O,6C/G8(B M8HQBARH+@"0CCV0Y=BPP!*(K?.'SQPL"$'RPSO;2O733K?J^OL1/#W%Q>;JS M<_2E;WSMFZ]\'L4^X+%^]-F/?GIY>+Z]LW]^?/KLV__$?_1G_\9_= MO'/CVW_O[[%-__/_4E;MW&[1L5&`HB<83>6EC` M`\Q2Y+AY\]9''SUZ[;7BG_X/OX]/_^"_^Z__>Q@0T+9]F5?C<>IZ7%PNK<5\ M+SL][:ZR'"PQK?LHJTUKK=W9.YAL]>MZM5B<+9>($9,)9MO5Q*>N[E:+1(3Q M5C$:5?6Z/3]=E].)(=/6_?GY9KT>%JA+46A$C#"$+(`L$F-8.(]&H8^"".LI MSS.1V/>I7N'6-:JJBI**I-('.[6G9!L!\&S'BLWOXXNO9T\?+W?WEUW_IR^,J>__][S]YO*XR>,'^#GF8Z10` MCD]ZLOCH,_RG_]F7/_[TR7JS))>?G-?FG_W'V_-IQK1?*`*`X."@!% M9E>KM0@"P7EXXT1%14+F1E555MNG%_+Q)_=-EF6+Q9J98Y<89-2Q")A$AHXI=!ULB6O7$3)J M6U&!%Y<7)9)?7R[:.GD+#T1&E2-X!$(49!1L'@!$Z?NVMQF\11T1$);M\);WWYS9>^\`:V;S[[B[_\[E_]]6JQN7[C5CFN%HN%$CU\\J1- M>/L;;^8V?_;@Y.CA\1_]Z_7)$5YY!=;`.;SYYLLGCYX""!!GHKWB9B(2-!0_ M^'ES[0!MBZ[#@P?XVM?"9%IQPOGYQ70Z`9"88/_@/5GOLZQ,B8D$`!,;0^3$6NNA+]^Y'F.[WJQ7 MJU77I131M-C4F$Y1=QBPXM[#E\@"K(/W8;7JFP9]Q.4)0'CGJ_BU[WRK:Q;[ M^_-184Z/GSUZ^&"]W`P,2@NT+4Y/X3.,*C01__"W?STOM_ZW?_F'BU4\6_2+ M%2Y6,/_PF[AV4&SO['B'>GT>8\=MRDNRUA%)7Z<8400071W_$X,,O(=W[OKU MU\\7S?U[#QX^[3K&>`HRV+3(`["'!0P']#U\`'[UY!5(;6]"KH6DW)BV)R?+F*+<0DR:&ML3Y%9$(7$ M"7!DK8C$%%,2<2@#3(;I%O:O[R@W=Q]L;(6W?_DEC>EG/WUXX]KVV>'9Q1GN MW\,77L/VWK8X<_/FS2POCDZ>]#&>GR]WM^9;H^F/?_"S/_Y33,;XSJ_=MC9[ M[[U/]N>%A7A2;^').+!P:@4ISTY7G0,6&TPKM]JDZP>SI\\NQI5[^BSM[8)L MB+&?S69U79]>=.,QF&#EBLHTN)\`6`?O:#:;[N[.R[*LV]7EZO7K]^H1A-.O-ILFB9=GK='SRZ/CH[JKG<@XYQW MN7,V)7:%M=9V7=/WG<_MP?[^SLZT6Y_W?1V;/FJR(%C/S%V,;=NK($8T#+[: MPL-[>O!(O(-UF,_Q2V^^]/;7WAJ/R]7B_(4[UW_RP^__]"<_XA[3"3RA;K%> M891C,J_:NGMVDN[Q__Q?_/25EUQ$SNK;:-7'1 MMJN;M^<]]TA15?(\!S$E;=H-`<17%4^>`$*,B`FC?W?OXPXM- M"YO!!1B")7A'SCF#-)2D$PUW#D1$$<%B+#S@'-6U&',%@Y;G?Z'A7YZCCS`6 M>WLHIY0Z$4%;8U)4$K$XWR!B.H;U:%>8EO`.!H$YB1*,5=6NZXG`!H[@NO?76&YOSR_5F\\:7OE1O^O_U7_SO;8.;-VY\^.&3<0Y+R(@R3\%:$&N7 M:L:#<[S[K2\=/3O\].[IG=O3D]/%P>[>RZ^^\N'['_4<]W=V'S\YNOO9>GN. M[9UIGA='Y\]X8"X/7$^"!Y$A2\3<6XNM^62VM947WEM82_L[X[/CP\=/#L_/ MT*7G?&>#G8/1\?&Z[S$>`\!Z#1!FTRDP/3VN3\].>T$@1\$3D;4VQI:\M=82 MJ;7(Q_GN]M9D5)X=/U1AL#(D=;&-J>\A`N]A/,B$NNG/S[%88[A/=K;P[C=> M>/N=MV=;8W`?FWJUO%B<^_R4&V3=?I+Y+X^GHQLUK7=>0U=%D`B/C ML1 MU0X/=0-KX`4$6&$9=B76DC%0W:S5!XQ&&?>\7"C'FHQ5*`*^\/H74M1G3X\. M'Y\L%[(UQLD);TUFJV4=DTXF<^>S)T_JG_UL_?$'=_=FOJTWR\OE]9O7WGWG MW;.+T_=__OC&S=%ZV2>!J!*$R(*U[:7K,3T(1V.-.WO'QZ?+&@>T_.60I&-(ETAJ2:E?LW=F?S<>3V?'7N=#460A]R&X:A0FVV4Q MRKJN.SSBIT_11MRZA;_[JR__QK__UN_]%[^SLSON^@UWF]/C)S_ZX7??_\F' MI\?'5D`.FL",48G9#`J<'*-N\7>__?(_^)W_\`<_^/&__?Y/;+;=)O_S3Y[< M_:Q]^!1G"VS:U:9N[;NO;UF+V'7+Y3F(U6B>%ZME3>3K39=GF:IJ$D=*!%4( MJS"LPCM465AMFN7RPA#/M[:VMXO<]<(<>XB"%,(LRLI6#6'`(XD,2U(R:@R, M:DI*BLS`.9!<%4EY@@_@A#(GJ*JB*E%D`X<`F0.S29%)KTJP24!`[N`M2)$8 M4"5B@DV2!M\)E-^V+=\,>?;&)$4<+:8CK? M<53^Y,?H*LOW_CRM86HSB!9$VM;K('JIMLCL4J%EG3K7OKCF?>>Z_I^_*P3W7;Y_7@X@#G MKK/V6M_W_WZ_)Y\X?_V55\:3O8?;!X$@>:G%EDH((1.EP%!=]=(77TZ(2<0L MTZS<^L;ZREJOJNN'.^%HM+`%G3MSPEBSF,Y[@X[.\R248@V60D@F4(HI(@0( M@<+H3,D48EV1K^I%-5%"[!WL+>;5QL;6"R^^^.*+SURZ=.[DR1-5/>[V.*6T M\Y#NW(D'AUC4F$Q<5;EI%5("@P.%QOO&N1`=1!(9.CW3[659CB8MIO.CR:3: M7.U&^*H.XUGS:-]M[X2'NV'OT.WLNI4U?/.77_[[_^EW?N?O??OUU[^PLCIP M;OZC'[YIC(S-XL=OO_G..W>)W&H?(J$_U-64C,3&6N::=/<.R@)?^=JSS[WT MQ"=W[O[AO_KN__?'H[E#DESV3]=>UW7HK'1D+L?S>KJHQ._]UJ"79SY4Q\?S MP59!`OUN;W]O?W70)83SITYK0?/Q!#(AA1#:[AU*([,L(P2E5%6YR1PK*]G) M4Q>#HX?[>^]],&F=ONGQ**#64EGS<^FME'+Y9O(Q(F,H!2TE$;7^4ZV@M)PW M-.AG/C@7,%A%?R"9*45H:9MY3#4!,(1(T$">8:4#`\2$IH%+T`H$A(`F0$IT M.C(PS>=+`]#.,?Z+?_C"ZLG!Y[?NK*V>>NNM']^^A4$7U1POO?3$VV]_MEC` M&#B'E#`8X,E+V?I`A[1XYIEGH=2'-VZV_^X/;MNZ%Q%,)''WXR/L;7 MOO[<6S_Y@`1R56BMU)+RG8BIL,K5J=. MG]O:VAJN;:VOKS=-\]%'']VZ=>OHZ'#[H;OS`$8MOQ:;+>?NV\O3M,+&%M;7 M,J4QJ=QB#F)D!M-C(*+?P_D+^OSYB^?.GCEQ^LSZQNK:UBDWGTRFT_E\OEC, M#P^/=G8>'AX>3<9'XQ%"A7X/ZRLH+>"1$BA@T$>SP.$ASIR17W_]]=.GSNR/ MCO_XNW_V[OON>(PKSW1[O5/?_]&MO0G<_^NC.WO'(!2I[!0#Q.V_`*)@, MQNB&H(Q)(\,BD2.F]%AUE4FIE(;W>-PD57@\_"\E((EB M"_K/2Q@+9L2`W&3=SN#F^_O&8'-%3J?4*9`K:(GVS-#^`EJ1*X#1`F4)`NH* M1%`90L#Q`N4:_L._\\+UZU]YYR?O_^'_]>;!`3*#HT.4&9H&DPE"P.80%Y^0 M&QN;F0FN.3H\QL6+]BM?_WKEFS>__V8@?/&U+__X[9^.CMUL`BO1[:":X957 MGKYY^V,UP!-/7;J[?;]I(BFLK:\?'1^?/G4ZSSO7KER]>.:"$?KA@_MO?N^' M;__HP=$ANJO(>KT*6/+)G@!DW6[1'QT=#B:S(A2D9=*B]YJ M/Y%KFGGMZH10EG9]?65U."S6SB`F+.JCP_V]O^ZF#UX<'3G/ES"8+@Y6#_SP4>W(R/&%)B42>)W7D=A8',HB2BS M/,\!.%=GQ@Q7AIE5Y,.BFOK:,<<\+_+,`DE&*77(+1&<#[^XABN1L31YIZ=, M&3QO[Q[=NS>9+3#H8[@Y>+0_T09%#IL5&C*FR"Z$0)TRT\OS7!1"`E"0`+16 M1(F4UQIY`67`[>@(HQL!1`8>9XM*MO]WK#VY_>^\&;G]ZZB6X7*>#^'0SZ&*Z@W\/&,!NL M]*PR'*;3V6)M'97#^2=.O/;::Y_=O?/QK4^>?/)JWBG_Y;_\X4H/95'TBT&6 MY;-9)2W(-)>?N;1[L#>KJA!2;SA8+.9GSIQ52MVZ:'+LNSW>JNK&_U!EX6JJIG*9#GHE7D/:-7(DIA23%M;:T$F MYZK9;'P\/IA5$Z*HH4^MGVW3TKU>?W5U52DUF4Z.CX_?^>D[(/B`E%#DR'.$ M@*I"EH$"C$29PQ)"`R1D%I?.GWC^^1?6UK<^OO'IFV_]]?U[L4D@@<$6H+)% MC;L/W:,]5`&FD,9V(QF?**;$E)2!^,_>0&;:V@%<0-[K%LK$E(PQ>6ZD%*YN M'CT:A092H-=#?]#51HH`ABM[3.Q3!#%:5Y44(*`H.LKV3%:Z@/%H>G`\GP;%S M=.?SO?_W_WF8PE++LK6.K:WN2J/5]?5[]^ZE)`[W76[TBR^^N+N[QQ1OW=N]\MQ*ZTC*;+:VM6D*^\2E M2^=.G9F.9Q^^\][[[_ZLF<9ASUZ[6:N-D6S(AR8&1TP`FJEOJE`W M34H13"&@G2-=&?[B3$4$FT$)$&-U-3LZ=-4<6J)KL+F*ZR]>?^'Z]=2$'_WH M)S]^^[W#,8P%)4PK3!NCU9+?;%5)H@I#NGY8M;B6X%&I$1QQ! M6%VQ!_L^[T)9Z`+7O_AB.>C_Q?>^!^!7OOVM/__3[]V]YU/`^3/]7J^70`]V M=D^=[TMIZE"QDF6OTQ\,3ITY\^2E2]/QY/./;CZX^SFY0,XW"T#AJ>=>O'#A M<@CIK;=^]-<_WG4U5E9@+?IEUNOU>F5A,YOGQAI3N\5B.KU_]S#+8(PE(I+0 M:JD?\ARU,5II(8444FDEC9*"ZS"'=$R2I,R-@;(II1`"$4L#*0DBMO/UN99& M9X`"J1#B8K%H*_9%CCR7HP,JO/#,M:>?>DHD MOG/[LWOWMG_T@UV?T!E@9;@R:]+VWM26^LRYRS<_W0X)5AY#M907`ZL0O9O,)M[[U97^N0M;GD?*<`BH:M0+I`1M M8?)BOFA\3#ZFE"@2MX"T0*R%2(F)(YBE`G1K-D=NN].1TP)662D%(X&A%:#` M:BE,AT(2FI5)4L%8F6550[L'\[W]\7@\/QB[AWN8C/':ES8.#HZFDWEB>SP: M7;C4>>*)S4%OX+V?S\:NJ0!O#>=&Y!D3">>IVT.(N/<`B1[UASV;`TQ?>.T+ M=^_?\[$I.YC-W-[!;'U]8*W-BYX4^6@\FRW<\7B>(@>?_H__[<_F\_U"YYK1 M3!?3$2E"KV\/C@[NW;\#YE=?_<*7OO!4OY<6\R-*V'Z8]O:K\73JXZ)V]70Q MCRGTNMWGG[]V\M2)+#-U/:^:$&(B3L0I)E:*K35Y;B$X!%_7E7.+LBP$@V), M1,F1:WP*20DI(6*BZ,DW[!Q"`PJ<0JPK7\V<:X(Q&);9H&NEB,'QL(\4X1HP M(3-0"O4"1X?QV6N7O_2EKW[E2U]10OSDQS_]WE^^^<%[.P^WY^,IM$+C,)DW M*N]MG+G@D_WD]N[#G6JZ$/,F+1P[GQQD9,E,`*<4F)U15!BC?ND96`'%VDHR MAI5@D0@,)6`EV]9^;K3.1)8KXC"O%]-I:NJ44M`9A((04`)HQPX9Q#`&N9%: M*A]BM4AUW3!YI<7&UEK6R97RE%**B![>HW'1.PZ!4V3/%&/R2"G!1U)"40PI M1=90&MI`FTQ*I879/W3&P%A+D;5F,-ML6?PGZ,`RDDR$D(0G-5^$1+IQO'^< MCD>85#@^QNX>M,+7OK8FI$Z)3=8-ONYVAWF6'^X?C4>'C6NL21VCI$I('#S& M$SIYHE,W831!OX=)C<;OO_K:JY_=^50;U>WU;MW4`T%2 M*GMT-)F.XVR*X4JWVQVF,%OIK'KG1H>'Y%(N.=[O9Z M7_OZ5R^WMP< M6JM":&I/SG-5AZIN?'!`S#NF/^A75>5#`*35UJA,22N55B(/,0B25BEE;9[E MG3PW.M/:&&V+(L\+3^\<;7?O,_^9O?_#O_ M\1J+O4>'__H/_^B?_^\???3>6"ET"A!A916L$!C"%I[RO=%\=W]V-*X:IZ7N M0^8$34*34JR5D!(<.$4CR6K=L48KI8TRDI1"TZ;B6A.*%``M>Y4N>0YH41$M MZ06R%4])2)+_U@BV!`2!@3JT!!@,>@@)LT6]-Z[+(?+NX-RI,T]>S.=5W-G> MN_]@/;99U]YY=7_ M]9_^L](,E+7=P6#_<#89/?(-!H/UDR?/'1\<][NK*B6R(<4ZA,5D&D?C>GU+ MAN2-DMK(]]_]ZQOO?W#EF6?^[M_]V]_\YL'WO__]'_[PX.CX^V M[T-A.IU,WW__;N.QNH;GGW_ZJU_]ROKZ^KV=[?%X='AX.)E,Q^/19.+FATYI MMS;(7!6;0'F6M)4A4%T%9NITNBSA`@,Q@"`3$Q'3;(9>'V4I0Z!J!J6PNBG7 MU]:O7;EZYLSIS2M/8#C$@WL__*OO_<$_^Z.[GV%M"T2(-08#Y`+=$EHCS_!H M#\=S=%;DN8M/.+)WW[]Q\W;M`OJEBHE849UB1!0&(7!*OK12:M)"%IG*C1;_ MZ+>M@1"L-<*@YY>>/@E)2^RO%'!IR1"T!M(\[J2K;-XN6"(`1D(2S.,:4GMP M7+)[!"!UDF@B14!*HU2FC,VR,C-]I?1??.]G3(BTO#&E=E"%(`-$6\/KM.`N M9%DFA,EU_LY/#S=6H22:.?(X/2I M_H6+0]#]KWS]BD1V/)ID=F7_8'+[UMW@9&@H!$@@-]`2BE#FZ'2E;W!X2"2Q ML@&;HPG(>SAS9GVPVM]YM/W"2Z]4E?OQ6^]\\QO?>OH[_\T?_<__[4<_N]WK M#R\_=>7!PWNC^51J_;?^@[]U_OJ+G[[U`TKAWNW/[]SZ)'F?`\&Y!$H),"@+ MG>M%V1V-1N^^^^Z[[S^<3&!RY`:2(I.MN0``(`!)1$%4 M,1PB4[()%!.,00B85GCRRJ#(BU.G3YT]?WYUN.*3:^.;\\G\T>ZCPZ-#`$;E M3?#S2=4$%YJVDPJM9*=;=#N=LBQMIK9.;FHK^H/!UM;6UMJ&*@J$VC7-P^WM M&S=N?/C!)]/CI6JL:1`:7'TJ]U=N?[_?65TCW'CPZNK>S MF-70)@IH$T4`I$:.=7RA*VZ(ZK9E)%YY!ERV!'^U=M[@2/76G+(I"&$-:G MF%P+4D&60=E"98:A*A?&53.9Q>,:58TJ@!(&722'$)`;K*]C8V.0*1-"<"D] MVIF/QC`**D<(2("1R,6R.+7$>DG(-F"06GXTUM>*7K]GC*&0`AW/&K^^@9=? M.;>8A>/#2B#;V3GD9(Z.7+LT7003LM;[T0+;!;),YJ5!2%)B=:VS=7+EZ6UN??K9M6>? M_?;O_I?`\^!W;W_WNS]^ZP>SV0S$;K$`H2RE"B2E5`)2M@WDY908]-#)H'*ME9HO'!%6UCO6VO%XU(:7^YUN MTWM[Q\3$158OFT6YL;\F]'E:'G10PF2R\1\]BJ[35L:\"(%$E+!Q$ MK@4`&4LE$H!2)))`(C@)*.0$H`41,S>^8U!1R*>/[&E MF4'PA.A(&PF"9?*/VT%H1S8R^[C>V-*<)`0#D4%$!,50RWB.AHY2R+B@I22= M?F'VE1%&0B8*#,40``(DU2G450-DZ)=%=U!NP`,&O]GMNWJRNK,LDWWWWT<::/3SRDSDR`YO!!:0&,,@[TGL:'Q!% MM]K'UHD!DMG=WC.*)'!JZZ12^J^^^^"G[_A.^1?//O?<]5>>,\K_Z9]\_*U? MN;2QVCG#!_?M'Q]-,([.9L0!@;<;)"4`Q)$')**D-VN+, MR?ZC@^GWO_N3FS<_>?K:\[_TC:\^\\SQ9_=V?O#]3TZ?66>2H_$AD5E=74D@ M(C:F['2@C">BROMF%&(2DO7]NY\OI@`^6UW]H5(X'F,R61)X!GT0HVF@%)C@ M/(Q!MX_)%"Y":^06:^M9GG?Z@TE5M0]8";;MM(604`S+JEPM&D_[$U?-X0"3 M9>.&YJ/)\N=65WJ+Q403@0/`!(IL M_ETG_>.7TB`"$B1!*@B)%)&HKBI"@%7HEK+,,P`AQ)B("20?N]09$D![#""O M!*"@!#C^8L/3!,]@5\,XE94#DZV6/2CY\F5+Q-Y7KJH%L=8)81:#+PT-.^AD MT!H$-`D$Y)F\\MQ)#1($J5AQ6V=E":HGQXEJJL"`52@-LAS02!*C*9(W>=F1 M/"IMY\PI<^O&(]_X?@>9@G,P`BLK'0#SVDEII"4'-U^@U-`R(TK'X_K*U7PV M._KHQJW5U?6R0.7QX?N'VP^^_^__VJ^\_JN_N;7Y_F=W[VQNG/KLWC:+YNBH MEN*!E,@S9#932`+02FI0NY-(0$A)@B!!)$'8OC_MKNC^L/2)WG___>[#G3.G MS[_\TDLOOO#JN^^\]_:/WYO-(&3]X$'=&^*99\X='Q_/9O,FH"CDH#?(L@S` M;#;O=5<01T0HRR+/=F/MY7OW05$)`,8E:M(H=;/P88$/38 M34$00$L'8"!&N)H7-9!09ACV\C++0W*+*C4U>`FHP#)Q)Z&5-DH3)'CHA+1*9&0@B:O!5LEC.#3)TYLK19G-GNG3ZZ? MV%A=7^V=VEJ[<&K3S<:*:TD>R8&\\#7[.84FU9$3),-(9`("(`=7(TD0,.@I MJB*$Z?.C.:S,NB9XT2T0D!JXAEB"D2 M5_U^7QE[XO2%3V_?]Q[>P=CL]JU;W;R\]MR+;_[@1\J6@\$P!#$8]*3DP:#? M[W84*'DG!(QB);1D%D(J(5J-'3W>7?)>7M<^$;K]'LELY]'.@]V]X]%1M]O_ MTI>^_,)+SS;N:#P>=[H8#'6,:3@<`@C)><\Q-NU@*D@%#PJ00EJ=4U*+A:L6 M'&+[X,ZDU$WCFQK!00KHHN>3'X_KN@81,TR+M=VUF9U&'W<#2N*!'XL;@+H@7>JG:6N&5)M<0U(00071/7 MU_J=7-M,UHM*O7X52SL?(!5#M/Z^%FN]?$MQRT2&T5(IPY3(P06H-E&J8#5` M[!H7&C"AWX71C^TJK3-``@HRD!$P2AK-IF7@`$J#(XQ&IT"G(SNY$1+D:E^Y MR:&+KHEU$ZM`+LD4!06D-#J8S:8+5\^KQ7@Q&RT6$[<8Q6I:C1;4>&Z\2$'' M@)0D@2-R`ZN12^09C`08(B$$*(,R1S5K),3*8-`L*M\L3IY8-S+N[5;S&=96 M-!)OW_?>-:=.GQ2L!*GH(X4&@.2H9,P,IE6\?/F4E'9U[>2M3^]#ZI@4D9Y, MW)V[=]Y[[^/><-T'NGKMN=NW/W.-UUHK)5(,OJDH<9E)*X40!%)"H,TS2I+, MLA6X=?K]R;@:C1.$,[946B9&"/[!_>T//_Q97OU.7N1Z,6M$0HH)%()KDD-LVIBO7`1FC;RW0K+< M/9[>WYD<3Q@:;*R4BEBDE$`LI=;"D)`LA!"JQ0%)*31#"30NKF]TU]?[\_E$ M4%"O7P4$!(-YZ5!KD>E+,066!U"IH)66R@H@10$BP>AUH`20X`-Y%WV`:D=. M5PJM93L=&E,K264BIA%:L-(R!4!"RK<$+:V5A;#$D4LC+;I'G53WO=/+I;'QX='#VW,FO?>.;SSQ]IBC2HMH/`0?' M:3QR@#=&Q1BGLWI\L/`N`HH9WH60HM*V+`KOG;5Y2^.Q66EMKH116F>%J2N? M(B6*BYF?3.>+V6PT:LK',7:`-9:0VT"8.F;=L9T5D7<>C69WMV?3"K:4;"Q! M$XL4$Q$1DX`$MT-["F`AEDE-)0@R`6ESO5<6>CPY4!KJF]?:"]"RM-1ZSY?" MY_9L]'/K%'0,P5AU($0DCC&U[DJMI-$FTQ*2 M68K$)(`D(86`538WC.0#&H<829566F4JPATF`EZP]M5E#ETU-7 M+R3B+._>NKE[]SZL2GU]O3L:[=R_'P^/$&*B1"E@I;]BM`9`')NF MJ>N%<\%Y%R*DY*9IJLJUJ.C@DQ#D8ZRJN1$ZRW*5@C4H;59DVK;9=68\!E<% M@@^84^9EKXZT-YKM'\WF#50&T^D3%`E0DL1"226$`D?B!*&3:.?/#^;CZ?38^)PXN3&4U>O M*%7?^&1Q<("-3>SNCS:WBLWU0>VF\WFP62H[Q`B#%=T;=@Y'QY>?NGKAX@6E MFT7E/[\].WLZ.SQLIK-PYFQ6%&(PI)_\]?[+UR^0_NG; M/Q)2GCE]]M4O?NG99T]UN]XUHS8EK85H7-4TM?<-(2B%=OR(&9E5,884(42K M%6&E9%4OFB9F1F6Y33Y1(J6$E#*XD"+[@!@1(IH$[S!U*-?.>C(/#T;W'U3S M&K9G8?)IM3"FP!*7+K76+:>1B)/06`KF>"DN%0Q!JRN]O%3[^T?&(GJH7[[6 MWND1`XP%$92"M3`*(`B!S,J4.$;$"G6-IEZ:IE(@K9:+.$9XA\00$B0Q&?M% M'1=3FL^0`O)"YR87$DRI\4W=$$L8JW5F/*B)R26H3#:)?41F(34@49:ZJGR` MA)!2:Y:*!&N;6ZOFB\0*F96F--K:Q/"1DD=6Y%7CZB:28`(2D`"=R7G%69G9 M+'>1`TN3=X0I7*#$4>8F*]3"Q85+$5,?FY6U_FPQ29SF]6RZ&&^=W'K]C>?/ M7.1^,' M]X^0DE+0&B&D1"0$5E;P8/O^YOI:MRR]6U15W2^-5"DY9(7QP:>48N*08D@4 M4O21*;%KHC;&9D6"B)02,8.86=W'NWN)$YGSYYY M\LI3@T%O.CW:VW42,1$K!9M!""2"TLASQ`2(Q`(A0DC.WOU_LA-ZQB16"&R8-;"%"Q58G#DE+CU M`H"2$"JR'*ZMI1#F\WEN+>!!OM\OKEZY>/_NYRL]T]3)1ZAO/2.EX&4N1"V% M?,Q($3&"`=6:!1V"1_!(J2U50@J(MIG$2_,D)Z2T7/%$:"%[@J`$2>(4TM&T MF2X0$I2%4'KN_'C"LP6TA:D$4]>OES[NIK72IO<6FV+];7AM6MG&8>S>3!Z(22$0@P8K@:3 MX>MO?)&8#HX/JZJ^>NUI9>UBOM`ZSD9S;L_0L=4=`0+1H]/5_7ZGWRNE2)2\ M%`#8N22DA)!2+EEP8"VE%%"!(D$14Q`48XR42#``P5)(!FFQW"MD6PE86UWW MWM^\^>G''W^O7GMZ,%`/=[8[)5B@JI#G.'MV,!B4C6OZ0UV4>F.S M?^K44,@T&GGBM'5B+<0H!2NI%#%'1Y24A#'6V#RR"`$^RBAU@HBL'6<[QTV5 MC`\I"264@K0L%!%)&+`4+`$"M31&"8$$U?@ZAF`SI<`^N"S3ZQNK1&%1CYA3 M46#[(=2WKPH)825+`VZUYH\Q*2TF4RJD&DV-Q1Q-`Z16`XH806%9$&!:VE%] M0@K+-=KNS2V-,H3DZA0\?`-I,!QDVN:+N9O-T+8EM&5FN(#"HC?0RI)0;$%)$2F*&,"B2JQD5B93)BS*K%^0MGNZN#K!RP M-*-9O;TS?W0PFRXF4JIYO:@J+#R4@BZ@-56^RO/BY-F+@][*O9V=AP_W62EK M;-7,KSW]Y/DGNB^_\NS&B4$]?[2[AZ;!9(JGGUW7F1I/IHE34?3??>]G,?K+ M3SRQLWTWLUJ(I3/5:C#!.8Q'BT[)&QLKX#B?397DK+!5DXQ1+&4K;A=MK4\8 M0,78#JV)0$R\I!5)*<$LVLD#H7Z^0(GI^'A$S'E1,O.#[8>??_ZY$+CRU)4O M?N&5A9L='!WWAUC?Z`1VDG>X,M!69KDI.IG-+8O*!9XOZA@",Q0$B)B( M&4I("!E(Q,@QZ22R)*Q+>C)/A]-F-$M-;"N/5BM#0A%1)*F,(28B`B6!EB`) M"$BK9[.)UJ+;S9-WB>/FYO#$QMIBIF4B0.Z/;G:ZQH%`0XU&R65UMHJ"+!D:W5>=IA2>UX3 M"0)0$HH@&"N#S(5X],@?'"6E4K=7^L;M/(HW;TX>[4R\GQ;=;EEVB]*>.GWJ MJ:M7N]V.,C+$>63(=F!&@P3NW!G?N;M=%.4;W_B5EZZ_NK=_?./&+1?K3^]\ MJ(2S>>:=Z_:[W_[EY]_XV]]^[5=?ZEPX/[QX_=*39R^?/I79XH=O_22X1:_3 M:>;-ZG!U..AD)1>E*$NM=9(250.;UVOKPRRSL\54`)DU31.%;NO0$DF`%$,1 MB40,:*EDD@("23"45%HIJ3BUBU@LE?0`L0!DGN=-73L?LRQ+B7=W]NX_N+?S M\+X0_,+SSUS_PK,I^<.C?6MD69K%8@9PO]\Q1M?5PEJ[N;F19?+XN'8.()*< MB$@)*"7!%%Q:-#$DE:0EE=?1'BW"WG&U=\2D+4,PM!""E!9"$"MB5JW$CIG: M&SS+]E[/:*Z>BX;EPB'!WA]W[OV^J-2Q#,DD'@ MT/(=-*R54G`(RZJ-J^`)`2?)L3^ MX>[NT<&!#RR5O7_CD[?^S5]^^/V?=/WQ\.HU.?S=?/-73_<^H419;9S&AKM"UTIV/Z0V&TZG7S0:^;7'0Q,+'S20B1*%$+7B5.J?4#""(P M!$LD2HD39`MVMYP$6`%M&FNKJAZ/J[S09\ZAD$`DB@@-" M@YB6`$LFBJYQ\\0)9<9`3#5$0K=`D4-IR>R38XI@)"618N#$:*-)`D9!`X(P MFZ&P6!F@/T"92RNTDJK(J)Y3(BCIM38`O(\<0N+TEW_YP?'A[LK:UM-//_O$ MDU?+??^][__4]?OK@W>/YWGGCY2]L?O/G@\^UJOJBJ M>8H^N&;>+!)1469YINNZBB$*);75(`2*$IPB$8$34V0B2L24-%$*,1$3"4K$ MB2.!2`HB2&KGVTQ[W")J%8LTG\^%$)UN)R],4]>C\8@2K:QT#O:G1&%W]_#& M)Q\*P2^\\/R%"Y<:7Y\Y=:8LND)(K976-L8PGR^<"]VR4Q09V/N:$%J"EX6XIT),L.+`71G%, M(:1>*4^>W+`2QT>'TW%=E'BXB__\'[SQVK?^(_7Z10@!2LOD!UJ^%Y@C?(.V M448$K6$5\@Q&MQQ7K11I":66I]CV.+CLEQ(H/GX*"W""!*R!%;`21B`&(,+8 MY:9;+]!4:"K8#*L]:S5+YOX`5K48P<0$Q="JC59%JTRB)`B91)DATS`,Q0@! M>8Y>U_8[>6X,<[1&%651ED+)F`)BC"G&$'UR35VYRU.7?^R2M/2R7'LXF0J>AB907=(7_PT[^*[$YNG;OVU3?. M/?7\N;,7I9=YWOG2EU_9?O!@^_=VO[D9AE%_[E?7WOJ5TX] M_QL?_=7_^?'']R\_<7ESXV2G,RRLHA0/'AU\]=O?2'XVGQTJQ4+`-2!"MS1& MR\&@$Z/SCC96>YVR4\^KIFJ6L]:\+/TR"S"XM0)K)9622K&42FC9DFG;_P:W M?4(L+155516$&@\(8LYC56FFEP.`\@U;ZP8/]O_B+GQD3 MU]8VAH.5Z73NG%M=7>WW!C'&VY\>E!VY,ERQF4TIN)2\QR)B,DN3*DWJY$BQ M[DK=\:2=\S$XID@"`@I*@50D2BDII9A9/`ZQM9W,91>309&V5E>N7;V<&?GH M\*%WM3(8S_"=7__BM__FWP>$^O(%L`!AF6EJ*Z.4$&JD``&TXVP&RT"=)"@! MG4-5DF(Y:0R$R`4BKPC(2DE`BFIM)92 M4(I.^%JF$!9@0B>#$:P(@[YIS?H3T;CG?L'[__L MLP_>_[3(W:]_^YO7O_6UNS?>V=D^TA*K:RMW/[_SUA_]P=[';WW\5W_XIW]\ MZ_@0G]QXM+/]D)/I%'W!8EZ//KWQ@U=?NYKEYOCXV%=8S%#F`*53FQN@AD(8 M=.3Q_@S!7[[TU-[N7O`$+2-QU8`E\J)4$K/&V2*72H`%)P(@&)(@6?I(*89$ M1&UTC5,(%$-0TE`"168"0Z3$(:88HE8:$,P2K(A$BH"@S"*S^8,']\NB<_+4 M">]]5=?$:70T&DWF1T?NZ'"4E=G6V?-%K[N[/_KP-@)0$2*#94&B(-8Q*19@ MQ6P`E@DB)$H,R<)(K:443#%&1H!,4A.)%"G6TW!J??7H4;6^T;EX_O2MFQ_M M/AH7'0B+18W_Z7_YQYW^16"AOGH1$$OR@LU`":Y&=,LZ:/MJC3B"(=N5RLNV M/@E`@MH(/4.W[@"!$)$(GN$C-YX;#Y<0&;X&`<2H&1'0!K`0&JQ!0.U@%)Q/ MU0(VA]5HQ65@1`8!H%:^`TX@+,NTXN?["$&PQ6,=%"4FBHJ@($*(WF->(07D M!D8!#&68@=S":&@E%9*2TBIEC;1*&2W*4@X'),'!83;?'^W>JYM9C*Y39KW> MBA;JQ-;)06_CO?=N[>Q0#`@-9G.>328NQFY9KF^L;IWJ?G;WT_G"G3IQ;G?W MZ-Y=E#GF4_0*D`],*;=F/DOSB>]UBLR637)"0$ECK&).31V2X$ZGXUU<6FS! M8$6I]2$RH;4%L!"MT86)!2_30^V]EMN44$ODE]`_OV`!:+\E)M$T]<%!Y=V4 M21"G3EDNJNKF)[>IK84K0!)#Q@0([O;3_1W*QNX>_\5M7?O.W M_VM``E/U^B4H"2,@!,I<1L^A`04HP.KEI4?]6[*%)7Z1$;FMV2&U97\!)9>I M%!^670`?$<)C"ES;QM!+'CL;2`-A`(&80(#W^/_I>O-@V]*K/NRWUO=]>^^S MSW#G-P_]>E*WNC4C)!F$)$`(`<9@3&P&R\8.B8T+'";V&!L#`8D0#(20D.KN_6Z]?IUO^XWW'?? M'U)+J?(FJ@?-K&1DF M("$`3DP[T6A.U7EUE)S7:K58+M)R93'!9QB.LSP/;W_[4P]=OO#P0X^.!YNW M7[NWO7G^S/F'7[FU?^7JQ8VML::X?Q1OW<1+KS9W7SMY^?;!E8=VMW;VB,>; M&SN7+EU)\F"V3"%#TJY)TG;P>0&RIM*R+,Z<.6M$JZ:NF\@^$+DNBH*\+]JN M,YB!9&V+:`834;`[]4A<3PE5T1=_9M;[9IUB+?L8=6\0-Q5;0]R0Y;Y:R6K5 M3J?WZZHN\M(Y.CDY:3MA!U6TK535(D8IR^'VSMDLJT^.TX.#SOE4CL:2M&E6 MAL2`D@J<@LAH/0AE8L<"-2)0/W[0?LZ;N0"3JP]=/G]^][777I[.F\D&9G.D MA)_]WWYR8_,#P%T@<^^_M@:?."`0F5A_]3@'9@3`TQHE38`JV$[E6T]-I'LS M22*$#-1_:^M3F`T.@%NW.[X`Y>`\TV#$3AS$*,%Z_Q<#MKH@`#$; M>_(A"9U,9;YV\\V?#E0(C3?7Y^X\NO//OL:Y*.SIZ]M'_WB+/A:FF_]XDOU54K,6QLGKUR]>+51S:' MP^;^4??22_CL9XXGDTH2+:ONZK6'+E\ZG^+,>2O+,7/6KD23)_+3>;R[OWQP M$H2U'JNEYG1#NUFM73K]G!T$?DJ5\ROQZ3_3GX>HP2 M$=FII[*N.15F`A@[\D&=QVJ%V;PEZI@Y)5DN&V"--:L7Z+J.(<'YG9TS@]R+ M55TG3=,I&;O^;XE27T8;G:K]$A'Z>I!Z0XXU%HC(I$T7SY^[]O!EF-Z[?[N+ MB1C+%3[Z'0]__P_\+6`.W`?Z88RNC^SE4@-C$$X5A"/`:QK3ZY2/A'5>5*!K M07F/!5@K7_:ZP^%4$$+Q.B?7&B\MWO.O*]N[VS5LW8M,V6K_P4IV%6@4G\F[5UK7[?X[A7@1)GD]?L) MH/T?[%^]@P=I/$99,J`Q8GIRLE@L9K/TNB91+TLH'6;3>K6ZX_SP'>]\WSO> M/?J]3_[1,U]ZS>>I+#:FJ2$XCSY)KGUA!-Y`\KHZ-8&$S9B(F0C<7KUVI1@4 M-UYZSE28<'"(C0W\Q(__!#`"G@'"]><_Y;[Y$1"M:9Q-!4<('D3K?:;INC%_ M_5&^ZKU$:"/`7P7O.0?1]4%/M/;ZP-I0&LDP[W#2R*QJFDZ7,59MJEMMDR7C MV.KT!&VG==T>3:5NTO$4QDA:-,)5*\L*;0;/AB MU+;=@^GBP8/#@\,9(_OR=9G/'NSMC2Y?/2O:D,-'/OR-O_V;-Z8G"([5BDZD MS`OGXF@3BV4U&H\V)[NB:3:M8FJ]]WF>KQV7>WEA_6KPB9JIB20SV*G%"H#> MNJU/6D2T]FYE\D3]^=Y_[@/:##[`#'5EJAB6")FOJE15_[?#;/OS8G_J!_PHX`3J@^V?_[)>\NO4[RH8LK)5PZ'04SP*- M:R<4>9W63.L"2-W:'*W/N\3K"&9WFD3?2*5BS);IN$'7`:3.K36T7,#&2(=% M;J%=-EBL$%ML#M$DC!P38$9MQPF:&#YDG!7!M7V>B*E54V/.B\`NN"*R%U6- M49L&78)C<,"RP;@L\E&3E:EJL&A1$YPF'[@P7;:8K>`SM`66>I*`V6Q]:&Q. ML+N%S(7C@Z/C!T=W;M_<&&-S9]@KMS%S55=5A0M7AH(!-(\2E1WG64Y%"&%V MW!1%]])-M+_Q_)__UK+X*U,X;U]E_\AHI3F3G!]2!/G)Z";V2J M]47!QGBX6*YZD7@?!H"JIG*`V(!/Z<%DIT>E1Q'X^O,WP\V;5Q]^_-JELS!Y M[?:=2K+#I9`R:S\ELM-&1EY_/B+"J@K.,Q\"/W3MVLG)X8/#_:Y%R""*)][$ M/_9C?P5PP!$PN/[LI\I!Z3[P*,20%)(P*`&#&+@W:?!KY/(ZF_:+35I_]/': M`_-Z07MF$$$,6;9F045;DTF)(8X/5S9ML:P1!5%0-6@CDF!W=W-S=W=89.4@ M4VFZ%L4`QIC-K8JIB;)J;%4A)A`)')?#$7D2LZ;KF@Z=J'%RL)!A$(HB'PA1 M%Y,`(<-@..@T;6[M>3^JXJ+M4`M2`@P^#*.%A<1%C1HPCS;B>(FB!&P]'AX. M<69KN\@*DR5,SYX;B,G&YF2Q6C[QQ&-MEV[>>FTVC=-9M:CFCL-H>?W"_"B[WWHTFI?=- M6;JJU>4RUO4LRP>#HDA)N]BN585[)H/*NL]94QM(I,^C2D1,O:/55Z.0B!2\ MSJD&AQZ4BC=D4P!8+*(DA`S;V_EX/)K-%L='$$&1]XY;$%EC,S@@\S@^L,UM MF.#FS:,NG;SEZ2>N7+L*F/['_Z__S?W_2!#[GW/^J7G49!Z`D` M#B[`>Q#`M$[RO;F"$4`PK+LE=6N\F7,@0NK5\!RR@:];[>.XY];W@DM4C.;1 M.I.VQK+?^0(@=`EF36`W+G-3\\\)Y$P\%&UZ=;S`35D!<:3,F1.29SG M?.!])G#FLI(=7JRVMFY M_/1;WO[;O_ELEVHFG2\6[.SV7:UJO'P3DXD]^LBEKNOFBT51Y-X[2?+Z+I$8 MWK/!5#`8E$1N#=MGMM,N/J6DJE$IBL:81'JO-@V]D5Y?H4KJ.A!A,,C;5L9C MO[>[E>>#D^/9[$0<8S"`1D3MT94(&9@A$4T+']:8.._1U.GP^)Z#7KAX96?W MW*I>'1VL"#H89,26-&J29,DQC8H!FZP6M22Y<467+2)[\MX[Z4O)UP<:/669 M""`H0T])]D+KU53?T>OI'81`@)`1>>VU[LW:#B=S.YRUB:SN+,G:HLIER!P< MHVF0!RDR!TE,YAP[8C4Q[X2EOS;6S*H`YX4=@$2D[,0H&1`R!(?<>>]\EF7. M.6-2U2YVHJ@[.&^9+UR6.\[$EFV+V4);Q2JA4Q8O0J@ZB,`%B,([3(88E7GF MLQ3;:CJ?+]=B/I>N%F?/;9_,3W9V)ETG!_N^7B\5\T?7>#R)K'LAI3P'8&H;!#L&OCW,%-*FDJFFZC>VM MRQ>O;._D1\>')\>I*%)1#I)&!BWKNNM699YM;`PWAH/-C7)2ED='=_;O'>WN M,6!W[N*G?NH_?>S)#P$).(8=_?-?_N7O_*[OW-G==53 M>@>_GFEA/)3A((3@`L.SD:I!U#.Q<\Z<,\_P:SB+TKP>#)$S(LE#FA7.N;:NV1F*KU85!OG5FVP?,JDX,Y0B6,)[D MVUM;PV)$JFW=MJO8"<@#'EN[*SEY6CXXOG3+_ZJ-$%;'35;U,40=9N'1A[\*Y74&]?[^9SKNLT.%PD#F82M-VN;.][:W) M>"QQ>>O5E]L.N[O92S?EK6_!W_RI_QW(@`6P>>/%3]W;O__-'_Y!DZ7;RG`P M125(AN#[RQW!@7H>B*UE9J%0@6!-)#("%)Y!!'*G&/X>=$R85UBN,*LP6]JJ MMC85D$)3/29&BU MG_LY]CX,?,@RSC++,C?(/2#$ZKP162!D`46&$'B0%8X#$8PDI4Y4&"`O6YLC MS]`H;,;,@RS+&"&W.J:Z2^-QN'+Y\G`XJ.9'78-!#J<8Y$69Y1IEM:K;9J4) MB1!RC#'S,$'L`<95LOE\?Q(M3M_ MX(5TU7-2VZKIL,/;,T*PP+N7;E4I[Q_3NOSE;=S@YF"SDZPL_]_?_^ MW*5O`NX"UJZN_^JO_,J'/O0MF]O;Q)E?1C1`\(@.^U-L%S`!C_W8<42BOCOO MWC#M[.%VO=Q(+Z!'O=<]'""$*#A>HHUH(CI!%+@"V2B<'8QSSADMX!1091%I M+4D2&?LR]\Y!)0*1(`7A"EB/+V/N0.3)5 M$4FQ[8\Y[^!"-AR&BF)C)G'EH-[YOMH=#E1JA#F<^&V=U9-[^/ MR19FTU5:M9`$1K>ZHXI-K<1*TR&N/UR_=03X^GAK*ZZW>V-$)9-(X[+MHHQUS06@7,]<,J=>EV_ M#N9`"&#FMM5^V%R6G&=Y$IDMZJY%EB//$2-B1#@M.O'ZU@9K1%$OQHT$RN%R M!((W)$*>\;+I;MUX];7;KS[TQ)L_\`WON?;HX1>>>>[&C>5LVD)Q9A>//G3E M[,[X8/_^R?%R:M$JL<**A0`3)55O2HYR<&!X M6):1QCIG;)4XLU..!CDZJ>M5VR`P**%N=+Y`W<$Q0LE9846)G>UL6N3/;VSMV_=UA5@DZ<*P)`#BYI3-C:\5EAXTE6%-G1@\2,.W=Q\4*Q MO34AZL:3LFKF3=,4><%$@%2UGCOKI[/ZWMVE=^EDNIQ.3QY]])&JJF*4GMMY MNO`$>Y?$K%_4`Z?5*A-17V:J\6D7OVXB&`B^-YK9CF&Y++&O%5D[Q`!"DB-4B-]%5,<'#VU4GG>IYOP6`,$T44 MB$%A0HA&K7&"-!&U]%K5B(8."JFO;96ELRRX,O/!PYY[QR>B%+&`B1F M9`1S$"J8<3DH1X/<$VE,QOWEI&3JB8(C)G@V M3XY@GLP["HX]FV/*$#>+;G>([1'&N9OD>9$5+%W7=+%#".M>4`&?H2C+O/2[ M.P5(C62^G%VZ>$;E*+;QS,Z%V.CL>%XMD(<\<"#UP65Y+LLNE0,;CP?#7FAI))B*QL2Q322AR9!F.#M"UN'1QBXC;9I7: MOM?D/A0M<#=`U2PG"(\0862]Q\>;FL[FWN M;%^Y?'DTRK8WW=;F1JKK@WMW%O.VR'"R`!@_\>/?\_4?^%'@#I`LW?J57_WE MHLS?]>[OJ)?[(1L#WKW_Z:TL>((B=936$KU=1&LPAL\R]A[LR?44=C"!#$)B M9F1H!9U"#$KHS(EQ:YIE^;Q.JWI=[KB`PF,4L%V:EPHD,%%KS:*9,G6.R%'R M3-[!N1XUVE\/P9,W$Y44'.4YY]Y[5F==D65E&09Y-LA69F(H'9:#!@F$CJ771]X,*SYS0L40Z0>5(%L0^92\FJ:G7_$)PCY(B"+D&! M,*"<_94+VUTU'P["[=ORID?/3\;CFS?N;V]LG3]WX?AP?G++H_L'T\M5-4-.URRSS+[^\@L&QN&``%DN\XYV[ M'_[P^T'Q9#IS#OOW3BY=/%NOFJ9-[.`X4Y$>$=%$Z42E1]OTC%[1I.ILW3;@ M]8E(8O0YY=21;#3*R[*,,4ZGPCT%R*UYO][#.219&[G$^-5!I!+$UHC*WOV[ MGP*Q@V.,QP@9EA6.3^!S[)W)JT8^]_E[94&//?[8.]_Q]D'F'QS<6\X7R5`) MY@L\_J3_F?_EYX$`-``_^\7?^[?_]G?^L[_ZU]B?"YF7;LHNS@ROG1Y7/E^>UBG%D6^@9+BGL0A>H]AF0V'(7@PD4H;ZV:YC"YC@K)9\#YXGV=96>2#?"#6 ML4->9%GN=3H8AZ=;"SM7OQ_+G]._N;X\W429+F\#!%U%BM?RCWS=Y^,F'O_Z;ON%[/I*?O/*Y/SS%9Z+MM&HXK,\9$ZU1YO! M]=N3'ARM!C7/9*HD$!46AK&'(^>;56HBLH"=[4D(^6*ZJ!8QSUB[OEJ`8V@? MZ@9B%!GJ%;H&DPTLEMC:S@Z/97LD$AP2T$8U(E5IPSKX7=$N.S#$8 M2,`RHE-$\XE(*?=Y40P'99F?.7]V,BF'91@5/,@PS%!F5F0:0"$P>\?.N0`E M\DZ,E5BA("8?`OG@?`[JBUPS)9'(S,ZS\RX+7!3%8##P@5,G;=>:(80LY(-0 M>#+GV!-Q7RHE32E*C*U*+TJ3>L5\U:B:5!.Q-T>BU)%%3:))CO6A0OG'WWLH2]\_N7O M_JZ+K]ZX?OU3_^:%W_^UYS[^K^+=KU2KN)A/CV=5<$6>ERFEKHL@VHKW$ M@:T!D_T6D`#G'!,,[(@)S$9]_":2X023X4A4J]6RJT4:-"OKB?_]W54A0$J0 MA*H!$4)8[PN3B'HD0R*DB&2`KC60!PZAR)HHT3@FJCM3`%2`> M\MGX#2!7<^]_!$;D0LB'`W)9EA>>A4F[B*Z%IIYQWY&"B;V2XS650039<-2I M6RZ[^4*[E(HRV][=.7?N7"CR$%SFB)D^(-$5-THI;=;$5X[R`\ZU"7?#E0)VOD\SK=MDTT5@H-(*FTT7=MBVU MDJ*L(N7+HJ MJ5NM5L%9YI@AHF@%DF"A'0P'&SOC+SWW')R][>UOOO_@[KW[<6L+A\>SP9BJ M57SIE?V3*;(!+EW"[NZP:KJJQO867;Y\OIHM/+LRSUZX?GUV.YMBEQ1G]R[-9]/K+\3Q2,>C369JNZC:&E04Z]BS4WU$K'?4 M_=)>C0"H1E4324DD"D;C01X&R^6J6DBO]=DET%IQ<8U`[PQ=W_(:L@G\((N) M?#Y8-K$8^.E"1V,XMX8?];2B)!"UIC,1B\FBP,R#G!*#V1A-LUJM9+Z03@Y= M'IY\XK'#PY?_A__QIWWV$>`Y('_A^=_YQ,<_\4,__$-Y>>YK007F_MB5GC/C MG,_&PYU!F8>L,!/MDBDRA\RAZQ"3F(@J8(Y`RBS,M=*JKI@I&JJRL0J225V2=5/%IV:A3`< M<1@LFAB%R0^KIEMVVK0I4F;(*I'9HCHX7G71Q91BHJ2FR@86L#$G$58#>T<] M[[JGKJES#FJB?4<*D#%[(C<93Y*T14AGSI[;G$RZF);+>;6HRV(8Q9+)&HI` M%@HK!L5H4J:N>^$KSW_HF]__Y)O//G_]]NX9E,-`&-S;/VE:@#`<8S1.^<#. MG?-O>OPQM;9:+;+=2#D:#00&'NE[%!.;7J7G_?HS&:&:FM@;@P4P4IAB,O/=9;+NJ MZF*'WCWF=*:*I$B*2%]=)29&Y'S_H&N2)LL5V6AS)WCKNBXE>`;+]1QY_)[Z*@#F-T?==@0$N6!X&!,I"/LB+(N?`+@0A5@`:^^1O M4=34"67,!87RSMUYU:T9'4E0UY@MZJ.CV>9V1IJ\-T_DO&8PF"I(R(%Z/R`F M8C@B>/1E>)0D"A"9)V*&,U\V*"IUY,ML.%+RLZI;M:E5;A(6M=21Q`6CO!:> M+=)BE48;FT)9HDS5)W%MHI1BW7;$7@QD+&*]Z!;IJ?":F8+9N[5`M1E4`P<0 M3[JEF\^2U/W#^X<_;\[O[]VY-Q]L$/ M/GU\_%K7ML^^<+QHYT='\Z:!2CL>3YRG^7+>-,@"Y#\0HSUB9@TS M=^N&QGN^>.5R4\7E?*$**)H6;>K;`U:E-EE4P)A<,,[@945N8A$A>?UNI$4SB,!G;((J9J(BVJB*J8IQ?'&>'K2=`GC$:93 ME`7^QG_W]X`+P)JPW*'$AY//YS#L, M4TFT6(24Q$E"`@* M(S`1,9@=L7>>'+&:`:D3-BC76DH``"``241!5,OR3$U7J\H[SZ#E>OW_F#SV+_`#Y@:QL7+^2[ M>Y/QAKMP=GMW:_SI3S]?-X>//?[HI!R/1L.R'.WOWZT6W?'Q](6OW/OR\_MU M?:AJ=^\\N/G2$1BK!6*4P<"YG-IVV4L7_H?.^K7F(<-Y]CX$[T.6Y7GFW.#H MZ&@QU7Z[H0("BCPWU%8L"XB!$8JXV?_NDV;OZU)_[BS_Q'=_]'WWW]_[P M'WO_!ZY>>_S))Y^8K6;>,6LR(B^^)WGZK*PCM8841=EWJFU*48V8!Z/!T='" M,7S`=(K!`/_P%W]V,'D_<`](R^GU?_$K_^+/__D_SW[[%#WX-3'J\[S7O^7` ML0S)<^W,!%0$[&RXP$66)U$LH*L.1HBJJ]8Z[9I2SVUO2ZPH7R"D+&)08'M[ MM+$Q4FD9"*RLO>,<.R@'5SI5=@`B)`I,-:I$0Q2X4(102$(K7;.(IA*YOCNM M6I=YU;@41&U%(!RC5"&NFH@(3L@:""/`A8RKD\A,`18"E0X^Y]Q[!\T93N$9 M(K$0A^"0*D%B#G`&5`W369*"*EM6L!['HY&LZF("Z)1I__"WOOM/_]FW_M$7G[]]^^7;=_:O MO]"R:W=VL#'&N`P_]-_\%!#PVB<&%Z]TK]SZ_.>_J(8(%_RP+-HS9XKM[>WM MS3/'AU^Z_@(N7(+/88+Y?#$)H_%XI%@N9KT"R.ES?X,/#/'K'EK*Z,">'1CN MUJU7>X?/U$,F"D:IQU")K0=6D6-69[9Q]ZR_?^\;]T\^Y7`'KV M,\_\T6>?O_659\Z?'T6LX(O>#T=Z.&XS+H^-&5'4!8QA0:VHCQ2JFN-@H>3P>[^XZ50.25" M7=Y8ZEH!V(><\\`IU2(:`@?GLUQ,Z[JI3`L$A^!%6B06:R!4-3G4L9P_NPNM MH48VO^W;OW&^ MF#[WS!^T]?*][WG;F[[UAX$:N`O0G1=O?N&/GH\1[WK7T]4J+6;1NW#AXNC: MM+ZY^6+78E#TB@=M2F%K!5K`OG+]\R^\GS#98A'WX2 MP<$Y\HX(K4$(YAG.&;@-U(4<1>X'.<-+#X46L4ZEKF5K1!N3X60\<4P>FN=N M6&:#C`G"*LXIP0+8L1"1,X*UTD:)L4U=[Z%@+A\>+@_F:9Y< M*X.:BTZ=FC?S+@S8%V8N=2S*H@X(HBQ*AHQ=80A)+.2Y$8%"4J$>EFW;3<[!A/F4]QX";=?7?R%'_D3C[[[?=<__Z4F-L\^ M^^(7/O<\T\D?_\[ON'KU@DK\]7_R#[[RZ=_YQ#__S!=_XS-W[CX8C_W;W_'V MO>USBT6,G=O=/?_EZU_^PS]\:3(N+GWD3WSV7_WK6[?:+%L399=+Q-1E.8?` M1.U\`1\P&."C'_W69YZYJ8;1.+M]6U21%\AS;FJ;+_#DDU<>/)@N%U$,$F%J M_4I)%9V`&<6@K"76K70)C7$5=5''>6-NO/?\Z%O^;5?^XUG/O_EUV[? M+@;#^_MW8FR7B[JK-?CHX.LN26N(9D)$1$)$("B4N\0FRMXX$\X2%;7YE;B36I/S-5]SQX;!_9V[3[.[_U!S=?NO7* MJ]W!/@X/3Y[WOCP?&*".]\YYO/GS_[XHLO M2`)(MK9X/,Z.CZ5M[_]4>`88.#!O_S57]X[N_=U7_<^ M@(`&M-'SB[^68P2?,U0U"JR'8SDPK[VS>@WBA(X=AH-!F7F?UR%T=<1HG&T, M1\.`PB?6)$C!P7EH5+$$::'0X)QS2EYU#982<:HL["+E+7B9,.MT*;2HN0-J M<4)!B-M>(-T0-1$;?PU4@-1,0#U_EQ3>@QCF654[4:=,S)Z]Z\6Z$SE8<. MGOG"I_[=IP8!G__L%S[X31_8W3T[_@'%@`\?]? MDGHF!L,[38;1$.00/()'8&2,-?X(G?/D1J,0)F49C^>RJ.N3HP4-<\ZS+,L# M&;$Z`@>PNL:Q4&^<"-[009VI`DZA0``KDP<;P;&+S)(`IHR=0F`L2E!K18I\:%)KU"A8 M50I>17#5-J/A6>[].SB(1F8XEQ4%)*78 M]_TB,`4B\-R7?NGO_MS/?7&YP.XN?(`GH(,GE"620!4OWSS!V0O;V]OW#@Z@ MB!$BJ"M$P>&A@O=W+PS/CK>G)_=CM,4"PQ*+)9;+=CK%WFZ^L;U55=7]^RL1 M##+4%9@`!XUKH%T?HT)0:)=TV4G=*KM!.<[525RM%LO5[N[.:GE_8[+'K5N> MG(!E/!I5\WN!D-06#:B,93E.HB>+13Y`8F2#'![5*JE#42(P[MY-[WUO_I=^ M[">!$7`=<&GU!U_^\O-_]F,_/!@\"IP`#)22[L,[AP3D7Q.CBL2.'7$/, MM.L!!#U2,+@U([E-+2/DQ;@H1GEHTYWC@UGK8SO8S$/!GC4E@<(Q4T`&Q\Q* MCIE%$9&20-1QL;&,O*K:6=,M(E6"2ER77/)@!9/8&"8VCL M6?M.83"VI&(`6>\P@N`8Q@[,0G"&!)5H)DH*;R`P`AC:`JE.57W2>^YLC+-R ME+N0DZB2*%1`31+5:,I1H.($#-7(&G+GE)SS#).4`I`5@.+P$.4PG3V/O,#! M??RS7_Z%U"T??^)";.>7+NZ^OY,>WV\F8FZBK"F6!J@)NWRNRD,X7IR;SW31P-,9MA/$+O":NG MS/J>ZCV;:Q@QA[`\J>\=KZ+`9W`YEQ;DS.ZN8VF6 M!U6#(G""XU!$JBT:.[?>$#JX@*K!JL%X@I__A?\#>#OP.:"`W?A___D__;:/ M?&0X>0BHEO71:'`!4'/LL0=,OX:Y"KCO>AL[Y[U#"#ES3NR)))!Y1A&09\@] M?``I8DP"8L[,6#IS:!QA/,I&YB@AF(S,CB*E"5"U)&U-*%D6D58EF MT21J$OA.^]]<";:-TM3L^0)1DH2P=C;@P)5#1\PFN#AQ\IWO.W-Y\Z/ M]S9'^W=O;TQ&FV-/1L/1Y@<^_.V9R_[H<\]B M+8H\')_(;(:BP-DSN+1[IJK:+SQSKVM056A;&"'+(()5#9_CW>^YLEJN0.[N MW47O2B`1%RYL=6VZ_^#!V$]_L[_]%>??.QO`(?`#)C]SF_]FHJ^]QO_#/``L"QX8`#,F1C8 M2W;(E'U-7_]][RJ\0^X\V!ER0G!$P;O,P;'F#%H[-8*4ZK:;35>S92V"(L^& M.49ED;.#=BK1D3%,3!P3V/7Z6-HC:MBU;C35T6&;3QN===2H:\FK*XRS)`HU MEQ324FK0-2Y6E%)OB>;,5)1%1-5B5%4V$XM(G5ARJ@9A31%J%%1954R%K1?4 M)<0*SR\'>.<_. MF;609)H>1J^,RG7_KBEY9?][Y!DOC$;%+AR\>K1T=%O_>:G?^>W[S[ZR.[^_H/]!XN4.*:Z2T@)58,\_NPABC$9X^IU^=W?3>?_*R[>R#-,3]![8 MP0U6J^9D*FJ83+(NRIO>],BEB^=OO_;`W@#;ZS'\G:(H4"6=K]05^;6'GWCZ M+6^_>/':<%0N3N[6BU462#MQ<.R\F4CL#@[N+9?3U";M&?J6NF@I=LY1GKOE MJG4>Y^V]SSGWW#%OSEF968-JD*I4 MDDJV)LM&'K!E&\^6\80QR(`QQM@TM'G]Z*;A-32\B#80;KH;[.B@>='/!._1 M@/&`P99LV9:EDE2#I))*JBDKLW*HG&[FG MS-BYS]G_M=;OMS/O[""=4`QM21+JFRW;R44_1^+@O"*A!R7G4&H![P?%5N.= MR5U16`B(P"D'.!+>P0+.<0XX0:29C?`*#L0*2I"0$+"6=T@'8`D)(@DIA93* M>V.,,>2(62L(01HRJH9%EB^OH]U/&<&H#I664>AR2[!P<.S9L7"0`__QM?31 M"P&I92!A),!X[>LGNYV-A[_XIQ[;;WK3,$1R_>T'__(/_W*X0G%4VKTGN.7H M'8\_HEY"GZ;=0:J%>PL8KQ MZ5WMU@HU1X,0189`(RY1/^-.'T,1IJ9QTTTWK:PLE*+:A0NXZ>AP>VO3]3$R M,G3AW%:UJLI5M-O(LD))7+=_LMD8?>SXLU9\Y]`\V$2=0V+!1"1X936_>.5) M?>+IPB#I@`_1Y&QC`Q6:N7JU))Q4J04L)OM!:K MU7(<`0ILBFX7=]PY\Y$/?ARH`J<`L;W]Y.DS3]WWUK>5&KN!KA`-`$#BX"3J M@''8DF@"V0MC7_G&8P,2KB7)Y`IK4F=SJ9S2Q$((H4149JC$Z)6UWNHFJX`F M)B:&:F..F4D96'A62I,D@H=G(B)25NB$1=])HRM%U&@;6MXN^KEF(V&=\$(* M$IZ9G;5LDLQ;)O;,PF7.&K`5AF7N,)BY$XHMG/4I"P/E@Y)R<(:+PE@&&$J) M2$L=!R7AC+"%E!#LV.6*1*D$P,D(S"^-VOQ M\.'IX4;@?7_TZ(%#^\::86/?OL-Q:?34$\]_XQNK)D/20QAANX-JV1(Y[]W= M=]UY_%O/?_[2L]]ZQ,SNALFIR"E)^>"A6LS$X"U7(J"H8:X=)D/'<('/_HC_^7W/EU8 M0"@&NX$61D(0E`:4*KQ(,UY:Q;M3."&KY5*W:X:'U=55E_2Q:X82ZX_> M,OS;O_OOWO7>5Y6K_L__US/OO__GKUP\>65^T5M*NXGWN;/]D#E$<"%TUQCOD6FM'S$(3!KXN,/N!S;J?9+FW MA0Q<&.>LNQW;RFSA`N]HT&*O!C/0EN&MLEXIS<;D:>$*`V=A/8QECUJS`L!R M/\\S[Q++*0!2V&K#,]B!:#"-`N.,SV2WOZ8DHG(ICJM2Z6)`E<\2D!-,(`G' M`,A!DO)AV,L](20MV:C4L$XX"CB41#*"R--UN;5R^Z(IL[<)%)O?9:KG9'-K[V/&37_F;C>U--(=!H#SCD6:0 M),7&IHVBUL1DU-Y:O>66RE.G>I+`@[8,"RE@F*NU2C=MD30W'D5W"]LMWC4] MMFM&QY5\<;5?:V#__@/SEQNK\Z/3X8;FSE[WD'**9``%!A($FL86JM=DP0*M,X]17&I?L/^ M`P?W[6D,E<>/K6VOGC^_-ERN?S``P_^Y$^^).WE7_K_S23;>$TD"'^-U/_&80O@%8`2X`NS__^2\L+:V\]MXW`@Y(KF5, MW[^V]%UK=,`+`(,4B%G*[Q38B(@!9L[2-$G8,\KE,E30[QGC;%2.&9`*@K]3 M+;:>O.'4>*>$T+&6Y4#[/#44V=OO_/(2'.ZM;D1ERN'CW*M/A*7JG_VI\<7YK#= M`ACM;3C#6F-CLV!@8P-!T)^8Y-;VRM&;KG_ZF2*#8U@Q4&J)M*#&,"&3>F9B8O75H)$6:I MM]*=.W=I8>Z"@8OC((S0:K5[&4X_=:%>J2XNX+,+QP.)Z:E*LSG6;75`IKBZ M?N1(>6.SKP/\W,_==^C&CP.;P"6@>>K49ZY>77G+6]XJU6B>KH:E$5S;VO[A M-4JD!U\J!$CQ=R9@`$$"C($D5DI('1"18R_(2Y*`5WJ`P6(P><>#Z4&&MBXK MU:K0]!(HE:O.^>R),\+EV4FZ>5)DA6%,]8F2;'=[W;[O=1Z M8B9%`IJP(Z944+9PA;=..%*2A!Z`$`8#OLY3DB:;WFDM)`#22@YJ*=Y[0X*$ M!@WD\C28$U1:(Z[B\9/IS$SKZ-$]EH=V33>C6&RL+B56'M@_,W?N2A1BJ(Z% M!72[V'==>'4EC^HP%MO;*(K"&!.7Y>04%I65A7Z&,,;T]/3PZ:'*N+D.[J\&A]S_3,\M*9`9W!%.@E M^)&WW='K]?[B3SYG"H0E>'\-$0P0PQ*$0"TN=1..=30]/=6ZVLTB=EEJLK2D MD22)`YQSW2ZD#*IET>^ZU<6M1CWP>5&OUT=')K->7VHJQ:5>K[U[I#$WW__@ MAU[YOOM_$^@#YP`4Q<7/?>Z+[WSG.R& M,AO,+5U=7N\Y'[!0[5[&7N2.G?>6G7#>&[:Y96L#SQH%N;SH]XO$P/E2@&J, M%QW>=63_U`W[IL:'(G*=;NM*;VNIO[UFBVZGM=)K7RV2EG!I.13-6C0R%.^: M:`XU*]6*+I=T&%*HO;>9+8P@]LSP(`=XZ1RSEPY*!N2]9V.E@):D%'GOLS27 MDDB2CK4DE5*DM"`P"\LLO!#"*ZFT\E,3X<+2^NF3^9@\R4?WW7L_EMVM1Y\X-EV&Y4RM`+IR`M3%%`!"H=&DX>:M<)DM3IUVFFW M"^\@"$+`&%Q_PT2GNSDZ.OKB6V_H=GMK5[L+EU>[/40E'+@!-]^\UZ0F2^S9 M9[8J$/98G]X__YM7H-%L`@CO#76OL& ME"YODYZ3'B/-B4Z[3ZR<=5)`!MY[7RJ7`QT;YX,@UJJ4](M&HP%!QOCQT3$2 MHIML5\HQB[Q:IS//;K_CW;?\\J_]9V`:>`P8`18__>E/W7//RV^ZZ1[KKY`( MI-I5V&U)\34RTS^X1E\LX0'OO/"!$(*\$"@8WK.0`;,WSGDAE8X*8[9[F7.N M5(H$45%DD/#>$P],?;#,SI%E*8.RU(W-7KZXM+'=9Q66B>+,L`>,\]:R,.P< M.\.^L,):199,X8I$"=1C3(SCP-[*@7W#>R:;8[6XI%W6:[76+[?6EY-NDF9I M*3!%VL[[[;S7=45?N`PFA\^T]&')-QN5X9'*:*->CK1S1=$OI&!OV!L>M-D# M2G@IE"8-9O;.,D00:"+)SEGKO'!*RC#24NG"6N^@EF9E58$D$0#`^//?2UIRZ> MSX(`00`(W'QK;;19AQ6;:UL+E])*!9TV.FUXOUTJP7O7&,9[WGO]2^Z\\^*E MA6>>FDN3M-4J&#LMISNFQVN.@U##.`AX3=(4SA1%EB3.94)[8ZPI3"_)>MV, M&6%0"8.XUTT!<6#_OD-'KO<^S9)N&*#=66^WS4W'*O_MTU\`K@.>`@)@ZR_^ MXO]62K_F-3\+M#>W6^72=4#BV,F=>]$_8HV^_E;O`2DD/$MBHD'&,YBPENQ] M5ABI=984W5YF')327I#WEMF1]V#'WK-CQ^Q86(:%*E7'-]O]Y?7.=C]G1!XA MH*0.=@S=LG&7#WCK!5MI4LA&F%VE,C-#!ZQJ';Y@ZL'MBMY MGVK%M7HXW(S'Q^-J)2R%(@IU'`510$K"^\S8M+!]0A$H!*&OE()J.=!*ET(B M"'BVN7&>R$MXY;V`%"R,]U;X`51XX,BU0K"U+"2%6@H"*0%X+SU(^IWA>R8WN3%( M4T0AK$56P%F,3T1*!H)X(;7WNFU2H"74JMY6L])7H@W900$E&(DD:H5=+OQU&4]+>=S;1"/\V%YE)4 MJM;KM:&:5J%S7@!QN3PRW)R9GN@GFW,7GT]-VXM,$N^>+?W1__4'0?1*X!20 M`?:;W_SL^OK:N]_](T)$#NU*:0I0:;X>!94=T-<_9HV^\58)P00(X4%>#4[I M=@`-59;)&J]U:;/=;_<1:.@HLL[8PFJM!SP,>,_>!JYU:0``(`!)1$%4,PL+ M8J\,M`RJEY?7%Y=;SBE/89*YPKJ@5"G8L#/..F\]V!$[:7/))B`;D*N7,3M= MNV'_V-1D3XO_.F#28KQ\7*2FCA&MX/"H"C0;,IF8VAM?6/OWNN6 M%Y>WMBP!2L%YC([Y&V[8NW)U>7)BJM>[FJ7P\%M;&)O`N][SJHL7GA^JCI\[ M.[>VAFH98)3*6%V#$/B9G[LGBFG^F3-YQI_[[',;6U"D>CUKO!^XLDA`B9W^ M(45P%I&&5*+=SH:'JWF1E*.@4@MK([5*K3Q0"VL56'9@7ZU6#A^^872B7BK) MBW//]KKMH6:0IB;IXY/_]5=F]WX8>`CH`B-///&YDR=/W'__CPO1+(IE+2>` MGH?1:M2Z/E$9*/Y1:_1-MREGF2&4]`/+,6.'.\7LK5J63U#BA=LWNGYM?WMSN]PIFZ-Q1;HP'*=)IG@A)Y)TS M.8I,^IQL+CB%<<>.SK[B9;?LW3U,MIOV-VS1%JX@$(-)20JTA^MG_2S/#;PM M++0>^-:=)R^5%\IYJP7'D8P"Y85CZ[C(76[AN!25FXT&I-YHM7N]/"I5HC#. M3*XC">(="[!26I*0"A!1N91E:9'G.E!A''AX(7P0EIPMOFU!$*1)25*A4#H( M(@_IO>CVLBR#U+"Y8+`0J#:2-"^V5I?NO.N6$R?/KVV:2@4DT=I&&$!*K*QE MQUY\F)1>6EZZZ>C-QQ^=PL<__JY7O?H7@`6@!=27E[_UP`-? M><_[WU<**H"0,AK4W@4"P!`%@/GN?70P5""^9^8.\BVWJ1T%O/-QJ+SEW%YC MBWJ9%T@R8YD!@M">E"`!CQT;)#LB,/.,AP+1VP] MC!..O5!:!F$01DJ56-!@FC&USEH;"*NE@!#>&>LL0&!GC'76L??6D3$%6)$0 M#`9Y2.>%WUFC0C`$\8`;+QTL"59:AZ'62DL2CJWGG7C9.QHHY09W$9M;(4@( M^[J;=6">/OU\ M(.++%[>R'&&(>@.;'=QWWXMG#^YZ]MDS<;5ZX?R5MPB3;VWES=$03 M%I:[1>[JC1WB0RG$8!;MQB,3S>'JTFIO:]/5:[Y:CYG\\EJ_T]W::FU<75U= M7EQ:N'+IRI6YRPL7%Y?^N,_ M_N/WOO>]S?H,O@,=IQ M19:87LIA*12#KB$0&/9:-2T,0U<8!DDE'5-[ZFI7`.0@0$ M+50$78(0[(O<6;;>>V9CM28-VIG]<#`^`Z2QY+P&Z5HYF)H8#G31Z>:9+02S MWYE$AR#AA0*L)4#`@DEHXVT_*>+81'$`*&N*:ZH$&M#=!XF5]\P66@ACD12N MGT`J1!''$O4*^EU4J]5>OW?V[%.WWWDCY%.?^H.-W3.(RS#`W$64:R@*:!T) M(L?)S.SXUR\]N[B(^A`F)K%__U[C.JV6&QUM5*K(,A0&)#E)^L,CE:U6UQJ$ M,=(4289=TSAXPTR[W=8JOG1A^<\^N]EH8*2IXVJY<,7BTE7O,3T%!93*@,?S MSZ'1Q'WWW?Q#'_TEH#CSA2\^>_[_6<^0YYQT^_,+*(\B,RCR5.A::UB",[/57;V.ATNOCPA^YY^]M_!K@*;`X&D3_SF<_<>^^]P\/[KP5,XKOO MWNY[/OA[[_6OO7G@;V0E`?8#EH<7Y#WE%KEA8WP0E-S`J0LXVE%5P*,:17F> M#XKB'K)4;V167K@\WTF++&?K!9%D[YG9>T=">"]L42@X+3UQ&@B,-K%G9FAF MK%HJ.>]2FW6M30>1I/."O2[LH-=1L)<,(80202Q4*"C+G.7SUZLKR"D;&82VT1ES!QL;2Q$1];?7*Q.1XVL_6 M-_)>#Q!X[>L.'7SQT1.//%&IR-'1QFM?=]>+7C11J827YL]6R_6UQ7YKJXA* MV&BCE^']/W%'N[>]N=WJ]^WBRM;SS_>=Q\F3+1UEUQ^:W=IJ-X9WFE"O+((9 MO_X;]_WX;_S.P3M?L7;\"\7:ZOI&*\F2-.NL;<(4F)@,^GW'#MX!WBN%(%2A M(I)6"$?")VE>"O"C[WO)1S[R'X!#\%^%T'E^]<___'\=.7+XV+$?`.+-[4MQ M5'_!]HEK$R`$N._>+__N?31-[>`@J0-*$HXTI`X\"U,@-PY0I4AZ#W9B)Q09 M&%A(@NU@+R$)DF&@0R&#PA7M;N&%\M+"#1KI><`7EA+6FA!"@J4SRB..,3Y2 MVCO=$-0W.1C6Y89X<)HBZP:N(<$@*0>2,V(EM=`">B#3L`[,9)QC=L@-DX,F MK=DZD!UT5P."A63/8&0JK-2IE!65K"@RFQ"%!%CAX86@G;\1DQR`:=@2,^>I M*XIB\*M+*3T3*_ZVA(O906(@#S9L22..4*T&41P(]E>7B_%AG'X*,CQ_T\VS M\_,+IY]\XO;;[_JMS_[WO_CM__BE+UX4$ID#$O1SO.SEI?8VLJPWLWMJ;:TS M-XQM([K;RXWQNI1'>TNB@2-.O[MOWOIL;?_!-SJ M_$/_.8XJ:<8//OC0E[]\<64=<0PPD@S&%0H$(@\VGO.T8%$,G,E2HI^@,'CW M!U[Z\S__.\`$<`9B#Y!\]:M?J]2;=]SQ!H\V(QUN3`+N6L'3XI]UR=<ED.,CV/?[M')T1K;'OD"SC%;9F\+&,-L MV3-9YSR+01()`8(BJ8,@)*6<V^,8;9"R%))-AKE6K4"+](L=YEMU(;B.%M<0ARW;WG1P3-GKL[/7SHX'AW[ MP5<>.S3ZRE<=UN%JFJ>DL'!E>/=5/DV[?*37\]-.+ERX: MJ=$8QOD+YLS9M5N.4;WF/_BA.W[LW__ODX>OWW[R2YTKWA/TFN""I#T0<#'/O:F#W_L_P1V`7-` M`B1?^^+45,\-@QE'[OQ==0T/^(?;144MY;PS`6FL`>UAC[ M;9T]DW-P%FYPV-+L!U.^.T^D-HY+'B2U#LNUM>UD=;-E&)8M,T@0>[OS+IUS MS@@?"K:#GFBI0Z'03SI,AJ2.RRK.2KWN M0+(QH%7#0UV3!0Y&?J62BMGV^OU`RZA:=M9X'M@0L:,Z9@;0*U*M2$:ADE)I M:GR^'#_@:]@;N'UO:3[1Y&AI&;!/!1!!E7E*"-C;5R-4KR M3I)TK0$(-]V(E[WTL`[?U+1R^">_ZT3?O MOO4>X,+E;_[^_/QBK3JTOK[YM0?;9Y_![MTH#!:7L;6-N)K&Y6%VO-TR;(HP M\D)PX9PCEB%8PA?0A+?=]](/_/2O`C<#QP$`M5./_>733Y_]L0]\P*&OA`8, ML&]Y[>&IL1N`Y'M7WK7GT7^XIT2^ZZ55PSD.SL]?"2,T1P&!K6V<.K&UN;YJDO4CUQ\\?>9DM[.> MV>V1D!@O3>6]*L0C@@-WC=ZV_]M[_^I\`!X$M`";#'O_[9)Y\^ M<]\/OV.D>6N:7R4I2$RM;YV:&#GLL27^OH5(_^`^*N^[70\-54EPI^,&,80# M"8J\#(V7N?.I8:D4E)2A$,H'@B6Q)A$$-BJ+O,C+C49:*$;YU)F+W3Y+7?(4 M>(I`P@LBK^`U00NI"V>'Q^K;&_U]LWCEW3?'H>>\3;8@3VG!60'2U4"&UE.6 MV:*P!9,.8E6J,H661<8^,::;9A3$B776>Y#R+(V%A*Y5:Z9(G7=NAW*HG"-G MR4*VM],@K!2Y*04Q@_-^$BIBX\C7DJ[I][)`AS(*F!V14"5E?!XHP2B8C58P M!HI0*U>(10"E2(6(`A%$I".M(N5?_K(C2O;6UHO-#5A&$(#@/7.D4;C51@.6 M80N0V#&3+R]B?75[>?G91CTVQ?:5I2T==F;W3)`WF]OKO:S7238H3-_\,Q\8 M&A]=75S8[B:M+1N6:&1\N-U;ZR3Y5A>WWC9;*1>O_:';IV;'+E^:.S^W/#_7 MB<-RJ53_RH-SBRLHU_&)W[[G%S[QTT.EWLF'/_?<\<==5W;6>/E*[^R9SL7G M80IHA5X/*D)FD>7H&>[E>>XA(RTT=_O;<36T/N_D9M=L;:N?+RWCG>^Z^5=_ M\S-`#;@(%`#.//G@PP\??\>[WCTZ-@WT`U4B$0!IN50%BAH^<7 MO.PUAI\%G,K2+(QDLUZI1O'%2UN.("4[-B"R[AKC2D"1`R21)PB2"*14(0^>8A;:LK043%\X7UAL/0[352X(PU#I@]FR<=[;(7<]EE4A'H9)2 MYGF>)0F,"\,@BDK[#QXVQBPN+GI.HE)4C<,H"I.^C\-2&.[XM<@XXXR'D0@9 M[.2W[T;*DP4/_!0YR)&+0599@#QQ`4K?^>XWH^R@*=]N/?KHR2]^Z5LG3Z/3 MPJ'=Z*6P!4@BT-`:DN$<8HF]NTKGGDN7E]KW__0]G>[*7WWEW/S\7]]^^[XC M1P]V^]OGGT^WV[VO_LD?ON)]'S#&*Q$YFV9)WFJUUM=S*7'P(&Z^Y>C-/_06 M^+-GOO3E1QY[VAE,3-9!:FGY8KN+3W[RQ;>^Y>WHK9_\_)\L+BTZ+CC7)YZ] M,G\1SJ$Q@G(=[2Y2`Z%I?9VM@#,P#"J5*CKJ)<7"TM;!/2.G3F[LWHO=NRMG M+W7R'!_^V=M^\9?_![`+.`?D@#[^\.<>?>3QC_[B_P:?7SNM?^\E_EF'I<'H MIY*O.L!@ITCH(#*V+[42@ICA&`P2)(-0":FE'*AR64*0$EHJ%4`0,Q"&=6/U M5CM?6-S(+9BD]\+O&,5IQQ'MA"=ON&`V$\-T[(9]S8IDVP\$LB+S0@R(?`S) M3IK"VZ)PCHU7!L2,HG"YS0IK+#L+MJZ06DI%UA9L"Y($"%?D_>YV;G,/'U.L&]5`!00`S M04H2PKM(J<90F<2VE`F\`Q4D\Y$/ M_^A'W_TC;WSQQM4K[/JM-=?M@SS"`*4`48C]^R=.G=P6A"S#U=7YUW_D=^^Z M]Q/[FL_U>IWUC=7)B:GO/;J)AQY\X/,/M-MYO3RY?C5[ M^)L;SY['I16PQ-BNF?KP;.[DREIO;L[7:D&U5HNCBG'>IHZ$"I6*`]ENM\M5 MU(;5W'P&@7_U"_=^Y!=_%3@&G`4V`/OLTU]_X,&O_=0'/RBE)#DVP./\2ZS1 M$B`!]C`.N?RAHS"&LZS(DGZS,:R52:T$*4$@8L`+!A$KJ83@ MW*:&G=;5PJFEJ]MKZUWCB'3HV#O/@]$?`IA9>"F$E=*8PA_:73M\_8RV"1?= M2(LB[WO`03A'EH5C88WEPA3&%E"&O74N=2:WN04[$D((I;0.`L]L3!KJJ%XK MZU!Z[T9&AV4@G;'=;F=[N]WM=PMKI:!J):HW&MX+*:G(LFZWZ]FG!;-7:99G M>6X%>T%""*D42"4'>,@E(*;VQ.HP:U5")OH`3PD(X+R!\/NC%O+J*^<5. M9EKU1KVUV7GPBU]^](&O+2ZMO._=[WSUZ^Y]RWTO_X&7[HLKR=;V1I&B5$*6 M)4GB1\>A-4Z>PN:Y/W_QX5ZP;T]SSQTJ65Y;7S?&+BS8L5$L+2W/S$YTNMW- M5EHJ(2Z5-S:V!-3(2-.S>]&+#^1YY,)YJ5QFW?1,N+AL.CW\XK^^]R=_]I/`-/`(L`'0TZ>^_L`#7[W_`S]1 MK=9)3>7IO-+!M=+1WWK1/VF%>F1BIW`:$DKR';="`FP&D%MV#`06S:& MG@&6$%*+0"FMB85A)BUK#N&EN?7M=NI$P$36#AC"@`'JXV*\RY->HM+2Q`B+I=T$`A)I7)Y:M?T@0/[W_Z.^X(H MO'#Q_-K&AG-&A3J,(U-XJ%*>V]P4`_FVEP0B$%GC!H=]241>,#M%0;T2A"J3 M&.@JI7?>"W:`\Q@>A6<\_QR./];I=K;V77?=KEW[LS0]>>*K#SWTV=,GOFQ] M][;;#K_ZWMMN/;9G>G;XPL6%2@WG+J'=P<'#6%S"0]\\-1*L+C__Z.S,K"G< MV/C(U975K39F=X?.%?5:55!_;&R42*^M;EO+^_8=",-RK]^;G]OL]W#@0'C[ M;4?C:.C$B6?^YL^^\>R9Q4".Q-'>2^>Z7_WRA2=/N**/N%(K=.Y"0"%Q*(H\ MB`,=*,N<%DFO[=+,EDN^42]+8F<,.U<;Q;DY1X1?_I6W_/A/_P90!^8!!LI/ MGOKR0]_\YH_=_P%),BPU@4SI;W^R:J#PT!H:Z+3RH)2' M<5E7JV$`ZB>=)'<6-LNAE9)0))246I/66FFO=#DS+(@D9)(F@/(.N2L@U&`3 M'03^@Y\*LD2HQABJ1S"Y,6DLV`[$RYX@020\NT$X#TFPC@%6@W*EA$`HI2XI M'8AZOJ1J7M;N%(3,Y-8'&2'/W[CU[9W>/CXU7*N6G3IU: M7ULGHF:S'NFPR'.IE`I=19=RX[(">]8J1&PX.34W-:N)V>^6+ M7SHO%<8:]5I]^%_]F_V;8!LNM93VEVHD-0]2JEJ$QYR!^_N??^Z9W_`90`9X!`.27+CSQ^2]\ M_L?O_ZE:K0[4;-%100FH`_V_A6KZ9X;V*`,>L!9)M]]5)KOFBM60$@/&,N`& MHUEA&"IX$DH**;30F@93(A9>@",=I7EFC/.2LC07%`H6KO`R4-X-O&,[)FHQ MJ+<;-(90KT3.9,1.ALAZO2P#))'DI1"ACH(51"( M:K6:YTD8AO5Z12KJ=0I(-!IU+MS,U'4WWGCCD2-'RN7R_-SEKS_\S=-//EDD MO6JUJK0>;C:-,:NK"1LO2$2Q*!D9=`7E,`8,XUD9QZ1#Z7GP0.T@C6%#G!L( M-.`B>`83,YC9^PK#%'G>;(;,O+K4$J1;K=;YYY[O=@JM0A4.FSSX M+[_WT/8&&#A\!%I6MENK_6[!(5;FT76(`Y@8>8$PL.S67+E,7D0ZS-AN;T$P MFDU(B5X/NZ;QB4_\ZUOO^BF@"EP8!/6///PW#Q__UD]_Z$/&>&`4R)160!7H M?W?CR-]*[/])5S9H@U*(ALI::8TBA[60$M4J,7.1]'H)N@F,APX011491DHJ M:`AB8GAF8XQC(W60%P5SHJ)J40S&]/0@C[A&$>-O!P_$8$9)(I#2F0R`DLID MR'.$,02D)VF)X241C"2P%UIIK4E*K:70*@QE5-(Z$'$9ZDW3!4 M8V-C4^-3TZ/3Y7+E].G3ITZ=NG#A@@`:C<;1&PZUVYV5Q2MK:^L`C#%!%(<: M4I(FD/0OS.D&E5L'&G#S+<-[JMA\NM MY2@JU2K<:Z?M&*:'=A=QA'(%C9%)SWZ#-]BSM3C[S+FSY\YHC:BN6AO=*!C_ MR?O?M=%:7MM8N'3YLG']\4D$`5;7^4WONPO!JX%MK)_\RA?HY M0&UL]/M=3(X/#P]//7'RZ<__)=K;J,0@BXP.HE7ON+&FVZZ^>2I4Y_YDV<_^3L? MN/6N7P)ZP"-`%6@]=OSA4Z=.OOE-;QX>W@5,]?OGRN41B*;S'2EB(,>_S/5" M=)X4__7M2!(HC7(9`,*28J;M;M'.!O\5Y*!D$&FM@U!J34I*'P\KX'M!@)MN"&_:/]N(6-L^V1Z* M+,EM8C`TOBMQNMO/P>'65CO+LN;DU$9F$$11J50IE^,XUIH:6NM`ZU(4;:ZO;F]M=[=;S%R- MRV$8&F.RS$%$3.'J>GMUK5,`.91Q1#H2,K#&L'.!`,'!NTB*:D@ONN&ZHKO9 M[79'1\?66QN-^DB_U[,.@$SR`A!A&&99UNUVI93->GSPP*0U[>4K5]I=5&)` M(-;8>QV&AX=G9V>V>MN;K149NF[/)@ZST["FHF4TNV>LEZPE66MH6+>V\UH# M=[_E@\!K!N`N8!KX6GKYT]]XZ'2[@POG,#:*L3',[CHMLMF!@'"&@/Z"0``W5@?"#OZLP_>N+)IR>G9@\=.2)D]-@C MCSWYS-,_\`.O.W3C?P0V@26@`.0C#W_AX>/?>MO;WK9OS]%K8\?R6J%H`./* M7Q#+BQ>D]'SMD_2";97_[K.4^^ZY4(U2M.-.%@0!*Z&T1IGA0`R=>0SR(\_L M&4R"F:QSTD%*18Z$(+#T'M;!P!:`4.K[Y@]9ABS)DS0)/3N72G9P[!R\)V,X MR_(D-8VA^GBUVFUM9WD1U^N59D-8:K76DJ0[/3M9CBK==M%.NB]_^F-E6ZWVYV8G-PU-56-PI65E0L7 M+G2[W3C0<):9%<@Y9XS1@A`1..0=X.$+0=WB6CI'CIA8,IPC!7"1)X`?&JX& M$4MMVKTEL/)::1F3XUZOO]TIF*$DXFH0E3`_MR0\>Z/J51L%*`RLP\H2%BYO M7KJP&50Q/3UTW8%=O73C_-S5I64XTZN4>OUDNURCT;'JN>?;(^.X^RV_!DP# M?:`!!,`<\.+2GL9-[8^?.+%TY$9,3=;BJ)DE2>KH#6]X=>7PJX$CP`GTGD>R M=G5U[HG3?SHZ7M]][-CVD\^8Q';;26)R4F%0+L>5N@HBZ/BVVV]*%3%RY<^-A'/Y87^0L6Z-]3-_H7NQ1+ MZ.@%"]@"W@82(E(&86$`:_W.5!VQ9\'$GIU%GCLEP4Q^IY\2?D"NW1%)XEI[ MI?\V/=0ZY`6R-,N%A+$2N?1@0A16@JA2#D5*V7I[N]=+%%`;&^W;/$M[$R.3 M0\W=RU>6YBZ<>\E==[W_W>_$T!N1_O6?_-$?/7;RA-84A@&`E<75L9'9+./V MYOK%SGDX3I+$NZ):*F^L;94BE*,PTAIPL)Z4BH,20QLGE91$D`Q-$DP8N%2@ M`/-=?WO)J^N7;8]K0^CTX8!V@BC*LP0KR^TH@I+("[!#7`%34;A-MI1T.-*H M!'`>00E:(,E`A'T':]<=VBVUER%/CXP,C>NUM;:WU>>>74HRVTO@N#AXL';' M:^X&]@'/`\\!VTA;FPL+PX?>#KQQXN8WWAU^\\KEC8WU]DBS,3D^OK;:.7]A MSIS]@_/GS@*692XUPAC5.DAW<1RKSQG7UZ"J#$8+YS=:[O?_];O`&\'GA\T@P*EO_K"?W_NW*6WOO5MDH)R:3?0_3M6Y/O[,[_^'V^-2[)P;JE2-R_*\J%:K>_;L M7EOM9EF6I5E1Y&R<^ M?O;LZ85%N[2*V4GF'@J/C0[8XM87X4UON&W_P?VX_F6`!U(45]!:1#U`J0*P MG^\?.+#JO3EQ\EMS!N^>`@U M]TQ,[`?LM04J_[_6KC4TCNN,GOGNW)G1S*Y6NWJLM)+?2FS7\B/$E"JBKAJ2 M-!#Z2$-:FD*3AE`H?:10_"N44N=OH866_FC3ED"AE)B0IB3$=NS(>=>);-6. M(UNVO)8E:[72:K6KU3SOW#O],7:P"'W1_)G?E^&;,_<[WSGG6U^@VO\Q3_J/ M.`JD4=8<2(-806`,T(D)F08J:FDD"'&5J)B`=`-7RBDJ`$RC6XZ;T(T1*J`2 M!9!2-VX>C*4K+PA@2G$I!:`TKL\OUD)-![?KK:9;K:I$%0KY4(;9L0L0J92&L?1; M$;'G^86.C$D,`&*E:UJ:!2]#H70A%%*#'7$+9$B5?`2>I.L:8BBDP:J,L5*I M5[A5R](K2ZY,,+BS_;$GOHWN+P$2V`X'FT<>VCP"X"+\P^?&7AL_-;YAH/39 MX7U&M^/.7XE$JR/;%LN9\/25\^?/"R2[AW:V]Q?#N9D/I\]?N>S'$=H,T[;- MWKZ>>[_PJ8F)\9-CI[JZ.RH+-<9PM8S^`71O[+UV=:&V./;I_2KT,Z5B7S`X M7:O59F=]MP7&&T*H;#;;:GHB,7*.97([:C+#M'<.%EY^^4RSH>K+D!SM>1@6 MFA[J38!@YW#HJ<_L",`EZ2CP!#)``UPUH++K)0)%*%"E-*8`1D4:II(@, MBTDD2C%2//VY2X4X$4SC`)344N/&364TB"!"1$()R1()Y<<@,!7K-NFN^\60OBMM2B,DBCVXPB) M@DP82-?U0J$`Z*Z[UEAVE8PMR\A8;5QG')!20D@&(D/C((TT"5)*)5)"2BD5 MF-(8`5(#5TH2D:812"%.Q;D&@$8]T$(R+6N@/UY=#=\]M?JU!P^NA0>K%0S> MAKN&=X^.WK5W9"^<+#R7&^*11QX@)O1B%D[)Z=[EH`'W[/5WWGOQK]>'AYV1 MD0/8M!VXW>SIN^.VZAVX=NFUY\;'+U6J83:[VMG5X;8BPW0F3M<2!2$0AEA> MPO&9!0!WWME1G7>S3G<^U[EO;S:6(HB:S6:]T6J6IQ?GYE>*W6V]^0TF[Y3" MJBUYX^/3_SA[*60((D@)SF$)`&`<^7X4"NW//OL'/?\58!&H@N6`I3B\?O3( MT(0%#*R9.FZ4PG%;:BK+;['WA@]-Y[N[<.-68G_W+XSY.7)\OE%%<1!"`L290NKCT5,+9;IN2\1"*JA$IGO3(DUGNFXDB*"43)-K M;ID=`%)"RG1HQ#3&H1L`B!D39R[TE'J^\[TG\[M_!!C`ZU-34[5:;6%AR20S MUYG55+):7S$8YX"28;,EI`BX#E(DA(B#$(!MVZ[KVK8"$A'[GN<"R!@&MTP9 M@YMD&@;3F:8$E`08X]"824(*I0D!:!&1H:``,UT302D3BC1T#1K1Y-J(X$.@H.)7J6AO7B[U,BK!>P_C;R^6NY7P']NSNZ^FTW5;]Y*L? ML+$/7!>-.CC'B6_]U&WAF!GL%1# MJ?<")^S9M?]S!^ZPS8[G#[]WY@P6FWZN4]>+';/5VE)C5>FRN>87-^+'3S[V MT,.'@&[@/%`&&H#56)Y\8^QX7V_//?=_,Y$2+.6\[38GXX;3CIG[&&WT/_7R M#%`WG_]=C0K"PBK(!2D8$B9!,9B6,'D^4L(5RK+-.-%!3"BT_!"(M<0D)4/A MY7*.BN,8,>>*VZ2\,)1QD*8&LIMSUU0_I,!AF%;4J"$LR2B!5(R,MC"*&)G] MIY_F^ M9QI\S8L2R,[.KN::5ZG6-FVV-0Y2X);)?5,G8L2@A,ZYSIE*5!Q*2H1A,$(< MADBX4C`\/R0.C>NN'UAV3JB0,1(R,#0C$(&I0R>20A7:L[890WA"H5);,*RV M0"H)'@1)0H8@KH3/=>0R>BSB^CQD$R=G*UP#U\$8H"`D7`DOC0@&F(D8>.G% ME69SY>FG-^X='9D]._GN^Z>E0JL%QW$'-CAF1H$'IJUGG&WUXY M=>3X;+`*UH[YIKMA$W[^BX-[]Q\$)#`!^(``NCY\_\2Q8Z^,CH[N'3X`<(T9 M0`QH*. # Redirect permanent /welcome.html http://fhist.sourceforge.net/fhist.html Redirect permanent /welcome.htm http://fhist.sourceforge.net/fhist.html Redirect permanent /index.html http://fhist.sourceforge.net/fhist.html Redirect permanent /index.htm http://fhist.sourceforge.net/fhist.html fhist-1.18/etc/i18n.cook 644 0 0 1337411265752627 142470ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ command_list = [commands]; loop { command = [head [command_list]]; if [not [count [command]]] then loopstop; command_list = [tail [command_list]]; [command],I = [fromto [command]/%0%.y [command]/%0%.gen.c,I [match_mask [command]/%0%.y [source_files]] ] [fromto [command]/%0%.c [command]/%0%.c,I [match_mask [command]/%0%.c [source_files]] ] ; } common,I = [fromto common/%0%.y common/%0%.gen.c,I [match_mask common/%0%.y [source_files]] ] [fromto common/%0%.c common/%0%.c,I [match_mask common/%0%.c [source_files]] ] ; all,I = [fromto %0%.y %0%.gen.c,I [match_mask %0%.y [source_files]]] [fromto %0%.c %0%.c,I [match_mask %0%.c [source_files]]] ; /* * Translate the locatization files into their binary form. This will * be different for each architecture and operating system (in theory, * if not in practice). */ internationalization: lib/common.ok [fromto lib/%0%.po [arch]/lib/%0%.mo [match_mask lib/%0%.po [source_files]] ] [fromto lib/%0%.po lib/%0%.merge [match_mask lib/%0%.po [source_files]] ] /* LICENSE */ ; lib/common.ok: lib/common.pot etc/zer-len-msg.sh { sh [resolve etc/zer-len-msg.sh lib/common.pot]; touch [target]; } msgcomm = msgcomm; lib/common.pot: [prepost "lib/" ".po" [commands]] { [msgcomm] --force-po --omit-header --sort-output --add-location --indent --width\=75 -o [target] [prepost "--dir=" "" [search_list]] [need]; } msgmerge = msgmerge; msgcmp = msgcmp; lib/%0%.merge: lib/%0%.po lib/%.po { [msgmerge] [addprefix --compendium\= [glob "c/%0*.po" ]] ['if' [not [in % common]] 'then' --compendium\=[resolve lib/%0common.po] ] --indent --sort-output --width\=75 -v -v --no-location --force-po -o [target] [resolve lib/%0%.po lib/%.po] ; /* * There should be no differences. * If there are, this next command will show them. */ [msgcmp] --use-fuzzy [resolve lib/%0%.po] [target]; /* * Only need the timestamp, discard the file contents. */ > [target]; } [arch]/lib/%0%.mo: lib/%0%.po: lib/%0common.po etc/msgfmt.sh set ['if' [not [defined baseline]] 'then' shallow] { /* * This only works for GNU gettext (and Solaris). * The SunOS msgfmt program does not grok the -o option. */ sh [resolve etc/msgfmt.sh] --msgfmt\=[msgfmt] --msgcat\=[msgcat] --output\=[target] [resolve lib/%0%.po lib/%0common.po] ; } xgettext = xgettext; /* * These files act as a "header files" to check the lib/%0%.po files * against. There should not be any extras or omitions. */ lib/common.po: [all,I] [prepost "lib/en/LC_MESSAGES/" ".po" [commands]] { /* * The author only speaks English, so the master translation is * "en", hence lib/en/LC_MESSAGES/....po are the files intended. */ [xgettext] --sort-output --indent --omit-header --add-location --force-po --width\=75 -o [target] [prepost "--dir=" "" [search_list]] [prepost "--exclude-file=lib/en/LC_MESSAGES/" ".po" [commands]] --language\=PO [all,I]; } lib/%.po: [%,I]: lib/en/LC_MESSAGES/common.po { /* * The author only speaks English, so the master translation is * "en", hence lib/en/LC_MESSAGES/common.po is the file * intended. */ [xgettext] --sort-output --indent --omit-header --add-location --force-po -o [target] [prepost "--dir=" "" [search_list]] --exclude-file\=lib/en/LC_MESSAGES/common.po --language\=PO [%,I]; } %0%.c,I: %0%.c set no-cascade { [xgettext] --sort-output --indent --omit-header --force-po --add-location -o [target] --msgstr-prefix\= --msgstr-suffix\= --keyword\=i18n --keyword\=error_intl --keyword\=fatal_intl --keyword\=verbose_intl --keyword\=subst_intl --keyword\=fngrprnt_error --keyword\=lex_error --keyword\=lex_warning [prepost "--dir=" "" [search_list]] %0%.c; } fhist-1.18/etc/libdir-h.in 644 0 0 320011265752627 146000ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1998, 2004, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . * * @configure_input@ */ #ifndef ETC_LIBDIR_H #define ETC_LIBDIR_H /* * LIBDIR is for architecture-specific files * On a network, this would only be shared between machines * of identical cpu-hw-os flavour. It can be read-only. */ #define LIBDIR "@libdir@" /* * DATADIR is for architecture-neutral files * On a network, this would be shared between all machines * on the network. It can be read-only. */ #define DATADIR "@datadir@" /* * MANDIR is for manual entries, architecture-neutral by definition * On a network, this would be shared between all machines * on the network. It can be read-only. */ #define MANDIR "@mandir@" /* * NLSDIR is used for machien specific locale (.mo) files. * If not set ./configure defaults it to LIBDIR */ #define NLSDIR "@NLSDIR@" #endif /* ETC_LIBDIR_H */ fhist-1.18/etc/msgfmt.sh 644 0 0 375011265752627 144210ustar PeterMiller 0 0#!/bin/sh # # fhist - file history and comparison tools # Copyright (C) 2002, 2008 Peter Miller # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see # . # input= output=- msgfmt= msgcat= # # read the command line arguments # while [ $# -gt 0 ] do case "$1" in -*=*) name="`echo $1 | sed -e 's|^-*||' -e 's|=.*||'`" value="`echo $1 | sed 's|.*=||'`" eval "$name='$value'" ;; -*) # ignore unknown options. ;; *) input="$input $1" ;; esac shift done test "$input" != "" || input=- test "$msgfmt" != "" || msgfmt=msgfmt # # See which way we should handle the processing. # exitstatus=1 if [ "$msgcat" != "" ] then # # Versions of GNU Gettext which supply the `msgcat' program (for # joining message catalogues together) have a msgfmt program which # objects to duplictes in the input. # # We use msgcat to resolve the duplicate (msgid "", the file header). # if $msgcat --use-first --force-po $input > /tmp/$$ then if $msgfmt -o $output /tmp/$$ then exitstatus=0 fi fi rm /tmp/$$ else # # Old versions of GNU Gettext, and gettext from dumber # implementations, simply glue it all together. # if $msgfmt -o $output $input then exitstatus=0 fi fi exit $exitstatus fhist-1.18/etc/patch.file.sh 644 0 0 212411265752627 151330ustar PeterMiller 0 0#!/bin/sh # # fhist - file history and comparison tools # Copyright (C) 1993, 1994, 1998, 2008 Peter Miller # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see # . # orig=$1 path=$2 name=$3 tmp=/tmp/$$ trap "rm $tmp; exit 1" 1 2 3 15 echo diff -c $orig $path 1>&2 diff -c $orig $path > $tmp case $? in 0) ;; 1) echo "Index: $name" sed '1,2d' < $tmp ;; *) rm $tmp exit 1 ;; esac rm $tmp exit 0 fhist-1.18/etc/patches.sh 644 0 0 227611265752627 145550ustar PeterMiller 0 0#!/bin/sh # # fhist - file history and comparison tools # Copyright (C) 1992-1994, 1998, 2008 Peter Miller # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see # . # # # Emit some blurb about the patch file # echo "#! /bin/sh" echo "#" echo "# This is a self-applying patch in a shell script." echo "#" echo "# Change directory to the appropriate place" echo "# before applying running this shell script." echo "#" echo "# Don't forget the -p0 option if you apply this patch manually." echo "#" echo echo "patch -p0 << 'fubar'" cat $* echo fubar exit 0 fhist-1.18/etc/ptx.ignore 644 0 0 147411265752627 146110ustar PeterMiller 0 0# # fhist - file history and comparison tools # Copyright (C) 1998, 2008 Peter Miller # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see # . # a as and be by of the to fhist-1.18/etc/ptx.sh 644 0 0 161511265752627 137350ustar PeterMiller 0 0#!/bin/sh # # fhist - file history and comparison tools # Copyright (C) 1998, 2008 Peter Miller # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see # . # for f in $* do ff=`echo $f | sed 's|^lib/../|../|'` echo ".so $ff" done exit 0 fhist-1.18/etc/ptx1.awk 644 0 0 677011265752627 141750ustar PeterMiller 0 0# # fhist - file history and comparison tools # Copyright (C) 1998, 2008 Peter Miller # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see # . # function getc() { getc_tmp = substr(getc_buf, getc_pos, 1) if (getc_tmp != "") ++getc_pos return getc_tmp } BEGIN { th_name = "none" th_section = "none" active = 0 } /^\.ds n)/ { _n_ = $3 } /^\.TH/ { # watch out for the quotes getc_buf = $0 getc_pos = 4 argc = 0 for (;;) { c = getc() while (c == " " || c == "\t") c = getc() if (c == "") break quoted = 0 arg = "" for (;;) { if (c == "\"") quoted = !quoted else if (c == "") break else if (!quoted && (c == " " || c == "\t")) break else arg = arg c c = getc() } argv[++argc] = arg } # th_name = argv[1] # gsub(/\\\*\(n\)/, (_n_ == "" ? "cook" : _n_), th_name) # th_section = argv[2] th_name = FILENAME sub(/^.*\//, "", th_name) sub(/\.[0-9]$/, "", th_name) th_section = FILENAME sub(/^.*\./, "", th_section) active = 0 next } /^\.SH/ { active = ($2 == "NAME") next } /^['.]\\"/ { # ignore comments next } /^['.]XX/ { # ignore indexing next } /^['.]/ { if (active) { sub(/^.[a-zA-Z][a-zA-Z]*[ ]*/, "") print th_name "(" th_section ") " $0 } next } { if (active) { gsub(/ /, " ") # Translate tabs to spaces gsub(/__*/, " ") # Collapse underscores gsub(/ +/, " ") # Collapse spaces gsub(/ *, */, ", ") # Fix comma spacings sub(/^ /, "") # Kill initial spaces sub(/ $/, "") # Kill trailing spaces gsub(/\\f\(../, "") # Kill font changes gsub(/\\f./, "") # Kill font changes gsub(/\\s[-+0-9]*/, "") # Kill size changes gsub(/\\&/, "") # Kill \& gsub(/\\\((ru|ul)/, "_") # Translate gsub(/\\\((mi|hy|em)/, "-") # Translate gsub(/\\\*\(n\)/, (_n_ == "" ? "cook" : _n_)) gsub(/\\\*\(../, "") # Kill troff strings gsub(/\\/, "") # Kill all backslashes print th_name "(" th_section ") " $0 } } fhist-1.18/etc/ptx2.awk 644 0 0 213311265752627 141630ustar PeterMiller 0 0# # fhist - file history and comparison tools # Copyright (C) 1998, 2008 Peter Miller # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see # . # BEGIN { print ".hy 0" print ".TS" print "l r lw(2.5i) lw(2.5i)." } { print $10 "\t\\*[Page*Of*" $10 "]\tT{" print ".ad r" print $4 print "T}\tT{" print ".ad l" print $6 print "T}" } END { print ".TE" print ".ad b" } fhist-1.18/etc/ref-toc.so 644 0 0 307611265752627 144730ustar PeterMiller 0 0.\" .\" fhist - file history and comparison tools .\" Copyright (C) 1998, 2008 Peter Miller .\" .\" This program is free software; you can redistribute it and/or modify .\" it under the terms of the GNU General Public License as published by .\" the Free Software Foundation; either version 3 of the License, or .\" (at your option) any later version. .\" .\" This program is distributed in the hope that it will be useful, .\" but WITHOUT ANY WARRANTY; without even the implied warranty of .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the .\" GNU General Public License for more details. .\" .\" You should have received a copy of the GNU General Public License .\" along with this program. If not, see .\" . .\" .\" ---------- XX ----------------------------------------------------------- .\" .\" The XX macro accumulates table of contents entries. It takes two .\" arguments, first is the page title, the second is the page .\" description. The current page number in the \n% register is .\" consulted to obtain the page number. .\" .de XX .ds Page*Of*\\$1 \\n% .da toc*div .ev h .ds toc*num \\n% .ll -8n .in 0 \\$1\\t\\$2 \\a\\t\\*[toc*num] .br .ll +8n .rm toc*num .ev .di .. .\" ---------- TC ----------------------------------------------------------- .\" .\" The TC macro prints the table of contents collected by uses of the .\" XX macro. .\" .de TC .nf .char \[toc*leader-char] .\h'1m' .lc \[toc*leader-char] .ta 0.9i (u;\\n[.l]-\\n[.i]-\w'000') (u;\\n[.l]-\\n[.i])R .toc*div .fi .. fhist-1.18/etc/release.man 644 0 0 1447311265752627 147310ustar PeterMiller 0 0'\" t .\" fhist - file history and comparison tools .\" Copyright (C) 2003, 2008, 2009 Peter Miller .\" .\" This program is free software; you can redistribute it and/or modify .\" it under the terms of the GNU General Public License as published by .\" the Free Software Foundation; either version 3 of the License, or .\" (at your option) any later version. .\" .\" This program is distributed in the hope that it will be useful, .\" but WITHOUT ANY WARRANTY; without even the implied warranty of .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the .\" GNU General Public License for more details. .\" .\" You should have received a copy of the GNU General Public License .\" along with this program. If not, see .\" . .\" .ds n) fhist .TH "Release" "FHist" "FHist" "FHist" .if n .ftr CB B .if n .ftr CI I .if n .ftr CW R .if n .ftr C R .if n .ad l .if n .hy 0 .so version.so .de e( .br .ne 2i .RS .ft CW .nf .sp .. .de e) .sp .fi .ft R .RE .. .SH NAME How to release a version of FHist .SH CHECKLIST This document describes the steps involved in issuing a new release of FHist. It is a simple procedure, but there is enough to do, and it happens sufficiently rarely, that it was worth writing down. .br .ne 2i .SH NEW BRANCH The version stamping is \fIpost\fP-numbered. You decide what major or minor version number you want as you are about to release, not when you start work. .PP Finish development of the branch in the normal way. For example, if you are working on project \fIfhist.51.19\fP, then you would say .e( % \f[CB]aede -p fhist.51 19\fP % \f[CB]aerpass -p fhist.51 19\fP % \f[CB]aeib -p fhist.51 19\fP % \f[CB]aed -p fhist.51 19\fP % \f[CB]aeb -p fhist.51 19\fP % \f[CB]aet -p fhist.51 19\fP % \f[CB]aet -reg -p fhist.51 -c 19\fP % \f[CB]aeipass -reg -p fhist.51 -c 19\fP % .e) At this point, branch 19 if project \fIfhist.51\fP is completed. Cut a new branch, as follows .e( % \f[CB]aenbr -p fhist.51 20\fP % .e) The branch number will default. This is OK unless you ever skipped a number - in which case it will back fill which is usually undesirable. .PP At this point project \fIfhist.51.20\fP is ready for use. If you want a major version number increment, the process is similar, however you must also terminate the \fIfhist.51\fP branch, and you may well want to create a branch on the branch, to get back to a two-number version scheme. .e( aede -p fhist.51 19 \fIet al, to complete\fP aede -p fhist 51 \fIet al, to complete\fP aenbr -p fhist 52 aenbr -p fhist 52 0 .e) The purpose of a \fIpost\fP-numbered branching scheme is that, at any point, you can cut a suitable bug-fix sub-branch. .br .ne 2i .SS Verify New Branch Create a new change on the branch you just created, and start development of it. .PP Update any version numbering files, or create any special release notes files, \fIetc\fP, as required. Much of this can be obtained from Aegis, but not all of it. .br .ne 2i .SH ARCHIVES Once a viable release is ready, it is necessary to upload it to the archives. .SS Update Primary Archive Transfer a copy to \f[CW]fhist.sourceforget.net\fP by scp. Use the following commands .e( % \f[CB]aecd -bl archive\fP % PLASTICFS=`aesub -bl 'viewpath ${split : $sp}'` \e LD_PRELOAD=libplasticfs.so \e \f[CB]/usr/bin/rsync --rsh=ssh \e -l -r -t -z --stats --delete \e --progress --exclude '*,*' -v \e `aegis -cd -bl archive` \e fhist.sourceforge.net:/home/groups/f/fh/fhist/htdocs/.\fP % .e) .PP And also transfer the Aegis project tree... .e( #!/bin/sh # # Sync this directory tree with fhist.SourceForge.net # /usr/bin/rsync --rsh=ssh -l -p -r -t -z --stats \e --exclude bin \e --exclude archive \e --exclude linux-i486 \e --exclude "*.[ao]" \e --exclude "*.[ch].d" \e --exclude "*.so.d" \e --exclude "*.gen.[ch]" \e --exclude "*,*" \e --exclude ".cook.fp" \e --exclude aegis.log \e --exclude doxygen-html \e --delete \e --delete-excluded \e --progress -v \e `aegis -cd -bl .. -p fhist` \e fhist.sourceforge.net:/home/groups/f/fh/fhist/fhist/. .e) But this is all in a shell script to reduce typing, so all you need to do is .e( % \f[CB]aecd -bl .. -p fhist\fP % \f[CW]./rsync-sourceforge\fP % .e) .PP Transfer a copy to \f[CW]upload.sourceforge.net\fP by FTP. Login as \f[CW]anonymous\fP and change to the \f[CW]/incoming\fP directory. Use the following commands .e( % \f[CB]aecd -bl archive\fP % \f[CW]ftp upload.sourceforge.net\fP user: \f[CB]anonymous\fP ftp> \f[CB]cd /incoming\fP ftp> \f[CB]binary\fP ftp> \f[CB]put fhist-\*(v).tar.gz\fP ftp> \f[CB]quit\fP % .e) .br .ne 2i .SH NOTIFICATION Once the archives are ready, you can let folks know it's there. .LP Only send the notifications \fIafter\fP the files are actually available at the archive site. .br .ne 2i .SS SourceForge.Net This is \fIway\fP harder than any sane person expects. Go to http://sourceforge.net and login then go to http://sourceforge.net/projects/fhist/ and click the \fBAdmin\fP link, and the \fBEdit/Release Files\fP link, and the \fB[Add Release]\fP link. In the "\fINew Release Name\fP" box put the version number (dumb, huh?). In the "\fIPaste The Notes In\fP" box type .RS http://fhist.sourceforge.net/download.html .RE In the "\fIPaste The Change Log In\fP" box type .RS http://fhist.sourceforge.net/ChangeLog .RE And then finish the rest of the rather cumbersome dialog gunk. .SS Notify Mailing List Send a notification to the \fIfhist-users@lists.sourceforge.net\fP list. It should look like this: .e( To: fhist-users@lists.sourceforge.net Reply-To: pmiller@opensource.org.au Subject: FHist \*(v) \- file history tool .fi I am pleased to announce that FHist \*(v) is now available. .sp You are invited to visit .ce 1 http://fhist.sourceforge.net/ for a more complete description of what FHist is, and access to the download files. .sp For information about what new features are available in this release, please see the README file available at the above site. .sp \fIput your \f[CW].sig\fI file here .e) .PP Only send this notification \fIafter\fP the files are actually available at the archive site. .SS Notify Web \(bu) Notify \f[CW]www.freshmeat.net\fP that a new release of Aegis is available. Search for ``fhist'' as there is already an application record. .so ../lib/en/man1/z_cr.so fhist-1.18/etc/rpm-build.sh 644 0 0 272711265752627 150220ustar PeterMiller 0 0#!/bin/sh # # fhist - file history and comparison tools # Copyright (C) 1998, 1999, 2004, 2008 Peter Miller # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see # . # case $# in 2) ;; *) echo "Usage: $0 tmp-dir tarball" 1>&2 exit 1 ;; esac tmp=$1 tarball=$2 mkdir -p $tmp/BUILD $tmp/BUILD_ROOT $tmp/RPMS/i386 \ $tmp/SOURCES $tmp/SPECS $tmp/SRPMS here=`pwd`/$tmp cat > $tmp/macros << fubar %_builddir $here/BUILD %_buildroot $here/BUILD_ROOT %_rpmdir $here/RPMS %_sourcedir $here/SOURCES %_specdir $here/SPECS %_srcrpmdir $here/SRPMS fubar mac=`rpm --showrc | awk '/^macrofile/{print $3}'` cat > $tmp/rpmrc << fubar macrofiles: ${mac}:$here/macros fubar rpmbuild -ta --rcfile /usr/lib/rpm/rpmrc:${tmp}/rpmrc --verbose --verbose $2 test $? -eq 0 || exit 1 exit 0 fhist-1.18/etc/so.sh 644 0 0 166211265752627 135450ustar PeterMiller 0 0#!/bin/sh # # fhist - file history and comparison tools # Copyright (C) 1998, 2008, 2009 Peter Miller # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or (at # your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # sortflag= if test "$1" = "-r"; then sortflag=-r shift fi echo $* | tr ' ' '\12' | sort $sortflag -n -t. -k 2,2.2 -k 3 | while read f do echo ".br" echo ".ne 2i" echo ".so $f" done exit 0 fhist-1.18/etc/spec.sh 644 0 0 736711265752627 140660ustar PeterMiller 0 0#!/bin/sh # # fhist - file history and comparison tools # Copyright (C) 1998, 1999, 2001, 2008, 2009 Peter Miller # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see # . # version=${version-0.0.0} echo 'Summary: file history and comparison tools' echo 'Name: fhist' echo "Version: ${version}" echo 'Release: 1' echo 'Copyright: GPL' echo 'Group: Development/Tools' echo "Source: http://fhist.sourceforge.net/fhist-${version}.tar.gz" echo 'URL: http://fhist.sourceforge.net/' echo 'BuildRoot: /tmp/fhist-build-root' prefix=/usr # # RPM only has install-time relocatable packages. It has no support for # build-time relocatable packages. Therefore, we must NOT specify a Spec # prefix, or the installed locations will not match the built locations. # #echo "Prefix: $prefix" echo '' cat << 'fubar' %description The FHist package contains 3 utilities, a file history tool ``fhist'', a file comparison tool ``fcomp'', and a file merging tool ``fmerge''. All three are bundled together, because they all use the same minimal-difference algorithm. The history tool presented here, fhist, is a minimal history tool. It provides no locking or branching. This can be useful in contexts where the configuration management or change control be being provided by some other tool. %prep fubar # # set the prefix here # echo '%setup' echo '' echo '%build' echo "./configure --prefix=$prefix" echo 'make' echo '' echo '%install' echo 'make RPM_BUILD_ROOT=$RPM_BUILD_ROOT install' # # remember things for the %files section # binfiles= files= remember_prog() { if eval "test \"\${prog_${1}-no}\" != yes" then eval "prog_${1}=yes" binfiles="$binfiles $prefix/bin/${1}" fi } for file in $* do case $file in txt2c/*) ;; */main.c) dir=`echo $file | sed 's|\([^/]*\)/.*|\1|'` remember_prog $dir ;; lib/*/*/*.so) ;; lib/*/man?/*.[1-9]) stem=`echo $file | sed 's|^lib/||'` files="$files $prefix/share/fhist/${stem}*" case $file in lib/en/*) stem2=`echo $file | sed 's|^lib/en/||'` files="$files $prefix/man/${stem2}*" ;; esac ;; lib/*/LC_MESSAGES/common.po) ;; lib/*.po) stem=`echo $file | sed 's|^lib/\(.*\)\.po$|\1|'` dst="$prefix/lib/fhist/$stem.mo" files="$files $dst" ;; lib/*/*/main.*) stem=`echo $file | sed 's|^lib/\(.*\)/main.*$|\1|'` files="$files $prefix/share/fhist/$stem.ps" files="$files $prefix/share/fhist/$stem.dvi" files="$files $prefix/share/fhist/$stem.txt" ;; *) ;; esac done echo '' echo '%files' for file in $binfiles do echo "%attr(0755,root,bin) $file" done for file in $files do echo "%attr(0644,root,bin) $file" done echo '' echo '%clean' echo 'rm -rf $RPM_BUILD_ROOT' fhist-1.18/etc/ssp.awk 644 0 0 166211265752627 141010ustar PeterMiller 0 0# # fhist - file history and comparison tools # Copyright (C) 1998, 2008 Peter Miller # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see # . # BEGIN { count = -99999 } /^[ ]*$/ { ++count; next } { if (count > 0) print "" print $0 count = 0 } fhist-1.18/etc/tags.cook 644 0 0 221011265752627 143710ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 2002, 2008 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . */ if [find_command ctags] then all += tags TAGS; tags: [change_source_files] { ctags -f [target] -L- --c-types\=+px set meter; data [unsplit "\n" [resolve [source_files]]] dataend } TAGS: [change_source_files] { ctags -e -f [target] -L- --c-types\=+px set meter; data [unsplit "\n" [resolve [source_files]]] dataend } fhist-1.18/etc/template/c 644 0 0 202711265752627 145440ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) ${date %Y} Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include <${basename $filename .c}.h> /* * NAME * ${basename $filename .c} * * SYNOPSIS * void ${basename $filename .c}(void); * * DESCRIPTION * The ${basename $filename .c} function is used to * * RETURNS * void * * CAVEATS */ void ${basename $filename .c}(void) { } fhist-1.18/etc/template/generic 644 0 0 133711265752627 157410ustar PeterMiller 0 0# # fhist - file history and comparison tools # Copyright (C) ${date %Y} Peter Miller # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or (at # your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # :-) exit 0 fhist-1.18/etc/template/h 644 0 0 157111265752627 145540ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) ${date %Y} Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef ${upcase ${id $fn}} #define ${upcase ${id $fn}} #include void ${basename $filename .h}(void); #endif /* ${upcase ${id $fn}} */ fhist-1.18/etc/template/man 644 0 0 215111265752627 150730ustar PeterMiller 0 0'\" t .\" fhist - file history and comparison tools .\" Copyright (C) ${date %Y} Peter Miller .\" .\" This program is free software; you can redistribute it and/or modify .\" it under the terms of the GNU General Public License as published by .\" the Free Software Foundation; either version 3 of the License, or .\" (at your option) any later version. .\" .\" This program is distributed in the hope that it will be useful, .\" but WITHOUT ANY WARRANTY; without even the implied warranty of .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU .\" General Public License for more details. .\" .\" You should have received a copy of the GNU General Public License .\" along with this program. If not, see . .\" .ds n) ${basename $fn .1} .TH \*(n) 1 .SH NAME \*(n) \- file history and comparison tools .SH SYNOPSIS .B \*(n) [ .IR option \&... ] .IR filename \&... .br .B \*(n) .B -Help .br .B \*(n) .B -VERSion .SH DESCRIPTION The .I \*(n) program is used to .SH OPTIONS The following options are understood: .so o_help.so .so o_version.so .so o__rules.so .so z_exit.so .so z_cr.so fhist-1.18/etc/template/ms 644 0 0 140611265752627 147410ustar PeterMiller 0 0.\" .\" fhist - file history and comparison tools .\" Copyright (C) ${date %Y} Peter Miller .\" .\" This program is free software; you can redistribute it and/or .\" modify it under the terms of the GNU General Public License as .\" published by the Free Software Foundation; either version 3 of the .\" License, or (at your option) any later version. .\" .\" This program is distributed in the hope that it will be useful, .\" but WITHOUT ANY WARRANTY; without even the implied warranty of .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU .\" General Public License for more details. .\" .\" You should have received a copy of the GNU General .\" Public License along with this program. If not, see .\" . .\" fhist-1.18/etc/template/sh 644 0 0 134511265752627 147360ustar PeterMiller 0 0#!/bin/sh # # fhist - file history and comparison tools # Copyright (C) ${date %Y} Peter Miller # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or (at # your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # exit 0 fhist-1.18/etc/template/test 644 0 0 341011265752627 152760ustar PeterMiller 0 0#!/bin/sh # # fhist - file history and comparison tools # Copyright (C) ${date %Y} Peter Miller # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or (at # your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # work=/tmp/$$$$ PAGER=cat export PAGER LINES=24 export LINES COLS=80 export COLS no_result() { set +x echo 'NO RESULT test of the ??? functionality' 1>&2 cd $$here rm -rf $$work exit 2 } fail() { set +x echo 'FAILED test of the ??? functionality' 1>&2 cd $$here rm -rf $$work exit 1 } pass() { set +x echo PASSED 1>&2 cd $$here rm -rf $$work exit 0 } trap "fail" 1 2 3 15 # # use the built-in error messages # FHIST_MESSAGE_LIBRARY=$$work/no-such-dir export FHIST_MESSAGE_LIBRARY unset LANG unset LANGUAGE here=`pwd` if test $$? -ne 0 ; then exit 2; fi mkdir $$work if test $$? -ne 0 ; then exit 2; fi cd $$work if test $$? -ne 0 ; then no_result; fi if [ "$$1" != "" ]; then bin=$$here/$$1/bin; else bin=$$here/bin; fi # # test the ??? functionality # $$bin/myprog if test $$? -ne 0 ; then fail; fi # # Only definite negatives are possible. # The functionality exercised by this test appears to work, # no other guarantees are made. # pass fhist-1.18/etc/version.so 644 0 0 21711265752627 145730ustar PeterMiller 0 0.ds V) 1.18.D001 .ds v) 1.18 .ds Y) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009 fhist-1.18/etc/zer-len-msg.sh 644 0 0 223011265752627 152540ustar PeterMiller 0 0#!/bin/sh # # fhist - file history and comparison tools # Copyright (C) 1998, 2008 Peter Miller # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see # . # if test -f $1 -a -s $1 then ok=lib/en/LC_MESSAGES echo "" echo " There should be no messages common to any commands which" echo " are not in the lib/en/LC_MESSAGES/common.po file." echo " Move the mesages found in $1 into the" echo " lib/en/LC_MESSAGES/common.po file." echo "" exit 1 fi exit 0 fhist-1.18/fcomp/main.c 644 0 0 2752211265752627 142340ustar PeterMiller 0 0/* * fhist - file history and comparison tools * Copyright (C) 1991-1994, 1998-2000, 2002, 2008 Peter Miller * * Derived from a work * Copyright (C) 1990 David I. Bell. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * fcomp - a file comparison program */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include enum { arglex_token_binary, arglex_token_binary_not, arglex_token_blank, arglex_token_context, arglex_token_debug, arglex_token_edit, arglex_token_failures, arglex_token_join, arglex_token_line_numbers, arglex_token_matching, arglex_token_output, arglex_token_quiet, arglex_token_spaces, arglex_token_upcase, arglex_token_verbose, arglex_token_what, }; static arglex_table_ty argtab[] = { { "-BINary", arglex_token_binary }, { "-No_BINary", arglex_token_binary_not }, { "-Blank", arglex_token_blank }, { "-Context", arglex_token_context }, { "-Debug", arglex_token_debug }, { "-Edit", arglex_token_edit }, { "-Failures", arglex_token_failures }, { "-Join", arglex_token_join }, { "-Number", arglex_token_line_numbers }, { "-Matching", arglex_token_matching }, { "-Output", arglex_token_output }, { "-Quiet", arglex_token_quiet }, { "-Spaces", arglex_token_spaces }, { "-Upcase", arglex_token_upcase }, { "-Verbose", arglex_token_verbose }, { "-What", arglex_token_what }, { 0, 0 }, /* end marker */ }; /* * Type out the possible commands. */ static void usage(void) { char *progname; progname = progname_get(); fprintf(stderr, "usage: %s [