summaryrefslogtreecommitdiff
path: root/Build/source/texk/chktex
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-01-17 21:41:51 +0000
committerKarl Berry <karl@freefriends.org>2006-01-17 21:41:51 +0000
commit487ca4806cc046076293cf6cc5fbba0db282bac7 (patch)
tree847b412ab5158dd7bdd7ed7e5a4cc3fbca94be32 /Build/source/texk/chktex
parenta3d3111bfe26b8e5f5bc6049dfb2a4ca2edc7881 (diff)
texk 1
git-svn-id: svn://tug.org/texlive/trunk@1485 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/chktex')
-rw-r--r--Build/source/texk/chktex/COPYING325
-rw-r--r--Build/source/texk/chktex/ChkTeX.readme515
-rw-r--r--Build/source/texk/chktex/ChkTeX.tex2111
-rw-r--r--Build/source/texk/chktex/FindErrs.c1485
-rw-r--r--Build/source/texk/chktex/FindErrs.h195
-rw-r--r--Build/source/texk/chktex/HashWord.a122
-rw-r--r--Build/source/texk/chktex/MakeHTML.in20
-rw-r--r--Build/source/texk/chktex/Makefile.in345
-rw-r--r--Build/source/texk/chktex/OpSys.c644
-rw-r--r--Build/source/texk/chktex/OpSys.h217
-rw-r--r--Build/source/texk/chktex/Resource.c518
-rw-r--r--Build/source/texk/chktex/Resource.h64
-rw-r--r--Build/source/texk/chktex/Test.out408
-rw-r--r--Build/source/texk/chktex/Test.tex181
-rw-r--r--Build/source/texk/chktex/Utility.c937
-rw-r--r--Build/source/texk/chktex/Utility.h181
-rw-r--r--Build/source/texk/chktex/chktex.c1080
-rw-r--r--Build/source/texk/chktex/chktex.el77
-rw-r--r--Build/source/texk/chktex/chktex.h375
-rw-r--r--Build/source/texk/chktex/chktexrc670
-rw-r--r--Build/source/texk/chktex/chktypes.h76
-rw-r--r--Build/source/texk/chktex/chkweb56
-rw-r--r--Build/source/texk/chktex/config.h.in127
-rwxr-xr-xBuild/source/texk/chktex/configure2536
-rw-r--r--Build/source/texk/chktex/configure.in181
-rw-r--r--Build/source/texk/chktex/depend.mak88
-rw-r--r--Build/source/texk/chktex/deweb.1116
-rw-r--r--Build/source/texk/chktex/deweb.doc132
-rw-r--r--Build/source/texk/chktex/deweb.in122
-rw-r--r--Build/source/texk/chktex/getopt.c756
-rw-r--r--Build/source/texk/chktex/getopt.h129
-rw-r--r--Build/source/texk/chktex/getopt1.c189
-rw-r--r--Build/source/texk/chktex/input.tex1
-rw-r--r--Build/source/texk/chktex/win32.mak65
34 files changed, 15044 insertions, 0 deletions
diff --git a/Build/source/texk/chktex/COPYING b/Build/source/texk/chktex/COPYING
new file mode 100644
index 00000000000..10d1e0b82d3
--- /dev/null
+++ b/Build/source/texk/chktex/COPYING
@@ -0,0 +1,325 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your freedom to
+share and change it. By contrast, the GNU General Public License is intended
+to guarantee your freedom to share and change free software--to make sure the
+software is free for all its users. This General Public License applies to
+most of the Free Software Foundation's software and to any other program whose
+authors commit to using it. (Some other Free Software Foundation software is
+covered by the GNU Library General Public License instead.) You can apply it
+to your programs, too.
+
+ When we speak of free software, we are referring to freedom, not price. Our
+General Public Licenses are designed to make sure that you have the freedom to
+distribute copies of free software (and charge for this service if you wish),
+that you receive source code or can get it if you want it, that you can change
+the software or use pieces of it in new free programs; and that you know you
+can do these things.
+
+ To protect your rights, we need to make restrictions that forbid anyone to
+deny you these rights or to ask you to surrender the rights. These
+restrictions translate to certain responsibilities for you if you distribute
+copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether gratis or
+for a fee, you must give the recipients all the rights that you have. You
+must make sure that they, too, receive or can get the source code. And you
+must show them these terms so they know their rights.
+
+ We protect your rights with two steps: (1) copyright the software, and (2)
+offer you this license which gives you legal permission to copy, distribute
+and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain that
+everyone understands that there is no warranty for this free software. If the
+software is modified by someone else and passed on, we want its recipients to
+know that what they have is not the original, so that any problems introduced
+by others will not reflect on the original authors' reputations.
+
+ Finally, any free program is threatened constantly by software patents. We
+wish to avoid the danger that redistributors of a free program will
+individually obtain patent licenses, in effect making the program proprietary.
+To prevent this, we have made it clear that any patent must be licensed for
+everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and modification
+follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains a notice
+placed by the copyright holder saying it may be distributed under the terms of
+this General Public License. The "Program", below, refers to any such program
+or work, and a "work based on the Program" means either the Program or any
+derivative work under copyright law: that is to say, a work containing the
+Program or a portion of it, either verbatim or with modifications and/or
+translated into another language. (Hereinafter, translation is included
+without limitation in the term "modification".) Each licensee is addressed as
+"you".
+
+Activities other than copying, distribution and modification are not covered
+by this License; they are outside its scope. The act of running the Program
+is not restricted, and the output from the Program is covered only if its
+contents constitute a work based on the Program (independent of having been
+made by running the Program). Whether that is true depends on what the
+Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's source code
+as you receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice and
+disclaimer of warranty; keep intact all the notices that refer to this License
+and to the absence of any warranty; and give any other recipients of the
+Program a copy of this License along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and you may
+at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion of it,
+thus forming a work based on the Program, and copy and distribute such
+modifications or work under the terms of Section 1 above, provided that you
+also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices stating
+ that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in whole
+ or in part contains or is derived from the Program or any part thereof,
+ to be licensed as a whole at no charge to all third parties under the
+ terms of this License.
+
+ c) If the modified program normally reads commands interactively when run,
+ you must cause it, when started running for such interactive use in the
+ most ordinary way, to print or display an announcement including an
+ appropriate copyright notice and a notice that there is no warranty (or
+ else, saying that you provide a warranty) and that users may
+ redistribute the program under these conditions, and telling the user
+ how to view a copy of this License. (Exception: if the Program itself
+ is interactive but does not normally print such an announcement, your
+ work based on the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If identifiable
+sections of that work are not derived from the Program, and can be reasonably
+considered independent and separate works in themselves, then this License,
+and its terms, do not apply to those sections when you distribute them as
+separate works. But when you distribute the same sections as part of a whole
+which is a work based on the Program, the distribution of the whole must be on
+the terms of this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your
+rights to work written entirely by you; rather, the intent is to exercise the
+right to control the distribution of derivative or collective works based on
+the Program.
+
+In addition, mere aggregation of another work not based on the Program with
+the Program (or with a work based on the Program) on a volume of a storage or
+distribution medium does not bring the other work under the scope of this
+License.
+
+ 3. You may copy and distribute the Program (or a work based on it, under
+Section 2) in object code or executable form under the terms of Sections 1 and
+2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable source
+ code, which must be distributed under the terms of Sections 1 and 2
+ above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three years, to
+ give any third party, for a charge no more than your cost of physically
+ performing source distribution, a complete machine-readable copy of the
+ corresponding source code, to be distributed under the terms of
+ Sections 1 and 2 above on a medium customarily used for software
+ interchange; or,
+
+ c) Accompany it with the information you received as to the offer to
+ distribute corresponding source code. (This alternative is allowed
+ only for noncommercial distribution and only if you received the
+ program in object code or executable form with such an offer, in accord
+ with Subsection b above.)
+
+The source code for a work means the preferred form of the work for making
+modifications to it. For an executable work, complete source code means all
+the source code for all modules it contains, plus any associated interface
+definition files, plus the scripts used to control compilation and
+installation of the executable. However, as a special exception, the source
+code distributed need not include anything that is normally distributed (in
+either source or binary form) with the major components (compiler, kernel, and
+so on) of the operating system on which the executable runs, unless that
+component itself accompanies the executable.
+
+If distribution of executable or object code is made by offering access to
+copy from a designated place, then offering equivalent access to copy the
+source code from the same place counts as distribution of the source code,
+even though third parties are not compelled to copy the source along with the
+object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program except as
+expressly provided under this License. Any attempt otherwise to copy, modify,
+sublicense or distribute the Program is void, and will automatically terminate
+your rights under this License. However, parties who have received copies, or
+rights, from you under this License will not have their licenses terminated so
+long as such parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not signed
+it. However, nothing else grants you permission to modify or distribute the
+Program or its derivative works. These actions are prohibited by law if you
+do not accept this License. Therefore, by modifying or distributing the
+Program (or any work based on the Program), you indicate your acceptance of
+this License to do so, and all its terms and conditions for copying,
+distributing or modifying the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the original
+licensor to copy, distribute or modify the Program subject to these terms and
+conditions. You may not impose any further restrictions on the recipients'
+exercise of the rights granted herein. You are not responsible for enforcing
+compliance by third parties to this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or otherwise)
+that contradict the conditions of this License, they do not excuse you from
+the conditions of this License. If you cannot distribute so as to satisfy
+simultaneously your obligations under this License and any other pertinent
+obligations, then as a consequence you may not distribute the Program at all.
+For example, if a patent license would not permit royalty-free redistribution
+of the Program by all those who receive copies directly or indirectly through
+you, then the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply and
+the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents or
+other property right claims or to contest validity of any such claims; this
+section has the sole purpose of protecting the integrity of the free software
+distribution system, which is implemented by public license practices. Many
+people have made generous contributions to the wide range of software
+distributed through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing to
+distribute software through any other system and a licensee cannot impose that
+choice.
+
+This section is intended to make thoroughly clear what is believed to be a
+consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in certain
+countries either by patents or by copyrighted interfaces, the original
+copyright holder who places the Program under this License may add an explicit
+geographical distribution limitation excluding those countries, so that
+distribution is permitted only in or among countries not thus excluded. In
+such case, this License incorporates the limitation as if written in the body
+of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions of
+the General Public License from time to time. Such new versions will be
+similar in spirit to the present version, but may differ in detail to address
+new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any later
+version", you have the option of following the terms and conditions either of
+that version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of this License,
+you may choose any version ever published by the Free Software Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free programs
+whose distribution conditions are different, write to the author to ask for
+permission. For software which is copyrighted by the Free Software
+Foundation, write to the Free Software Foundation; we sometimes make
+exceptions for this. Our decision will be guided by the two goals of
+preserving the free status of all derivatives of our free software and of
+promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
+THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE
+STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE
+PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
+PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE,
+YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO
+LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR
+THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ Appendix: How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest possible
+use to the public, the best way to achieve this is to make it free software
+which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest to
+attach them to the start of each source file to most effectively convey the
+exclusion of warranty; and each file should have at least the "copyright" line
+and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this when it
+starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may be
+called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General Public
+License instead of this License.
diff --git a/Build/source/texk/chktex/ChkTeX.readme b/Build/source/texk/chktex/ChkTeX.readme
new file mode 100644
index 00000000000..9d9dc96ae3c
--- /dev/null
+++ b/Build/source/texk/chktex/ChkTeX.readme
@@ -0,0 +1,515 @@
+Short: v1.5. Finds typographic errors in LaTeX
+Author: <jensthi@ifi.uio.no> (Jens T. Berger Thielemann)
+Uploader: <jensthi@ifi.uio.no> (Jens T. Berger Thielemann)
+Type: text/tex
+Replaces: text/tex/ChkTeX.lha
+Version: 1.5
+URL: http://www.ifi.uio.no/~jensthi/chktex/
+Porting: <bjort@ifi.uio.no> (Bjørn Ove Thue) [MSDOS]
+ <fritsch@hmi.de> (Wolfgang Fritsch) [OS/2]
+
+
+ ##### ### ### ######## ### ##
+ ### ## ## ## ## ## #
+ @@ @@ @@@ @@ @@ @@ ####### @@ @
+ @@ @@@ @@ @@ @@ @@ ## # @@
+ && && && &&&& && @@ & &&
+ &&& && && && && && && @@@@ & &&
+ %%%%% %%% %%% %%% %%% %% && %%% %%% v1.5
+ && &
+ %%%%%%%
+
+ Introduction
+
+ This program has been written in frustration because some constructs
+ in LaTeX are sometimes non-intuitive, and easy to forget. It is _not_
+ a replacement for the built-in checker in LaTeX; however it catches
+ some typographic errors LaTeX oversees. In other words, it is Lint for
+ LaTeX. Filters are also provided for checking the LaTeX parts of CWEB
+ documents.
+
+ It is written in ANSI C and compiles silently under GCC using ``-Wall
+ -ansi -pedantic'' and almost all warning flags. This means that you
+ can compile & use the program on your favorite machine. Full source
+ included.
+
+ The program also supports output formats suitable for further
+ processing by editors or other programs, making errors easy to cycle
+ through. Software is provided for beautifully interfacing against the
+ AUC-TeX Emacs mode, CygnusED, GoldEd and various Amiga message
+ browsers.
+
+ The program itself does not have any machine requirements; Amiga,
+ MSDOS and OS/2 binaries are available. Of course, you'll need ARexx
+ and ScMsg or VBrowse to benefit from the ARexx scripts.
+
+ Features
+
+ ChkTeX begins to get quite a few bells & whistles now. However, you
+ should be aware of that in most cases, all this is transparent to the
+ user. As you will see, ChkTeX offers the ability to adapt to many
+ environments and configurations.
+
+New features
+
+ Modifications and additions since v1.4:
+
+ Program
+
+ Modifications to the executable itself:
+ * As usual, a few more warnings:
+ + No space or similar in front/after parenthesis.
+ + Demands a consistent quote style.
+ + Double spaces in input which will not be rendered as one.
+ + Punctuation malplaced regarding to math mode.
+ + Warns about TeX primitives.
+ + Space in front of footnotes.
+ + Bogus \left and \right commands.
+ * The abbreviation recognizer has (for the last time?) been
+ redesigned. We now produce far less false warnings, catch more
+ cases and do all this faster than before. Seems like a win.
+ Done much of the same with the italic correction detection part,
+ too...
+ * Some bugs have been silently fixed. Hot spots in the program have
+ been optimized; in certain cases this in fact doubles the speed!
+ Along with this goes more code elegance and utilization of macro
+ processing and the C language. Take a look at ``Resource.[ch]''.
+ * It's possible to specify separate output-formats depending on
+ whether you are sending the output to a file/pipe or to a
+ terminal.
+ * Column positions are finally correct; we now expand tabs
+ correctly.
+ * ChkTeX will now recursively search for \input'ed files, both in
+ the document and on the commandline. See the ``chktexrc'' file for
+ more info.
+ * The debug switch is now more intelligent; if you wish to hack a
+ bit on ChkTeX for yourself, it is possible to produce selective
+ debugging output. The feature can also be disabled altogether.
+ * MS-DOS and OS/2 version of the program is now more flexible and
+ well-behaved, thanks to Gerd Böhm.
+ * You may now say ``-wall'' to make all messages warnings, and turn
+ them on.
+ * Uses termcap on UNIX boxes; this should ensure that ``-v2'' (or
+ more precisely: ``%i'' and ``%I'') works regardless to what
+ terminal you are using.
+
+ Resource file
+
+ New concepts introduced in the setup file:
+ * You may now specify both case-sensitive and case-insensitive user
+ patterns in the ``chktexrc'' file. In addition; it is now possible
+ to reset/clear lists.
+ * It is possible to specify how many arguments (optional/required)
+ ``WIPEARG'' should wipe; it behaves also somewhat more intelligent
+ when the arguments stretch over multiple lines.
+ * Global files will be read _in addition_ to local ones. The
+ searching order has also been reversed in order to make this more
+ intelligent.
+
+ Other
+
+ Various other stuff I've done to the product:
+
+ * The documentation has been polished and should now be easier to
+ use in practical situations.
+ * ``check'' target in ``Makefile'', so you can check that the
+ installation succeeded. In fact, the ``Makefile'' has been
+ enhanced in several other ways too, amongst other it is now GNU
+ conforming.
+ * ``deweb'' is now documented; you may say ``man deweb'' to get a
+ few words of advice. The support script (chkweb) does now behave
+ as the remaining package (accepting stdin input and flags).
+ * I've written an Emacs hack which magically adds ChkTeX to the list
+ of AUC-TeX commands; thus making the use of the program even more
+ trivial.
+ For those of you who don't wish to mess with Emacs, I've included
+ a trivial lacheck <-> ChkTeX interface.
+ This means that you now can use ChkTeX just as easily as lacheck
+ when you're running AUC-TeX.
+ * Added an ARexx script which lets ChkTeX talk to VBrowse, the
+ message browser of Volker Barthelmann's freely distributable ANSI
+ C compiler. The browser itself is available on Aminet as
+ ``dev/c/vbcc.lha''.
+
+Feature list
+
+ * Supports over 40 warnings. Warnings include:
+ + Commands terminated with space. Ignores ``\tt'', etc.
+ + Space in front of references instead of ``~''.
+ + Forgetting to group parenthesis characters when
+ sub-/superscripting.
+ + Italic correction (``\/'') mistakes (double, missing,
+ unnecessary).
+ + Parenthesis and environment matching.
+ + Ellipsis detection; also checks whether to use ``\dots'',
+ ``\cdots'' or ``\ldots''.
+ + Enforcement of normal space after abbreviation. Detects most
+ abbreviations automagically.
+ + Enforcement of end-of-sentence space when the last sentence
+ ended with capital letter.
+ + Math-mode on/off detection.
+ + Quote checking, both wrong types (``"'') and wrong direction.
+ + Recommends splitting three quotes in a row.
+ + Searching for user patterns.
+ + Displays comments.
+ + Space in front of ``\label'' and similar commands.
+ + Use of ``x'' instead of ``$\times$'' between numbers.
+ + Multiple spaces in input which will be rendered as one space
+ (or multiple spaces, where that is undesirable).
+ + Warns about text which may be ignored.
+ + Mathematical operators typeset as variables.
+ + No space in front of/after parenthesis.
+ + Demands a consistent quote style.
+ + Punctuation inside inner math mode/outside display math mode.
+ + Use of TeX primitives where LaTeX equivalents are available.
+ + Space in front of footnotes.
+ + Bogus characters following commands.
+ * Fully customizable. Intelligent resource format makes it possible
+ to make ChkTeX respect your LaTeX setup. Even command-line options
+ may be specified globally in the ``chktexrc'' file.
+ * Supports ``\input'' command; both TeX and LaTeX version. Actually
+ includes the files. ``TEXINPUTS''-equivalent search path.
+ * Intelligent warning/error handling. The user may promote/mute
+ warnings to suit his preferences. You may also mute warnings in
+ the header of a file; thus killing much unwanted garbage.
+ * Scripts included for checking CWEB files written in LaTeX.
+ (Requires perl v5).
+ * Supports both LaTeX 2.09 and LaTeX2e.
+ * Flexible output handling. Has some predefined formats and lets the
+ user specify his own format. Uses a ``printf()'' similar syntax.
+ ``lacheck'' compatible mode included for interfacing with the
+ AUC-TeX Emacs mode.
+ * ARexx scripts for interfacing with ScMsg and VBrowse are included.
+ Special scripts included for CygnusED/GoldED, for binding to
+ hotkey.
+ * Amiga Workbench support. Parameters may be passed by
+ shift-clicking the LaTeX files and setting the remaining options
+ in the tooltypes.
+ * Wildcard matching (Amiga only). Matches file patterns internally,
+ thus saving a lot of work. This is, however, platform-specific
+ code -- on UNIX boxes this is done by the shell.
+ * Written in ANSI C. ``configure'' script included for easy setup
+ and installation on UNIX systems.
+
+ Still, it is important to realize that the output from ChkTeX is only
+ intended as a _guide_ to fixing faults. However, it is by no means
+ always correct. This means that correct LaTeX code may produce errors
+ in ChkTeX, and vice versa: Incorrect LaTeX code may pass silently
+ through.
+
+ Legal stuff
+
+ ChkTeX, documentation, installations scripts, CWEB filters and other
+ materials provided are copyright © 1995-96 Jens T. Berger Thielemann,
+ unless explicitly stated otherwise.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or (at
+ your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to:
+
+ The Free Software Foundation, Inc.
+ 675 Mass Ave
+ Cambridge
+ MA 02139
+ USA
+
+Registration
+
+ `ChkTeX' is made available under the concept of Gift-Ware, which is a
+ variant of Share-Ware. Share-Ware software authors often release
+ `crippled' versions of their products, i.e. these programs do not
+ support the same functionality as the registered versions you get when
+ sending monetary contributions to the authors. It all comes down to
+ `pay for the software you are using' in Share-Ware terms. With
+ Gift-Ware registration it is different, you are not required to
+ contribute money, but a gift will do. With `ChkTeX' you always get a
+ fully functional program, there is no `crippled' test release which
+ you can try for a limited time and then have to pay for in order to
+ receive the working registered version.
+
+ It may seem as if `ChkTeX' was free, but this is not the case.
+ Although there is no need to pay the author in order to get a fully
+ functional version of the program you should consider making a
+ contribution. You don't need to feel guilty if you cannot or do not
+ want to give me something in return for the work I have put into
+ `ChkTeX'. Show me that it was worth spending so much time listening to
+ users, updating, rewriting and enhancing this program. Your
+ contributions will provide the motivation for me to keep developing
+ the program.
+
+ Send your contribution to the following address:
+
+ Jens Berger
+ Spektrumvn. 4
+ N-0666 Oslo
+ Norway
+
+ Availability
+
+ This program will be uploaded to AmiNet and CTAN; thus it can be found
+ at any mirrors of those.
+
+ Please note that earlier versions of ChkTeX have been uploaded to
+ Aminet under the same archive name, to keep consistent with Aminet's
+ policy of keeping versions out of filenames. Please read the file
+ ``ChkTeX.readme'' (which is in the same directory as the archive) to
+ find out the version number.
+
+ I'm now uploading the archive uncompressed to CTAN; however, most of
+ the ftpservers in that network allow you to retrieve a directory
+ compressed in whatever way you prefer. Aminet will as usual receive a
+ LhArc archive.
+
+ Mirrors of both networks include:
+
+Comprehensive TeX Archive Network (CTAN)
+
+ Directory: support/chktex
+ * ftp://ftp.adfa.oz.au/pub/tex/ctan/, (Australia)
+ * ftp://ftp.cs.rmit.edu.au/tex-archive/, (Australia)
+ * ftp://gw.pacbell.com/mirror/ftp.shsu.edu/tex-archive/,
+ (California, USA)
+ * ftp://sunsite.queensu.ca/pub/tex-archive/, (Canada)
+ * ftp://ftp.dante.de/pub/tex/, (Deutschland)
+ * ftp://ftp.germany.eu.net/pub/packages/TeX/, (Deutschland)
+ * ftp://ftp.gwdg.de/pub/dante/, (Deutschland)
+ * ftp://ftp.tex.ac.uk/pub/tex /, (England)
+ * ftp://src.doc.ic.ac.uk/packages/tex/uk-tex/, (England)
+ * ftp://kadri.ut.ee/pub/tex/, (Estonia)
+ * ftp://ftp.funet.fi/pub/TeX/CTAN/, (Finland)
+ * ftp://ftp.jussieu.fr/pub4/TeX/CTAN/, (France)
+ * ftp://ftp.loria.fr/pub/unix/tex/ctan/, (France)
+ * ftp://ftp.comp.hkbu.edu.hk/pub/TeX/CTAN/, (Hong Kong)
+ * ftp://ftp.unina.it/pub/TeX/, (Italia)
+ * ftp://sunsite.dsi.unimi.it/pub/TeX/, (Italia)
+ * ftp://ftp.riken.go.jp/pub/tex-archive/, (Japan)
+ * ftp://wuarchive.wustl.edu/packages/TeX/, (Missouri, USA)
+ * ftp://ftp.rge.com/pub/tex/, (New York, USA)
+ * ftp://ftp.duke.edu/tex-archive/, (North Carolina, USA)
+ * ftp://sunsite.unc.edu/pub/packages/TeX/, (North Carolina, USA)
+ * ftp://sunsite.icm.edu.pl/pub/CTAN/, (Poland)
+ * ftp://ftpserver.nus.sg/pub/zi/TeX/, (Singapore)
+ * ftp://ftp.ee.up.ac.za/tex-archive/, (South Africa)
+ * ftp://nic.switch.ch/mirror/tex/, (Switzerland)
+ * ftp://dongpo.math.ncu.edu.tw/tex-archive/, (Taiwan)
+ * ftp://ftp.ccu.edu.tw/pub/tex/, (Taiwan)
+ * ftp://ftp.fcu.edu.tw/pub2/tex/, (Taiwan)
+ * ftp://ftp.shsu.edu/pub/tex/, (Texas, USA)
+ * ftp://ftp.muni.cz/pub/tex/CTAN/, (The Czech Republic)
+ * ftp://ftp.cs.ruu.nl/pub/tex-archive/, (The Netherlands)
+ * ftp://ftp.uu.net/pub/text-processing/TeX/, (Virginia, USA)
+ * ftp://ftp.cdrom.com/pub/tex/ctan/, (West coast, USA)
+ * ftp://ftp.univie.ac.at/packages/tex/, (\"Osterreich)
+
+Aminet
+
+ I'm only uploading the Amiga version of the archive to Aminet (so that
+ unsuspecting Amiga users won't have to download hundreds of unwanted
+ kilobytes). If you wish to use ChkTeX on another machine, please refer
+ to CTAN.
+
+ Directory: text/tex/, filename: chktex.lha
+ * ftp://ftp.wustl.edu/pub/aminet/text/tex/, (USA (MO))
+ * ftp://ftp.netnet.net/pub/aminet/text/tex/, (USA (WI))
+ * ftp://ftp.ninemoons.com/pub/aminet/text/tex/, (USA (AZ))
+ * ftp://ftp.livewire.com.au/pub/aminet/text/tex/, (Australia)
+ * ftp://ftp.tas.gov.au/pub/aminet/text/tex/, (Australia)
+ * ftp://ftp.luth.se/pub/aminet/text/tex/, (Scandinavia)
+ * ftp://ftp.eunet.ch/pub/aminet/text/tex/, (Switzerland)
+ * ftp://ftp.germany.aminet.org/pub/aminet/text/tex/, (Germany)
+ * ftp://ftp.pb.aminet.org/pub/aminet/text/tex/, (Germany)
+ * ftp://ftp.uni-stuttgart.de/pub/aminet/text/tex/, (Germany)
+ * ftp://ftp.uni-erlangen.de/pub/aminet/text/tex/, (Germany)
+ * ftp://ftp.cs.tu-berlin.de/pub/aminet/text/tex/, (Germany)
+ * ftp://ftp.tu-chemnitz.de/pub/aminet/text/tex/, (Germany)
+ * ftp://ftp.fh-augsburg.de/pub/aminet/text/tex/, (Germany)
+ * ftp://ftp.uni-bremen.de/pub/aminet/text/tex/, (Germany)
+ * ftp://ftp.uni-kl.de/pub/aminet/text/tex/, (Germany)
+ * ftp://ftp.uni-trier.de/pub/aminet/text/tex/, (Germany)
+ * ftp://ftp.informatik.rwth-aachen.de/pub/aminet/text/tex/,
+ (Germany)
+ * ftp://ftp.uni-siegen.de/pub/aminet/text/tex/, (Germany)
+ * ftp://ftp.uni-regensburg.de/pub/aminet/text/tex/, (Germany)
+ * ftp://sunsite.cnam.fr/pub/aminet/text/tex/, (France)
+ * ftp://aminet.grolier.fr/pub/aminet/text/tex/, (France)
+ * ftp://ftp.giga.or.at/pub/aminet/text/tex/, (Austria)
+ * ftp://sunsite.auc.dk/pub/aminet/text/tex/, (Denmark)
+ * ftp://ftp.acropolis.gr/pub/aminet/text/tex/, (Greece)
+ * ftp://aminet.iit.uni-miskolc.hu/pub/aminet/text/tex/,
+ (Hungary)
+ * ftp://ftp.italy.aminet.org/pub/aminet/text/tex/, (Italy)
+ * ftp://ftp.man.szczecin.pl/pub/aminet/text/tex/, (Poland)
+ * ftp://ftp.portugal.aminet.org/pub/aminet/text/tex/, (Portugal)
+ * ftp://ftp.gui.uva.es/pub/aminet/text/tex/, (Spain)
+ * ftp://ftp.uk.aminet.org/pub/aminet/text/tex/, (UK)
+ * ftp://micros.hensa.ac.uk/pub/aminet/text/tex/, (UK)
+
+ Installation
+
+ A few words on installation on various platforms:
+
+ _Amiga:_
+ Use the supplied Installer script.
+
+ _MS-DOS & OS/2:_
+ Copy the binary (``ChkTeX.exe'') to somewhere in your path, and
+ place the ``chktexrc'' file in the same directory.
+
+ If you're running Emacs, you may wish to copy the file
+ ``chktex.el'' to your elisp source directory, and add the
+ following line to your ``.emacs'' file:
+
+(require 'chktex)
+
+ _UNIX:_
+ Type ``configure'', ``make'' and finally ``make install''. To
+ make sure everything proceeded correctly, type ``make check''.
+ If you don't have superuser privileges and thus access to the
+ default system areas, you should type ``configure -help'' to
+ help you set up correct paths.
+
+ If you haven't installed any software like this before, that is
+ distributed in source form, here are some guidelines to help
+ you install it locally at your account. Please note that a mail
+ to the system administrator may be less work for you. :-)
+
+ We assume that you have put the archive (``chktex.tar.gz'') in
+ a subdir of yours, with path ``~/tmp''. We further assume that
+ your shell is ``csh'' or ``tcsh''. Do the following:
+
+ 1. First of all, unpack the archive contents.
+> cd ~/tmp
+> gunzip chktex.tar.gz
+> tar xf chktex.tar
+ 2. Now, we can configure the program. There are some
+ configuration options you should know about:
+
+ _``-enable-emacs-hack'':_
+ Install a small file which adds ChkTeX to the
+ command menu of AUC-TeX. This is to be considered
+ as a hack, and may break in future versions of
+ AUC-TeX. It works fine under AUC-TeX v2.9, though.
+
+ This option needs the path of your elisp directory
+ as argument, e.g.
+ ``-enable-emacs-hack=/home/myself/elisp'' or
+ similar.
+
+ You'll also have to add the following line to your
+ ``.emacs'' file:
+
+(require 'chktex)
+
+ You can now access ChkTeX from the ``Command'' menu in
+ AUC-TeX. To cycle through the messages, type C-x `.
+
+ _``-enable-lacheck-replace''_
+ This enables a quick hack for making the AUC-TeX
+ Emacs mode use ChkTeX instead of lacheck. This is
+ done by installing a stub script which
+ ``overrides'' the original lacheck executable.
+
+ While more stable than the previous solution, this
+ is also significantly less elegant -- in computing
+ terms, this is the ``brute force'' approach.
+
+ _``-enable-debug-info''_
+ ChkTeX has an ability to spit out various
+ diagnostic messages using the ``-d'' flag. This
+ behaviour is on by default. By adding the flag
+ ``-disable-debug-info'' to the commandline, this
+ will not be compiled in.
+
+ This may be useful if you're running short of disk
+ space (the time savings are neglible).
+
+ If you are installing the program on your local account, use
+ the following command:
+> configure --prefix ~/
+ Add eventual extra flags as specified above. This command
+ will generate a significant amount of output, this can
+ usually be ignored.
+ 3. Finally, we can just build the program and install it.
+> make
+> make install
+ 4. Finished! The program is now installed and ready to use. You
+ may now tell other people to put your bindir in their path in
+ order to benefit from your work. All that remains is to make
+ the shell aware of your installation.
+> rehash
+ To make the remaining parts of your system aware of this,
+ you'll have to log out and re-log in, I'm afraid. However,
+ you should delay this until you've completed this
+ installation procedure.
+ 5. If you wish to make sure that everything is OK (you ought
+ to), you may now ask ChkTeX to do a self-test:
+> make check
+
+ _Other platforms:_
+ First of all, you have to copy the ``config.h.in'' file to a
+ file named ``config.h''. Then, edit it to reflect your system.
+ Do the same with ``OpSys.h'' (this file has been reduced
+ significantly). If you wish, you may define ``DATADIR'' to the
+ path you want the global resource file to be put.
+
+ Now, I would suggest that you take a peak at the ``OpSys.c''
+ file, and edit it appropiately, for more comfort. This should
+ not be necessary, though, at least not the first time.
+
+ Finally, you may now compile and link all .cfiles. Define
+ ``HAVE_CONFIG_H'' to 1 (on the command-line, for instance). If
+ the ``config.h'' you wish to use has another name, define
+ ``CONFIG_H_NAME'' to that (in that case, don't define
+ ``HAVE_CONFIG_H'').
+
+ Put the directory path of the ``chktexrc'' file in a
+ environment variable named ``CHKTEXRC''. The files ``deweb.in''
+ and ``chkweb'' should be moved to a directory in your path.
+ These files may need further setup, as they haven't got the
+ location of perl initialized.
+
+ If your compiler/the compiled program complains (or crashes!),
+ you may try the hints listed below. Please note that it only
+ makes sense to try these hints if your compiler fails to
+ produce a working program.
+
+ 1. Increase the preprocessor buffers and line buffers. The
+ ChkTeX sources define macros sized 3-4k (expanding to about
+ the same), and passes arguments sized about 1k.
+ 2. Use the magic switch which lets us use large
+ ``switch(...){...}'' statements; some of these statements
+ have about 120 ``case'' entries.
+ 3. The sources require that at least the first 12 of each
+ identifier is significant.
+
+ _Note:_ You _must_ install the new ``chktexrc'' file; ChkTeX will fail
+ to function unless!
+
+ After doing this, you may enhance ChkTeX' behaviour by reading/editing
+ the ``chktexrc'' file.
+
+ Contacting the author
+
+ If you wish to contact me for any reason or would like to participate
+ in the development of ChkTeX, please write to:
+
+ Jens Berger
+ Spektrumvn. 4
+ N-0666 Oslo
+ Norway
+ E-mail: <jensthi@ifi.uio.no>
+
+ Any signs of intelligent life are welcomed; that should exclude
+ piracy.
+
+ Have fun.
+
diff --git a/Build/source/texk/chktex/ChkTeX.tex b/Build/source/texk/chktex/ChkTeX.tex
new file mode 100644
index 00000000000..1c80942b5af
--- /dev/null
+++ b/Build/source/texk/chktex/ChkTeX.tex
@@ -0,0 +1,2111 @@
+%%
+%% ChkTeX v1.5, LaTeX documentation for ChkTeX program.
+%% Copyright (C) 1995-96 Jens T. Berger Thielemann
+%%
+%% This program is free software; you can redistribute it and/or modify
+%% it under the terms of the GNU General Public License as published by
+%% the Free Software Foundation; either version 2 of the License, or
+%% (at your option) any later version.
+%%
+%% This program is distributed in the hope that it will be useful,
+%% but WITHOUT ANY WARRANTY; without even the implied warranty of
+%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+%% GNU General Public License for more details.
+%%
+%% You should have received a copy of the GNU General Public License
+%% along with this program; if not, write to the Free Software
+%% Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+%%
+%% Contact the author at:
+%% Jens Berger
+%% Spektrumvn. 4
+%% N-0666 Oslo
+%% Norway
+%% E-mail: <jensthi@ifi.uio.no>
+%%
+%% NOTE: This file is written in LaTeX, and should be compiled
+%% before viewing. If you don't know how to do this, consult
+%% your local TeX guru. If you don't possess LaTeX, you are
+%% assumed to not need this program; so there's no text version
+%% of this file...
+%%
+%% You may still be able to view the DVI or PostScript versions of
+%% this file, though, they are included in the archive.
+%%
+
+
+
+%\documentstyle[a4, array, tabularx, verbatim, multicol]{article}
+\documentclass[a4paper]{article}
+\usepackage{ array, tabularx, verbatim, multicol}
+%latex
+\nonfrenchspacing
+\newcounter{errornum}
+\setcounter{errornum}{1}
+%endlatex
+\newcommand{\jtbt}{Jens~T. Berger~Thielemann}
+\newcommand{\Cmd}[1]{``{\tt{}#1}''}
+\newcommand{\rsrc}{``{\tt{}chktexrc}''}
+\newcommand{\chktex}{Chk\TeX}
+\newcommand{\smiley}{:-)}
+
+%latex
+\newcolumntype{Y}{>{\raggedright\arraybackslash}X}
+\newcommand{\fmted}[1]{%
+ {\noindent\large%
+ \begin{tabularx}{\linewidth}{lY}%
+ \bf Warning \theerrornum: & \tt #1%
+ \end{tabularx}}\stepcounter{errornum}\nopagebreak[4]}
+
+\newenvironment{errdesc}[1]{\noindent\fmted{#1}\begin{quote}}{\end{quote}%
+\pagebreak[3]}
+
+\newenvironment{html}{\comment}{\endcomment}
+\newenvironment{rawhtml}{\comment}{\endcomment}
+
+\makeatletter
+\@namedef{errdesc*}#1{\begin{errdesc}{\textit{#1}}}
+\@namedef{enderrdesc*}{\end{errdesc}}
+\@ifundefined{textit}{\gdef\textit#1{{\it #1}}}\relax
+\@ifundefined{LaTeXe}{\gdef\LaTeXe{\LaTeX2${}_{\textstyle\varepsilon}$}}\relax
+\makeatother
+
+
+\newenvironment{errexam}
+{
+\vskip 0pt plus 5pt
+\begin{center}
+}
+{\end{center}}
+\columnseprule 0.1pt
+
+%!\newcommand{\LaTeXe}{\LaTeX 2e}
+%!\newcommand{\BS}{\verb@\@}
+%!\newcommand{\chktex}{ChkTeX}
+%!\newcommand{\slash}{/}
+%endlatex
+
+
+\title{\chktex\ v1.5}
+\author{Jens~T. Berger~Thielemann}
+\date{\today}
+
+
+\begin{document}
+\maketitle
+
+%latex
+\newcommand{\BS}{\char`\\}
+%endlatex
+\section{Introduction}
+
+This program has been written in frustration because some constructs in
+\LaTeX\ are sometimes non-intuitive, and easy to forget. It is {\em
+ not\/} a replacement for the built-in checker in \LaTeX\@; however it
+catches some typographic errors \LaTeX\ oversees. In other words, it
+is Lint for \LaTeX. Filters are also provided for checking the
+\LaTeX\ parts of CWEB documents.
+
+It is written in ANSI C and compiles silently under GCC using
+\Cmd{-Wall -ansi -pedantic} and almost all warning flags. This means
+that you can compile \& use the program on your favorite machine.
+Full source included.
+
+The program also supports output formats suitable for further
+processing by editors or other programs, making errors easy to cycle through.
+Software is provided for beautifully interfacing against the
+AUC-\TeX\ Emacs mode, CygnusED, GoldEd and various Amiga message browsers.
+
+The program itself does not have any machine requirements; Amiga,
+MSDOS and OS/2 binaries are available. Of course, you'll need ARexx
+and ScMsg or VBrowse to benefit from the ARexx scripts.
+
+
+
+\section{Features}
+\chktex\ begins to get quite a few bells \& whistles now. However, you
+should be aware of that in most cases, all this is transparent to the user.
+As you will see, \chktex\ offers the ability to adapt to many environments
+and configurations.
+
+\subsection{New features}
+Modifications and additions since v1.4:
+
+
+\subsubsection{Program}
+
+Modifications to the executable itself:
+\begin{itemize}
+\item As usual, a few more warnings:
+ \begin{itemize}
+ \item No space or similar in front/after parenthesis.
+ \item Demands a consistent quote style.
+ \item Double spaces in input which will not be rendered as one.
+ \item Punctuation malplaced regarding to math mode.
+ \item Warns about \TeX\ primitives.
+ \item Space in front of footnotes.
+ \item Bogus {\tt\BS{}left} and {\tt\BS{}right} commands.
+ \end{itemize}
+
+\item The abbreviation recognizer has (for the last time?) been
+ redesigned. We now produce far less false warnings, catch more
+ cases and do all this faster than before. Seems like a win.
+
+ Done much of the same with the italic correction detection part,
+ too\ldots
+\item Some bugs have been silently fixed. Hot spots in the program
+ have been optimized; in certain cases this in fact doubles the
+ speed!
+
+ Along with this goes more code elegance and utilization of macro
+ processing and the C language. Take a look at \Cmd{Resource.[ch]}.
+
+\item It's possible to specify separate output-formats depending on
+ whether you are sending the output to a file/pipe or to a
+ terminal.
+
+\item Column positions are finally correct; we now expand tabs
+ correctly.
+\item \chktex\ will now recursively search for {\tt\BS{}input}'ed
+ files, both in the document and on the commandline. See the
+ \rsrc\ file for more info.
+\item The debug switch is now more intelligent; if you wish to hack
+ a bit on \chktex\ for yourself, it is possible to produce
+ selective debugging output. The feature can also be disabled
+ altogether.
+\item MS-DOS and OS/2 version of the program is now more flexible
+ and well-behaved, thanks to Gerd B\"ohm.
+\item You may now say \Cmd{-wall} to make all messages warnings, and
+ turn them on.
+\item Uses termcap on UNIX boxes; this should ensure that \Cmd{-v2}
+ (or more precisely: \Cmd{\%i} and \Cmd{\%I}) works regardless to
+ what terminal you are using.
+\end{itemize}
+
+\subsubsection{Resource file}
+
+New concepts introduced in the setup file:
+\begin{itemize}
+\item You may now specify both case-sensitive and case-insensitive
+ user patterns in the \rsrc\ file. In addition; it is now possible
+ to reset/clear lists.
+\item It is possible to specify how many arguments
+ (optional/required) \Cmd{WIPEARG} should wipe; it behaves also
+ somewhat more intelligent when the arguments stretch over multiple
+ lines.
+\item Global files will be read {\em in addition\/} to local ones. The
+ searching order has also been reversed in order to make this more
+ intelligent.
+\end{itemize}
+
+
+\subsubsection{Other}
+Various other stuff I've done to the product:
+
+\begin{itemize}
+\item The documentation has been polished and should now be easier
+ to use in practical situations.
+\item \Cmd{check} target in \Cmd{Makefile}, so you can check that
+ the installation succeeded. In fact, the \Cmd{Makefile} has been
+ enhanced in several other ways too, amongst other it is now GNU
+ conforming.
+\item \Cmd{deweb} is now documented; you may say \Cmd{man~deweb} to
+ get a few words of advice. The support script ({\tt chkweb}) does
+ now behave as the remaining package (accepting stdin input and flags).
+\item I've written an Emacs hack which magically adds \chktex\ to the
+ list of AUC-\TeX\ commands; thus making the use of the program even
+ more trivial.
+
+ For those of you who don't wish to mess with Emacs, I've included a trivial
+%latex
+ $\mbox{lacheck}\leftrightarrow\mbox{\chktex}$
+%!lacheck <-> \chktex\ %
+%endlatex
+ interface.
+
+ This means that you now can use \chktex\ just as easily as lacheck
+ when you're running AUC-\TeX.
+
+\item Added an ARexx script which lets \chktex\ talk to VBrowse, the
+ message browser of Volker Barthelmann's freely distributable ANSI
+ C compiler. The browser itself is available on Aminet as
+ \Cmd{dev/c/vbcc.lha}.
+\end{itemize}
+
+\subsection{Feature list}
+
+\begin{itemize}
+\item Supports over 40 warnings. Warnings include:
+%latex
+ \begin{multicols}{2}
+ \begin{flushleft}
+%endlatex
+ \begin{itemize}
+ \item Commands terminated with space. Ignores \Cmd{\BS{}tt}, etc.
+ \item Space in front of references instead of \Cmd{\~{}}.
+ \item Forgetting to group parenthesis characters when
+ sub-\slash{}super\-scripting.
+ \item Italic correction (\Cmd{\BS/}) mistakes (double,
+ missing, unnecessary).
+ \item Parenthesis and environment matching.
+ \item Ellipsis detection; also checks whether to use
+ \Cmd{\BS{}dots}, \Cmd{\BS{}cdots} or \Cmd{\BS{}ldots}.
+ \item Enforcement of normal space after abbreviation. Detects
+ most abbreviations automagically.
+ \item Enforcement of end-of-sentence space when the last
+ sentence ended with capital letter.
+ \item Math-mode on/off detection.
+ \item Quote checking, both wrong types (\Cmd{"}) and wrong
+ direction.
+ \item Recommends splitting three quotes in a row.
+ \item Searching for user patterns.
+ \item Displays comments.
+ \item Space in front of \Cmd{\BS{}label} and similar commands.
+ \item Use of \Cmd{x} instead of \Cmd{\$\BS{}times\$} between numbers.
+ \item Multiple spaces in input which will be rendered as one
+ space (or multiple spaces, where that is undesirable).
+ \item Warns about text which may be ignored.
+ \item Mathematical operators typeset as variables.
+ \item No space in front of/after parenthesis.
+ \item Demands a consistent quote style.
+ \item Punctuation inside inner math mode/outside display math
+ mode.
+ \item Use of \TeX\ primitives where \LaTeX\ equivalents are
+ available.
+ \item Space in front of footnotes.
+ \item Bogus characters following commands.
+ \end{itemize}
+%latex
+ \end{flushleft}
+ \end{multicols}
+%endlatex
+\item Fully customizable. Intelligent resource format makes it
+ possible to make \chktex\ respect your \LaTeX\ setup. Even
+ command-line options may be specified globally in the \rsrc\ file.
+\item Supports \Cmd{\BS{}input} command; both \TeX\ and \LaTeX\ version.
+ Actually includes the files. \Cmd{TEXINPUTS}-equivalent search path.
+\item Intelligent warning/error handling. The user may promote/mute
+ warnings to suit his preferences. You may also mute warnings in the
+ header of a file; thus killing much unwanted garbage.
+\item Scripts included for checking CWEB files written in \LaTeX.
+ (Requires perl v5).
+\item Supports both \LaTeX\ 2.09 and \LaTeXe.
+\item Flexible output handling. Has some predefined formats and lets
+ the user specify his own format. Uses a \Cmd{printf()} similar
+ syntax. \Cmd{lacheck} compatible mode included for interfacing with
+ the AUC-\TeX\ Emacs mode.
+\item ARexx scripts for interfacing with ScMsg and VBrowse are
+ included. Special scripts included for CygnusED/GoldED, for binding
+ to hotkey.
+\item Amiga Workbench support. Parameters may be passed by
+ shift-clicking the \LaTeX\ files and setting the remaining options
+ in the tooltypes.
+\item Wildcard matching (Amiga only). Matches file patterns
+ internally, thus saving a lot of work. This is, however,
+ platform-specific code --- on UNIX boxes this is done by the shell.
+\item Written in ANSI C\@. \Cmd{configure} script included for easy
+ setup and installation on UNIX systems.
+\end{itemize}
+
+Still, it is important to realize that the output from \chktex\ is
+only intended as a {\em guide\/} to fixing faults. However, it is by
+no means always correct. This means that correct \LaTeX\ code may
+produce errors in \chktex, and vice versa: Incorrect \LaTeX\ code may pass
+silently through.
+
+
+
+\section{Legal stuff}
+
+\chktex{}, documentation, installations scripts, CWEB filters and other
+materials provided are copyright \copyright\ 1995--96 Jens~T.
+Berger~Thielemann, unless explicitly stated otherwise.
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 2 of the License, or (at your option)
+any later version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY\@; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE\@. See the GNU General Public License for
+more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to:
+\begin{quote}
+ The Free Software Foundation, Inc. \\
+ 675 Mass Ave \\
+ Cambridge \\
+ MA 02139 \\
+ USA
+\end{quote}
+
+
+
+
+\subsection{Registration}
+
+`\chktex' is made available under the concept of Gift-Ware, which is a
+variant of Share-Ware. Share-Ware software authors often release
+`crippled' versions of their products, i.e.\ these programs do not
+support the same functionality as the registered versions you get when
+sending monetary contributions to the authors. It all comes down to
+`pay for the software you are using' in Share-Ware terms. With
+Gift-Ware registration it is different, you are not required to
+contribute money, but a gift will do. With `\chktex' you always get a
+fully functional program, there is no `crippled' test release which
+you can try for a limited time and then have to pay for in order to
+receive the working registered version.
+
+It may seem as if `\chktex' was free, but this is not the case.
+Although there is no need to pay the author in order to get a fully
+functional version of the program you should consider making a
+contribution. You don't need to feel guilty if you cannot or do not
+want to give me something in return for the work I have put into
+`\chktex'. Show me that it was worth spending so much time listening
+to users, updating, rewriting and enhancing this program. Your
+contributions will provide the motivation for me to keep developing
+the program.
+
+Send your contribution to the following address:
+%latex
+\begin{samepage}
+%endlatex
+\begin{quote}
+ Jens Berger \\
+ Spektrumvn. 4 \\
+ N-0666 Oslo \\
+ Norway
+\end{quote}
+%latex
+\end{samepage}
+%endlatex
+
+\begin{html}
+\section{Availability}
+
+This program will be uploaded to AmiNet and CTAN\@; thus it can be
+found at any mirrors of those.
+
+Please note that earlier versions of \chktex\ have been uploaded to
+Aminet under the same archive name, to keep consistent with Aminet's
+policy of keeping versions out of filenames. Please read the file
+\Cmd{ChkTeX.readme} (which is in the same directory as the archive) to
+find out the version number.
+
+I'm now uploading the archive uncompressed to CTAN\@; however, most of
+the ftpservers in that network allow you to retrieve a directory
+compressed in whatever way you prefer. Aminet will as usual receive a
+LhArc archive.
+
+Mirrors of both networks include:
+
+ \subsection{Comprehensive \TeX\ Archive Network (CTAN)}
+\end{html}
+
+\begin{rawhtml}
+ Directory: <tt> support/chktex</tt>
+ <ul>
+<li> <a href="ftp://ftp.adfa.oz.au/pub/tex/ctan/support/chktex/">
+ ftp://ftp.adfa.oz.au/pub/tex/ctan/</a>, (Australia)
+
+<li> <a href="ftp://ftp.cs.rmit.edu.au/tex-archive/support/chktex/">
+ ftp://ftp.cs.rmit.edu.au/tex-archive/</a>, (Australia)
+
+<li> <a href="ftp://gw.pacbell.com/mirror/ftp.shsu.edu/tex-archive/support/chktex/">
+ ftp://gw.pacbell.com/mirror/ftp.shsu.edu/tex-archive/</a>, (California, USA)
+
+<li> <a href="ftp://sunsite.queensu.ca/pub/tex-archive/support/chktex/">
+ ftp://sunsite.queensu.ca/pub/tex-archive/</a>, (Canada)
+
+<li> <a href="ftp://ftp.dante.de/pub/tex/support/chktex/">
+ ftp://ftp.dante.de/pub/tex/</a>, (Deutschland)
+
+<li> <a href="ftp://ftp.germany.eu.net/pub/packages/TeX/support/chktex/">
+ ftp://ftp.germany.eu.net/pub/packages/TeX/</a>, (Deutschland)
+
+<li> <a href="ftp://ftp.gwdg.de/pub/dante/support/chktex/">
+ ftp://ftp.gwdg.de/pub/dante/</a>, (Deutschland)
+
+<li> <a href="ftp://ftp.tex.ac.uk/pub/tex /support/chktex/">
+ ftp://ftp.tex.ac.uk/pub/tex /</a>, (England)
+
+<li> <a href="ftp://src.doc.ic.ac.uk/packages/tex/uk-tex/support/chktex/">
+ ftp://src.doc.ic.ac.uk/packages/tex/uk-tex/</a>, (England)
+
+<li> <a href="ftp://kadri.ut.ee/pub/tex/support/chktex/">
+ ftp://kadri.ut.ee/pub/tex/</a>, (Estonia)
+
+<li> <a href="ftp://ftp.funet.fi/pub/TeX/CTAN/support/chktex/">
+ ftp://ftp.funet.fi/pub/TeX/CTAN/</a>, (Finland)
+
+<li> <a href="ftp://ftp.jussieu.fr/pub4/TeX/CTAN/support/chktex/">
+ ftp://ftp.jussieu.fr/pub4/TeX/CTAN/</a>, (France)
+
+<li> <a href="ftp://ftp.loria.fr/pub/unix/tex/ctan/support/chktex/">
+ ftp://ftp.loria.fr/pub/unix/tex/ctan/</a>, (France)
+
+<li> <a href="ftp://ftp.comp.hkbu.edu.hk/pub/TeX/CTAN/support/chktex/">
+ ftp://ftp.comp.hkbu.edu.hk/pub/TeX/CTAN/</a>, (Hong Kong)
+
+<li> <a href="ftp://ftp.unina.it/pub/TeX/support/chktex/">
+ ftp://ftp.unina.it/pub/TeX/</a>, (Italia)
+
+<li> <a href="ftp://sunsite.dsi.unimi.it/pub/TeX/support/chktex/">
+ ftp://sunsite.dsi.unimi.it/pub/TeX/</a>, (Italia)
+
+<li> <a href="ftp://ftp.riken.go.jp/pub/tex-archive/support/chktex/">
+ ftp://ftp.riken.go.jp/pub/tex-archive/</a>, (Japan)
+
+<li> <a href="ftp://wuarchive.wustl.edu/packages/TeX/support/chktex/">
+ ftp://wuarchive.wustl.edu/packages/TeX/</a>, (Missouri, USA)
+
+<li> <a href="ftp://ftp.rge.com/pub/tex/support/chktex/">
+ ftp://ftp.rge.com/pub/tex/</a>, (New York, USA)
+
+<li> <a href="ftp://ftp.duke.edu/tex-archive/support/chktex/">
+ ftp://ftp.duke.edu/tex-archive/</a>, (North Carolina, USA)
+
+<li> <a href="ftp://sunsite.unc.edu/pub/packages/TeX/support/chktex/">
+ ftp://sunsite.unc.edu/pub/packages/TeX/</a>, (North Carolina, USA)
+
+<li> <a href="ftp://sunsite.icm.edu.pl/pub/CTAN/support/chktex/">
+ ftp://sunsite.icm.edu.pl/pub/CTAN/</a>, (Poland)
+
+<li> <a href="ftp://ftpserver.nus.sg/pub/zi/TeX/support/chktex/">
+ ftp://ftpserver.nus.sg/pub/zi/TeX/</a>, (Singapore)
+
+<li> <a href="ftp://ftp.ee.up.ac.za/tex-archive/support/chktex/">
+ ftp://ftp.ee.up.ac.za/tex-archive/</a>, (South Africa)
+
+<li> <a href="ftp://nic.switch.ch/mirror/tex/support/chktex/">
+ ftp://nic.switch.ch/mirror/tex/</a>, (Switzerland)
+
+<li> <a href="ftp://dongpo.math.ncu.edu.tw/tex-archive/support/chktex/">
+ ftp://dongpo.math.ncu.edu.tw/tex-archive/</a>, (Taiwan)
+
+<li> <a href="ftp://ftp.ccu.edu.tw/pub/tex/support/chktex/">
+ ftp://ftp.ccu.edu.tw/pub/tex/</a>, (Taiwan)
+
+<li> <a href="ftp://ftp.fcu.edu.tw/pub2/tex/support/chktex/">
+ ftp://ftp.fcu.edu.tw/pub2/tex/</a>, (Taiwan)
+
+<li> <a href="ftp://ftp.shsu.edu/pub/tex/support/chktex/">
+ ftp://ftp.shsu.edu/pub/tex/</a>, (Texas, USA)
+
+<li> <a href="ftp://ftp.muni.cz/pub/tex/CTAN/support/chktex/">
+ ftp://ftp.muni.cz/pub/tex/CTAN/</a>, (The Czech Republic)
+
+<li> <a href="ftp://ftp.cs.ruu.nl/pub/tex-archive/support/chktex/">
+ ftp://ftp.cs.ruu.nl/pub/tex-archive/</a>, (The Netherlands)
+
+<li> <a href="ftp://ftp.uu.net/pub/text-processing/TeX/support/chktex/">
+ ftp://ftp.uu.net/pub/text-processing/TeX/</a>, (Virginia, USA)
+
+<li> <a href="ftp://ftp.cdrom.com/pub/tex/ctan/support/chktex/">
+ ftp://ftp.cdrom.com/pub/tex/ctan/</a>, (West coast, USA)
+
+<li> <a href="ftp://ftp.univie.ac.at/packages/tex/support/chktex/">
+ ftp://ftp.univie.ac.at/packages/tex/</a>, (\"Osterreich)
+
+
+ </ul>
+\end{rawhtml}
+
+\begin{html}
+\subsection{Aminet}
+\end{html}
+\begin{rawhtml}
+ I'm only uploading the Amiga version of the archive to Aminet (so
+ that unsuspecting Amiga users won't have to download hundreds of
+ unwanted kilobytes). If you wish to use ChkTeX on another machine,
+ please refer to CTAN.
+
+ <p> Directory: <tt> text/tex/</tt>, filename: <tt>chktex.lha</tt>
+ <ul>
+<li> <a href="ftp://ftp.wustl.edu/pub/aminet/text/tex/chktex.lha">
+ ftp://ftp.wustl.edu/pub/aminet/text/tex/</a>, (USA (MO))
+
+<li> <a href="ftp://ftp.netnet.net/pub/aminet/text/tex/chktex.lha">
+ ftp://ftp.netnet.net/pub/aminet/text/tex/</a>, (USA (WI))
+
+<li> <a href="ftp://ftp.ninemoons.com/pub/aminet/text/tex/chktex.lha">
+ ftp://ftp.ninemoons.com/pub/aminet/text/tex/</a>, (USA (AZ))
+
+<li> <a href="ftp://ftp.livewire.com.au/pub/aminet/text/tex/chktex.lha">
+ ftp://ftp.livewire.com.au/pub/aminet/text/tex/</a>, (Australia)
+
+<li> <a href="ftp://ftp.tas.gov.au/pub/aminet/text/tex/chktex.lha">
+ ftp://ftp.tas.gov.au/pub/aminet/text/tex/</a>, (Australia)
+
+<li> <a href="ftp://ftp.luth.se/pub/aminet/text/tex/chktex.lha">
+ ftp://ftp.luth.se/pub/aminet/text/tex/</a>, (Scandinavia)
+
+<li> <a href="ftp://ftp.eunet.ch/pub/aminet/text/tex/chktex.lha">
+ ftp://ftp.eunet.ch/pub/aminet/text/tex/</a>, (Switzerland)
+
+<li> <a href="ftp://ftp.germany.aminet.org/pub/aminet/text/tex/chktex.lha">
+ ftp://ftp.germany.aminet.org/pub/aminet/text/tex/</a>, (Germany)
+
+<li> <a href="ftp://ftp.pb.aminet.org/pub/aminet/text/tex/chktex.lha">
+ ftp://ftp.pb.aminet.org/pub/aminet/text/tex/</a>, (Germany)
+
+<li> <a href="ftp://ftp.uni-stuttgart.de/pub/aminet/text/tex/chktex.lha">
+ ftp://ftp.uni-stuttgart.de/pub/aminet/text/tex/</a>, (Germany)
+
+<li> <a href="ftp://ftp.uni-erlangen.de/pub/aminet/text/tex/chktex.lha">
+ ftp://ftp.uni-erlangen.de/pub/aminet/text/tex/</a>, (Germany)
+
+<li> <a href="ftp://ftp.cs.tu-berlin.de/pub/aminet/text/tex/chktex.lha">
+ ftp://ftp.cs.tu-berlin.de/pub/aminet/text/tex/</a>, (Germany)
+
+<li> <a href="ftp://ftp.tu-chemnitz.de/pub/aminet/text/tex/chktex.lha">
+ ftp://ftp.tu-chemnitz.de/pub/aminet/text/tex/</a>, (Germany)
+
+<li> <a href="ftp://ftp.fh-augsburg.de/pub/aminet/text/tex/chktex.lha">
+ ftp://ftp.fh-augsburg.de/pub/aminet/text/tex/</a>, (Germany)
+
+<li> <a href="ftp://ftp.uni-bremen.de/pub/aminet/text/tex/chktex.lha">
+ ftp://ftp.uni-bremen.de/pub/aminet/text/tex/</a>, (Germany)
+
+<li> <a href="ftp://ftp.uni-kl.de/pub/aminet/text/tex/chktex.lha">
+ ftp://ftp.uni-kl.de/pub/aminet/text/tex/</a>, (Germany)
+
+<li> <a href="ftp://ftp.uni-trier.de/pub/aminet/text/tex/chktex.lha">
+ ftp://ftp.uni-trier.de/pub/aminet/text/tex/</a>, (Germany)
+
+<li> <a href="ftp://ftp.informatik.rwth-aachen.de/pub/aminet/text/tex/chktex.lha">
+ ftp://ftp.informatik.rwth-aachen.de/pub/aminet/text/tex/</a>, (Germany)
+
+<li> <a href="ftp://ftp.uni-siegen.de/pub/aminet/text/tex/chktex.lha">
+ ftp://ftp.uni-siegen.de/pub/aminet/text/tex/</a>, (Germany)
+
+<li> <a href="ftp://ftp.uni-regensburg.de/pub/aminet/text/tex/chktex.lha">
+ ftp://ftp.uni-regensburg.de/pub/aminet/text/tex/</a>, (Germany)
+
+<li> <a href="ftp://sunsite.cnam.fr/pub/aminet/text/tex/chktex.lha">
+ ftp://sunsite.cnam.fr/pub/aminet/text/tex/</a>, (France)
+
+<li> <a href="ftp://aminet.grolier.fr/pub/aminet/text/tex/chktex.lha">
+ ftp://aminet.grolier.fr/pub/aminet/text/tex/</a>, (France)
+
+<li> <a href="ftp://ftp.giga.or.at/pub/aminet/text/tex/chktex.lha">
+ ftp://ftp.giga.or.at/pub/aminet/text/tex/</a>, (Austria)
+
+<li> <a href="ftp://sunsite.auc.dk/pub/aminet/text/tex/chktex.lha">
+ ftp://sunsite.auc.dk/pub/aminet/text/tex/</a>, (Denmark)
+
+<li> <a href="ftp://ftp.acropolis.gr/pub/aminet/text/tex/chktex.lha">
+ ftp://ftp.acropolis.gr/pub/aminet/text/tex/</a>, (Greece)
+
+<li> <a href="ftp://aminet.iit.uni-miskolc.hu/pub/aminet/text/tex/chktex.lha">
+ ftp://aminet.iit.uni-miskolc.hu/pub/aminet/text/tex/</a>, (Hungary)
+
+<li> <a href="ftp://ftp.italy.aminet.org/pub/aminet/text/tex/chktex.lha">
+ ftp://ftp.italy.aminet.org/pub/aminet/text/tex/</a>, (Italy)
+
+<li> <a href="ftp://ftp.man.szczecin.pl/pub/aminet/text/tex/chktex.lha">
+ ftp://ftp.man.szczecin.pl/pub/aminet/text/tex/</a>, (Poland)
+
+<li> <a href="ftp://ftp.portugal.aminet.org/pub/aminet/text/tex/chktex.lha">
+ ftp://ftp.portugal.aminet.org/pub/aminet/text/tex/</a>, (Portugal)
+
+<li> <a href="ftp://ftp.gui.uva.es/pub/aminet/text/tex/chktex.lha">
+ ftp://ftp.gui.uva.es/pub/aminet/text/tex/</a>, (Spain)
+
+<li> <a href="ftp://ftp.uk.aminet.org/pub/aminet/text/tex/chktex.lha">
+ ftp://ftp.uk.aminet.org/pub/aminet/text/tex/</a>, (UK)
+
+<li> <a href="ftp://micros.hensa.ac.uk/pub/aminet/text/tex/chktex.lha">
+ ftp://micros.hensa.ac.uk/pub/aminet/text/tex/</a>, (UK)
+
+ </ul>
+\end{rawhtml}
+
+\section{Installation}
+
+A few words on installation on various platforms:
+
+\begin{description}
+\item[Amiga:] Use the supplied Installer script.
+\item[MS-DOS \& OS/2:] Copy the binary (\Cmd{ChkTeX.exe}) to somewhere in
+ your path, and place the \rsrc\ file in the same directory.
+
+ If you're running Emacs, you may wish to copy the file \Cmd{chktex.el}
+ to your elisp source directory, and add the following line to your
+ \Cmd{.emacs} file:
+\begin{verbatim}
+(require 'chktex)
+\end{verbatim}
+
+\item[UNIX:] Type \Cmd{configure}, \Cmd{make} and finally
+ \Cmd{make~install}. To make sure everything proceeded correctly,
+ type \Cmd{make~check}. If you don't have superuser privileges and thus
+ access to the default system areas, you should type
+ \Cmd{configure~--help} to help you set up correct paths.
+
+ If you haven't installed any software like this before, that is
+ distributed in source form, here are some guidelines to help you
+ install it locally at your account. Please note that a mail to the
+ system administrator may be less work for you. \smiley
+
+ We assume that you have put the archive (\Cmd{chktex.tar.gz}) in a
+ subdir of yours, with path \Cmd{\~{}/tmp}. We further assume that
+ your shell is \Cmd{csh} or \Cmd{tcsh}. Do the following:
+
+ \begin{enumerate}
+ \item First of all, unpack the archive contents.
+
+\begin{verbatim}
+> cd ~/tmp
+> gunzip chktex.tar.gz
+> tar xf chktex.tar
+\end{verbatim}
+
+ \item Now, we can configure the program. There are some
+ configuration options you should know about:
+ \begin{description}
+ \item[\Cmd{--enable-emacs-hack}:] Install a small file which
+ adds \chktex\ to the command menu of AUC-\TeX. This is to be
+ considered as a hack, and may break in future versions of
+ AUC-\TeX. It works fine under AUC-\TeX\ v2.9, though.
+
+ This option needs the path of your elisp directory as argument,
+ e.g. \Cmd{--enable-emacs-hack=/home/myself/elisp} or similar.
+
+ You'll also have to add the following line to your \Cmd{.emacs}
+ file:
+\begin{verbatim}
+(require 'chktex)
+\end{verbatim}
+ You can now access \chktex\ from the \Cmd{Command} menu in
+ AUC-\TeX. To cycle through the messages, type \verb#C-x `#.
+
+ \item[\Cmd{--enable-lacheck-replace}] This enables a quick
+ hack for making the AUC-\TeX\ Emacs mode use \chktex\ instead of
+ lacheck. This is done by installing a stub script which
+ ``overrides'' the original lacheck executable.
+
+ While more stable than the previous solution, this is also
+ significantly less elegant --- in computing terms, this is the
+ ``brute force'' approach.
+
+ \item[\Cmd{--enable-debug-info}] \chktex\ has an ability to spit
+ out various diagnostic messages using the \Cmd{-d} flag. This
+ behaviour is on by default. By adding the flag
+ \Cmd{--disable-debug-info} to the commandline, this will not be
+ compiled in.
+
+ This may be useful if you're running short of disk space (the
+ time savings are neglible).
+ \end{description}
+
+ If you are installing the program on your local account, use the
+ following command:
+
+\begin{verbatim}
+> configure --prefix ~/
+\end{verbatim}
+
+ Add eventual extra flags as specified above. This command will
+ generate a significant amount of output, this can usually be ignored.
+
+ \item Finally, we can just build the program and install it.
+
+\begin{verbatim}
+> make
+> make install
+\end{verbatim}
+
+ \item Finished! The program is now installed and ready to use. You
+ may now tell other people to put your bindir in their path in
+ order to benefit from your work. All that remains is to make the
+ shell aware of your installation.
+
+\begin{verbatim}
+> rehash
+\end{verbatim}
+
+ To make the remaining parts of your system aware of this, you'll
+ have to log out and re-log in, I'm afraid. However, you should delay this
+ until you've completed this installation procedure.
+
+ \item If you wish to make sure that everything is OK (you ought to),
+ you may now ask \chktex\ to do a self-test:
+
+\begin{verbatim}
+> make check
+\end{verbatim}
+
+ \end{enumerate}
+
+\item[Other platforms:] First of all, you have to copy the
+ \Cmd{config.h.in} file to a file named \Cmd{config.h}. Then, edit
+ it to reflect your system. Do the same with \Cmd{OpSys.h} (this
+ file has been reduced significantly). If you wish, you may define
+ \Cmd{DATADIR} to the path you want the global resource file to be
+ put.
+
+ Now, I would suggest that you take a peak at the \Cmd{OpSys.c}
+ file, and edit it appropiately, for more
+ comfort. This should not be necessary, though, at least not the
+ first time.
+
+ Finally, you may now compile and link all \verb@.c@ files. Define
+ \Cmd{HAVE\_CONFIG\_H} to 1 (on the command-line, for instance). If
+ the \Cmd{config.h} you wish to use has another name, define
+ \Cmd{CONFIG\_H\_NAME} to that (in that case, don't define
+ \Cmd{HAVE\_CONFIG\_H}).
+
+ Put the directory path of the \rsrc\ file in a environment variable
+ named \Cmd{CHKTEXRC}. The files \Cmd{deweb.in} and \Cmd{chkweb}
+ should be moved to a directory in your path. These files may need
+ further setup, as they haven't got the location of perl
+ initialized.
+
+ If your compiler/the compiled program complains (or crashes!), you
+ may try the hints listed below. Please note that it only makes
+ sense to try these hints if your compiler fails to produce a working
+ program.
+
+ \begin{enumerate}
+ \item Increase the preprocessor buffers and line buffers. The
+ \chktex{} sources define macros sized 3--4k (expanding to about
+ the same), and passes arguments sized about 1k.
+ \item Use the magic switch which lets us use large
+ \Cmd{switch(\dots)\{\dots\}} statements; some of these statements
+ have about 120 \Cmd{case} entries.
+ \item The sources require that at least the first 12 of each
+ identifier is significant.
+ \end{enumerate}
+\end{description}
+{\bf Note:\/} You {\em must\/} install the new \rsrc\ file; \chktex\ will
+fail to function unless!
+
+ After doing this, you may enhance \chktex' behaviour by
+reading/editing the \rsrc\ file.
+
+%latex
+\section{Usage}
+
+\subsection{\chktex}
+
+Amiga v2.04+ users may wish to note that you may pass the files that
+\chktex\ is to process by shift-clicking them. In addition, you may
+specify the arguments as tooltypes to the main program icon, using the
+{\sf Info} menu option. For instance, if you wish to make the `fancy'
+output the default when starting from Workbench, enter the following
+as a tooltype:
+%
+\begin{verbatim}
+Verbosity=2
+\end{verbatim}
+%
+We use the WB2Argv package (also developed by me, available on Aminet as
+\Cmd{dev/c/WB2Argv.lha}), and
+will fold case until the \Cmd{=} character, in tradition with the
+case-insensitivity of Amiga OS\@. In all other respects (and platforms), the
+options listed below are case-sensitive.
+
+
+
+\subsubsection{Synopsis}
+
+A UNIX-compliant template format follows:
+
+\newcommand{\Group}[1]{\mbox{[#1]}}
+\begin{tabularx}\textwidth{lY}
+ \tt chktex & \tt \Group{-hiqrW} \Group{-v[0-\dots]} \Group{-l
+ <rcfile>} \Group{-[wemn] <[1-42]|all>} \Group{-d[0-...]} \Group{-p
+ <pseudoname>} \Group{-o <outputfile>} \Group{-[btxgI][0|1]}
+ file1 file2 \dots
+\end{tabularx}
+
+
+\subsubsection{Options}
+
+These are the options \chktex\ currently accepts.
+Please note that single-lettered options requiring a numerical or no
+argument may be concatenated. E.g.\ saying \Cmd{-v0qb0w2} is the
+same as saying \Cmd{-v0~-q~-b0~-w2}, except for being less to
+type.
+
+Enough general talk; here's a rather detailed description of all
+options:
+\begin{description}
+\item[Misc.\ options:] General options which aren't related to some
+ specific subpart of \chktex.
+ \begin{description}
+ \item[{\tt -h [--help]}] Gives you a command summary.
+ \item[{\tt -i [--license]}] Shows distribution information.
+ \item[{\tt -l [--localrc]}] Reads a resource-file formatted
+ as the global resource-file \rsrc, in addition to the global
+ resource-file. This option needs the name of the resource-file
+ as a parameter. See also {\tt -g}.
+ \item[{\tt -r [--reset]}] This will reset all settings to their
+ defaults. This may be useful if you use the {\tt CMDLINE}
+ directive in your \rsrc\ file, and wish to do something
+ unusual.
+ \item[{\tt -d [--debug]}] Needs a numeric argument; a bitmask
+ telling what to output. The values below may be added in order
+ to output multiple debugging info.
+
+ \begin{tabularx}\linewidth{cX}
+ \bf Value & \bf Dumps\ldots\\
+ 1 & All warnings available and their current status. \\
+ 2 & Statistics for all lists in the resource file. \\
+ 4 & The contents of all lists in the resource file. \\
+ 8 & Misc.\ other status information. \\
+ 16 & Run-time info (note that this isn't widely used). \\
+ \end{tabularx}
+ The info is produced after all switches and resource files have
+ been processed.
+
+ It is possible to install versions of \chktex\ that ignore this
+ flag; this means that it is not certain that this flag works.
+ \item[{\tt -W [--version]}] Displays version information, and exits.
+ \end{description}
+\item[Muting warning messages:] Controls whether and in what form
+ error messages will appear. Usually they accept a specific warning
+ number (e.g.\ \Cmd{-w2}), but you may also say \Cmd{all} (e.g.\
+ \Cmd{-wall}) which does the operation on {\em all\/} warnings.
+ \begin{description}
+ \item[{\tt -w [--warnon]}] Makes the message number passed as
+ parameter a warning and turns it on.
+ \item[{\tt -e [--erroron]}] Makes the message number passed as
+ parameter an error and turns it on.
+ \item[{\tt -m [--msgon]}] Makes the message number passed as
+ parameter a message and turns it on. Messages are not counted.
+ \item[{\tt -n [--nowarn]}] Turns the warning/error number passed
+ as a parameter off.
+ \end{description}
+\item[Output control flags:] Determines the appearance and
+ destination of the error reports.
+ \begin{description}
+ \item[{\tt -q [--quiet]}] Shuts up about copyright information.
+ \item[{\tt -o [--output]}] Normally, all errors are piped to {\tt stdout}.
+ Using this option with a parameter, errors will be sent to the
+ named file instead. Only information relative to the \LaTeX\ file
+ will be sent to that file. Memory problems and similar will as as
+ always be sent to {\tt stderr}. If a file with the name given
+ already exists, it will be renamed to \Cmd{foobar.bak}
+ (\Cmd{foobar.\$cl} under MS-DOS), \Cmd{foobar} being the name of
+ the file. See also \Cmd{-b}.
+
+ \item[{\tt -v [--verbosity]}] Specifies how much and how you
+ wish the error reports to be displayed. This is specified in the
+ \rsrc\ file; we'll list the default values below. If you wish,
+ you may thus edit the \rsrc\ file to add or modify new formats.
+
+ The default is mode 1 (that is, the {\em second\/} entry in the
+ \rsrc\ file), using {\tt -v} without any parameter will give you
+ mode 2.
+
+ \begin{description}
+ \item[0] Will show the information in a way that should be
+ suitable for further parsing by {\tt awk}, {\tt sed} or
+ similar. The format is as follows:
+\begin{verbatim}
+File:Line:Column:Warning number:Warning message
+\end{verbatim}
+ The colons may be replaced with another string; use the
+ \verb@-s@ switch for this.
+
+ As the program does not output all errors in quite order, this
+ output format is also suitable for piping through \Cmd{sort}.
+ \item[1] Shows the information in a way which is more
+ comprehensible for humans, but which still doesn't need
+ anything but a glass tty.
+ \item[2] Shows the information in a fancy way, using escape
+ codes and stuff. It is the indeed most readable of all
+ modes; however, it needs proper set up of the \Cmd{ChkTeX.h}
+ at compilation time. UNIX boxes, however, will find the
+ information automatically.
+ \item[3] Shows the information suitable for parsing by Emacs;
+ this is the same format as {\tt lacheck} uses. More formally,
+ it is the following:
+\begin{verbatim}
+"File", line Line: Warning message
+\end{verbatim}
+
+ To utilize this, type \verb@M-x compile RET@. Delete whatever
+ is written in the minibuffer, and type
+ \verb@chktex -v3 texfile.tex@, and you should be able to
+ browse through the
+ error messages. Use \verb@C-x `@ to parse the messages.
+ \item[4] More or less the same as \verb@-v3@, but also includes
+ information on where the error actually was found. Takes somewhat
+ longer time to parse, but much more informative in use.
+ \end{description}
+
+ \item[{\tt -f [--format]}] Specifies the format of the output.
+ This is done using a format similar to \Cmd{printf()}, where we
+ support the specifiers listed below.
+
+ \smallskip
+ \newcommand{\Pf}[1]{\tt \%#1 &}
+ \begin{tabularx}{\linewidth}{cX}
+ \bf Code & \bf Description \\
+ \Pf{b} String to print {\bf b\/}etween fields (from {\tt
+ -s} option). \\
+ \Pf{c} {\bf C\/}olumn position of error. \\
+ \Pf{d} Length of error ({\bf d\/}igit). \\
+ \Pf{f} Current {\bf f\/}ilename.\\
+ \Pf{i} Turn on {\bf i\/}nverse printing mode.\\
+ \Pf{I} Turn off {\bf i\/}nverse printing mode.\\
+ \Pf{k} {\bf k\/}ind of error (warning, error, message).\\
+ \Pf{l} {\bf l\/}ine number of error.\\
+ \Pf{m} Warning {\bf m\/}essage.\\
+ \Pf{n} Warning {\bf n\/}umber.\\
+ \Pf{u} An {\bf u\/}nderlining line (like the one which
+ appears when using \Cmd{-v1}).\\
+ \Pf{r} Part of line in front of error ($\mbox{`S'} -
+ 1$).\\
+ \Pf{s} Part of line which contains error ({\bf
+ s\/}tring).\\
+ \Pf{t} Part of line after error ($\mbox{`S'} + 1$).
+ \end{tabularx}
+ \smallskip
+
+ Other characters will be passed literally; thus you can say
+ \Cmd{\%\%} to achieve a single percent sign in the output.
+ Please note that we may introduce other specifiers in the future,
+ so don't abuse this feature for other characters.
+
+ Also, note that we do {\em not\/} support field lengths (yet).
+ This may come in the future, if I get the time\dots
+
+ The {\tt -v} command is implemented by indexing into the \rsrc\
+ file; read that for seeing how each format is implemented. If
+ you find yourself using a particular format often by using the
+ -f switch, consider putting it in the \rsrc\ file instead.
+ \item[{\tt -V [--pipeverb]}] Which entry we'll use in the \rsrc\
+ file whenever {\tt stdout} isn't a terminal.
+
+ The default is to use the same mode as specified with the
+ {\tt -v} switch; using {\tt -V} without any parameter will give you
+ mode 1.
+
+ This switch was implemented because GNU less has problems with
+ the escape codes \chktex\ uses for displaying inverse text.
+ Under UNIX, there's another way around, though, which is slightly
+ more elegant. Add the following line to your \Cmd{.envir} file:
+\begin{verbatim}
+setenv LESS -r
+\end{verbatim}
+
+ \item[{\tt -p [--pseudoname]}] With this switch, you can provide
+ the filename which will be used when we report the errors. This
+ may be useful in scripts, especially when doing pipes. It is in
+ other words similar to C's \verb@#line@ directive.
+
+ We will only assume this name for the uppermost file; files that
+ this one in turn \verb@\@\verb@input@ are presented under their original
+ names. This seems most logical to me.
+
+ \item[{\tt -s [--splitchar]}] String to use instead of the
+ colons when doing {\tt -v0}; e.g.\ this string will be output
+ between the fields.
+
+ \end{description}
+\item[Boolean switches:] Common for all of these are that they
+ take an optional parameter. If it is {\tt 0}, the feature will
+ be disabled, if it is {\tt 1}, it will be enabled. All these
+ features are on by default; and are toggled if you don't give
+ any parameter.
+
+ \begin{description}
+ \item[{\tt -b [--backup]}] If you use the {\tt -o} switch, and the
+ named outputfile exists, it will be renamed to {\tt filename.bak}.
+ \item[{\tt -I [--inputfiles]}] Execute \verb@\@\verb@input@
+ statements; e.g.\ include the file in the input. Our input parsing
+ does of course nest; we use an input-stack to keep track of this.
+ \item[{\tt -H [--headererr]}] Show errors found in front of the
+ \verb@\begin{document}@ line. Some people keep {\em lots\/} of
+ pure \TeX\ code there, which errors can't be detected reliably
+ (in other words, we will in most cases just produce a lot of
+ garbage).
+ \item[{\tt -g [--globalrc]}] Read in the global resource file. This
+ switch may be useful together with the {\tt -l} option.
+ \item[{\tt -t [--tictoc]}] Display a twirling baton, to show that
+ we're working. {\tt -v0} does an {\tt -t0}, too, as it assumes
+ that the user then uses the program non-interactively. This is
+ now a no-op.
+ \item[{\tt -x [--wipeverb]}] Ignore the ``\verb@\verb@'' command
+ found within the \LaTeX\ file and its argument is completely by
+ the checking routines. This is done by simply overwriting them.
+ If you somehow don't like that (for instance, you would like to
+ count brackets inside those commands, too), use this switch.
+ \end{description}
+\end{description}
+
+
+If you don't specify any input \LaTeX-files on the commandline, we'll
+read from {\tt stdin}. To abort {\tt stdin} input, press the
+following keycombinations:
+
+\smallskip
+\begin{tabular}{ll}
+ \bf Machine & \bf Key-combination \\
+ Amiga & $\fbox{\tt Ctrl} + \fbox{\tt\BS}$ \\
+ UNIX & $\fbox{\tt Ctrl} + \fbox{\tt D}$ \\
+ MS-DOS & $\fbox{\tt Ctrl} + \fbox{Z}$, followed by return.
+\end{tabular}
+\smallskip
+
+By default, we're using the 1994 version of GNU's \Cmd{getopt()}
+routine. For those of you who have only used the Amiga's \Cmd{ReadArgs()},
+here are some quick instructions:
+
+\begin{itemize}
+\item Options may be given in any order; the names of the \LaTeX-files
+ do not have to be the last arguments. This behaviour may be turned
+ off by creating an environment variable named \Cmd{POSIXLY\_CORRECT}.
+\item The special argument \Cmd{--} forces an end of
+ option-scanning.
+\item Long-named options begin with \Cmd{--} instead of \Cmd{-}.
+ Their names may be abbreviated as long as the abbreviation is unique
+ or is an exact match for some defined option. If they have an
+ argument, it follows the option name in the argument, separated from
+ the option name by a \Cmd{=}, or else the in next argument.
+\end{itemize}
+
+\subsubsection{The \rsrc\ file}
+
+You should also take a look at the \rsrc\ file. As the file is
+self-documenting; you should be able to get the meaning of each
+keyword by simply reading the file. The method for {\em finding it},
+however, has grown rather complex. An outline is given below.
+
+If \chktex\ finds multiple files when searching, each and everyone
+will be read in the order specified below. The \Cmd{Keyword = \{ item
+ item \dots \}} may thus be necessary to reset previously defined
+lists.
+
+In this list, \Cmd{\$foo} is assumed to be the environment variable
+\Cmd{foo}:
+
+\begin{enumerate}
+\item First, we'll take a look at the directory which was specified as
+ \Cmd{DATADIR} during compilation (this does not happen on Amiga
+ machines). On UNIX boxes, this usually evaluates to
+ \Cmd{/usr/local/share/chktexrc} or similar, under MS-DOS it is set
+ to \Cmd{\BS{}emtex\BS{}data\BS{}chktexrc}.
+
+\item Look in the following system directories:
+
+ \begin{tabular}{ll}
+ \bf Machine & \bf Directory \\
+ 2.04+ Amiga & {\tt ENV:.chktexrc} \\
+ 1.3 Amiga & {\tt S:.chktexrc} \\
+ UNIX & \Cmd{\$HOME/.chktexrc} or \Cmd{\$LOGDIR/.chktexrc} \\
+ MSDOS & Program installation path
+ \end{tabular}
+
+\item Look for it in the directory pointed to by an environment
+ variable, as specified in the table below:
+
+ \begin{tabularx}\linewidth{lY}
+ \bf Machine & \bf Directory \\
+ Amiga & \Cmd{\$CHKTEXRC/.chktexrc} \\
+ UNIX & \Cmd{\$CHKTEXRC/.chktexrc} \\
+ MSDOS & \Cmd{\$CHKTEXRC\BS{}chktexrc}, \Cmd{\$CHKTEX\_HOME\BS
+ chktexrc} or \Cmd{\$EMTEXDIR\BS{}data\BS{}chktexrc}
+ \end{tabularx}
+
+\item Look for it in the current directory. On UNIX and Amiga boxes,
+ we expect the filename to be \Cmd{.chktexrc}; on other machines
+ \Cmd{chktexrc}.
+
+\end{enumerate}
+
+If you for some reason wish to undo what the previous files may have
+done, you may say \Cmd{CmdLine \{ -g0 -r \}} somewhere in the \rsrc\
+file; this will reset all previous settings.
+
+
+\subsubsection{Hints}
+I've tried to collect some advice that may be useful --- if you have a
+favourite hint, feel free to send it to me!
+
+\begin{itemize}
+\item If you use \Cmd{german.sty}; it may be wise to put \Cmd{-n18} in
+ the \Cmd{CmdLine} entry in the \rsrc\ file. This will probably reduce
+ the amount of false warnings significantly.
+\item Put \Cmd{-v} in the \Cmd{CmdLine} entry of the \rsrc\ file; this
+ makes the fancy printing the default.
+\item If you're working on a large project, it may pay off to make a
+ local resource file which is included in addition to the global
+ one. In this one, add the necessary info to reduce the amount of
+ false warnings --- these usually don't do anything but hide the
+ real warnings.
+\item Create a total ignore environment, which \chktex\ will ignore
+ completely. In here, you can place all that code which outsmarts
+ \chktex\ completely. For instance, add the following lines at the top
+ of your \LaTeX\ file:
+\begin{verbatim}
+% ChkTeX will ignore material within this environment
+\newenvironment{ignore}{}{}
+\end{verbatim}
+ In addition, you should add the item \Cmd{ignore} to the \Cmd{VerbEnvir}
+ entry in the \rsrc\ file.
+\end{itemize}
+\subsubsection{Bugs}
+
+No fatal ones, I think, but the program currently has some problems when a
+\LaTeX\ command/parameter stretch over a two lines --- some extra spaces
+may be inserted into the input. I regard the program as fairly well
+tested; using the SAS/C \Cmd{cover} utility I was able to make sure that
+approximately 95\% of the code has actually been run successfully in the
+final version. This does indeed leave some lines; most of these are
+procedure terminating brackets or ``can't happen'' lines, though.
+
+We've got some problems when isolating the arguments of a command.
+Although improved, it will certainly fail in certain cases; \chktex\
+can for instance not handle arguments stretching over two lines. This
+also means that \Cmd{WIPEARG} entries in the \rsrc\ file will only
+have the first half of their argument wiped if the argument stretches
+over two lines. We will, however, take care not to wipe parenthesis
+in such cases, in order to avoid false warnings.
+
+Before submitting a bug report, please first see whether the problem can be
+solved by editing the \rsrc\ file appropiately.
+
+
+
+\subsection{ChkWEB}
+
+This shell script is provided for checking CWEB files. The template is
+as follows:
+\begin{verbatim}
+chkweb [options] file1 file2 ...
+\end{verbatim}
+As you may see from the script, it is only a trivial interface towards
+{\tt deweb} and \chktex. It does not support any individual options
+on the command line --- all options found will be passed onto \chktex.
+If \Cmd{--} or a filename is found, the remaining parameters will be
+ignored.
+The only real intelligence it features is that it will try to append
+\verb@.w@ to filenames it can't find.
+
+If no filenames are given, we will read from {\tt stdin}.
+
+\subsection{DeWEB}
+
+This program strips away C code and CWEB commands from CWEB sources.
+It is called with the following synopsis:
+
+\begin{verbatim}
+deweb file1 file2 ...
+\end{verbatim}
+
+{\tt deweb} filters away all C \&\ CWEB commands from a CWEB source code.
+This leaves only the \LaTeX\ code. This stripped code, in turn, may then
+be passed to a suitable syntax checker for \LaTeX, like \chktex\ and {\tt
+ lacheck}, or spell-checkers like {\tt ispell}.
+
+When {\tt deweb} strips away the C code from your CWEB source, it tries to
+preserve line breaks. This means that the error reports from {\it your
+ favorite tool\/} will be correct regarding to line numbers. In most
+cases, the column position will also be correct. This significantly
+simplifies finding the errors in the \LaTeX\ source (in contrast to the
+output from {\tt cweave}, which output is truly difficult to figure
+anything out from).
+
+{\tt deweb} accepts a list of filenames on the argument line, and will send
+its output to {\tt stdout}. If no filenames are given, it will read from
+stdin, acting as a filter. No options are currently accepted.
+
+Macho users may try to pipe the output from {\tt deweb} directly into
+\LaTeX, theoretically, this should work. This would ease the debugging of
+the \LaTeX\ code significantly, as when \LaTeX\ complains about wrong
+syntax, you'll be able to find the erroneous line much more easily. Don't
+expect that the output looks very much like the final one, though.
+
+{\tt deweb} should now understand all correct {\tt CWEB} opcodes. If it
+complains about not understanding a correct opcode, please inform the
+author.
+
+\subsubsection{Bugs}
+
+{\tt deweb} will not even {\em compile\/} under Perl versions before perl
+v5. Unfortunately, this means that we can't even tell the user why we
+failed; Perl will just complain about not being able to compile the
+regexps.
+
+\section{Explanation of error messages}
+Below is a description of all error-messages \chktex\ outputs.
+Error messages set in {\it italic type\/} are turned off by default.
+Where margin paragraphs are listed in the text, they refer to the
+keyword in the \rsrc\ file which controls the discussed warning.
+
+\newcommand\Keyword[1]{\marginpar{\large\tt\hfill\\ #1}}
+
+\smallskip\pagebreak[2]
+\Keyword{Silent}
+\begin{errdesc}{Command terminated with space.}
+ You tried to terminate a command with a blank space. Usually, this
+ is an error as these are ignored by \LaTeX. In most cases, you would
+ like to have a real space there.
+
+ \begin{errexam}
+ \verb@\LaTeX@\underline{\tt }\verb@is a typesetter.@ \\*
+ \LaTeX is a typesetter. \\*
+ \smallskip
+ \verb@\LaTeX\ is a typesetter.@ \\*
+ \LaTeX\ is a typesetter. \\*
+ \end{errexam}
+\end{errdesc}
+
+\Keyword{Linker}
+\begin{errdesc}{Non-breaking space (`\~{}') should have been used.}
+ When reading a document, it is not very pretty when references are
+ split across lines. If you use the \verb@~@ character, \LaTeX\ will
+ assign a very high penalty for splitting a line at that point.
+ \chktex\ issues this warning if you have forgot to do this.
+
+ \begin{errexam}
+ \verb@Please refer to figure@\underline{\tt\ }\verb@\ref{foo}.@ \\*
+ Please refer to figure 11. \\* % Gotta cheat here! :)
+ \smallskip
+ \verb@Please refer to figure~\ref{foo}.@ \\*
+ Please refer to figure~11. \\*
+ \end{errexam}
+\end{errdesc}
+
+\begin{errdesc}{You should enclose the previous parenthesis with `\{\}'.}
+
+ This is a warning which you may ignore, but for maximum aestethic
+ pleasure, you should enclose your bracket characters with `\{\}'s.
+
+ \begin{errexam}
+ \verb@$@\underline{\tt\ }\verb@[(ab)^{-1}]@\underline{\tt\ }\verb@\^{-2}$@ \\*
+ $[(ab)^{-1}]^{-2}$ \\*
+ \smallskip
+ \verb@${[{(ab)}^{-1}]}^{-2}$@ \\*
+ ${[(ab)^{-1}]}^{-2}$ \\*
+ \end{errexam}
+\end{errdesc}
+
+\Keyword{Italic\\ItalCmd\\NonItalic}
+\begin{errdesc}{Italic correction (`\BS/') found in non-italic
+ buffer.}
+ If you try to use the \verb@\/@ command when \chktex\ believes that
+ the buffer is not outputted as italic, you'll get this warning.
+
+ \begin{errexam}
+ \verb@This is an@\underline{\tt\BS/}\verb@ example@ \\*
+ This is an\/ example. \\*
+ \smallskip
+ \verb@This is an example.@ \\*
+ This is an example. \\*
+ \end{errexam}
+\end{errdesc}
+
+\Keyword{Italic\\ItalCmd\\NonItalic}
+\begin{errdesc}{Italic correction (`\BS/') found more than once.}
+ If the buffer is italic, and you try to use the \verb@\/@ command
+ more than once, you'll get this warning.
+
+ \begin{errexam}
+ \verb@This {\it example\/@\underline{\tt\BS/}\verb@} is not amusing.@ \\*
+ This {\it example\/\/} is not amusing. \\*
+ \smallskip
+ \verb@This {\it example\/} is not amusing.@ \\*
+ This {\it example\/} is not amusing. \\*
+ \end{errexam}
+\end{errdesc}
+
+\Keyword{Italic\\ItalCmd\\NonItalic}
+\begin{errdesc}{No italic correction (`\BS/') found.}
+ You get this error if \chktex\ believes that you are switching from
+ italic to non-italic, and you've forgot to use the \verb@\/@ command
+ to insert that extra little spacing. If you use the \Cmd{em} option,
+ you may ignore this warning.
+
+ \begin{errexam}
+ \verb@This {\it example@\underline{\tt\ }\verb@} is not amusing, either.@ \\*
+ This {\it example} is not amusing, either. \\*
+ \smallskip
+ \verb@This {\it example\/} is not amusing, either.@ \\*
+ This {\it example\/} is not amusing, either. \\*
+ \end{errexam}
+\end{errdesc}
+
+\Keyword{IJAccent}
+\begin{errdesc}{Accent command `command' needs use of `command'.}
+ If you're using accenting commands, `i' and `j' should lose their
+ dots before they get accented. This is accomplished by using the
+ \verb@\i@, \verb@\j@, \verb@\imath@ and \verb@\jmath@ command.
+
+ \begin{errexam}
+ \verb@This is an example of use of accents: \'{@\underline{\tt i}\verb@}.@ \\*
+ This is an example of use of accents: \'{i}. \\*
+ \smallskip
+ \verb@This is an example of use of accents: \'{\i}.@ \\*
+ This is an example of use of accents: \'{\i}. \\*
+ \end{errexam}
+\end{errdesc}
+
+\Keyword{HyphDash\\NumDash\\WordDash}
+\begin{errdesc}{Wrong length of dash may have been used.}
+ This warning suggests that a wrong number of dashes may have been
+ used. It does this by classifying the dash according to the the
+ character in front and after the dashes.
+
+ If they are of the same type, \chktex\ will determine which keyword
+ to use in the \rsrc\ file. If not, it will shut up and accept that
+ it doesn't know.
+
+ \begin{tabular}{ll}
+ \bf Character type & \bf Keyword in \rsrc\ file \\*
+ Space & \tt WordDash \\*
+ Number & \tt NumDash \\*
+ Alphabetic character & \tt HyphDash \\*
+ \end{tabular}
+
+ This is more or less correct, according to my references. Hopefully
+ this check can be even more improved (suggestions?).
+
+ \begin{errexam}
+ \verb@It wasn't anything @\underline{\tt-}\verb@ just a 2@\underline
+ {\tt---}\verb@3 star@\underline{\tt--}\verb@shots.@ \\*
+ It wasn't anything - just a 2---3 star--shots. \\*
+ \smallskip
+ \verb@It wasn't anything --- just a 2--3 star-shots@ \\*
+ It wasn't anything --- just a 2--3 star-shots. \\*
+ \end{errexam}
+\end{errdesc}
+
+
+\fmted{`\%s' expected, found `\%s'.}
+\begin{errdesc}{Solo `\%s' found.}
+ You get this warning whenever brackets or environments don't match.
+ \chktex\ expect to find matching brackets/environments in the
+ same order as their opposites were found, and no closing delimiters
+ which haven't been preceded by an opening one.
+
+ While bracket matching is not an explicit error, it is usually a
+ sign that something is wrong.
+
+\end{errdesc}
+
+\Keyword{CenterDots\\LowDots}
+\begin{errdesc}{You should use `\%s' to achieve an ellipsis.}
+ Simply typing three \Cmd{.} in a row will not give a perfect spacing
+ withing the between the dots. The \verb@\ldots@ is much more
+ suitable for this.
+
+ In math mode, you should also distinguish between \verb@\cdots@ and
+ \verb@\ldots@; take a look at the example below.
+
+ \begin{errexam}
+ \newcommand{\td}{\underline{\tt...}}
+ \verb@Foo@\td\verb@bar. $1,@\td\verb@,3$. $1+@\td\verb@+3$. $1,@%
+ \underline{\tt\BS{}cdots}\verb@,3$.@ \\*
+ Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. \\*
+ \smallskip
+ \verb@Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$.@ \\*
+ Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. \\
+ \end{errexam}
+\end{errdesc}
+
+\Keyword{Abbrev}
+\begin{errdesc}{Interword spacing (`\BS\ ') should perhaps be used.}
+
+ One of the specified abbreviations were found. Unless you have
+ previously said \verb@\frenchspacing@, you'll have incorrect
+ spacing, which one should avoid if possible.
+
+ \begin{errexam}
+ \verb@This is an example, i.e.@\underline{\tt\ }\verb@an demonstration.@ \\*
+ This is an example, i.e. an demonstration. \\*
+ \smallskip
+ \verb@This is an example, i.e.\ an demonstration.@ \\*
+ This is an example, i.e.\ an demonstration. \\*
+ \end{errexam}
+\end{errdesc}
+
+\begin{errdesc}{Intersentence spacing (`\BS{}@') should perhaps be used.}
+
+ \LaTeX' detection of whether a period ends a sentence or not, is
+ only based upon the character in front of the period. If it's
+ uppercase, it assumes that it does not end a sentence. While this
+ may be correct in many cases, it may be incorrect in others.
+ \chktex\ thus outputs this warning in every such case.
+
+ \begin{errexam}
+ \verb@I've seen an UFO!@\underline{\tt\ }\verb@Right over there!@ \\*
+ I've seen an UFO! Right over there! \\*
+ \smallskip
+ \verb+I've seen an UFO\@! Right over there!+ \\*
+ I've seen an UFO\@! Right over there! \\*
+ \end{errexam}
+\end{errdesc}
+
+\begin{errdesc}{Could not find argument for command.}
+
+ \chktex\ will in some cases need the argument of a function to
+ detect an error. As \chktex\ currently processes the \LaTeX\ file on
+ a line-by-line basis, it won't find the argument if the command
+ which needed it was on the previous line. On the other hand, this
+ {\em may\/} also be an error; you ought to check it to be safe.
+
+ \begin{errexam}
+ \verb@$\hat$@ \\*
+ This will give a \LaTeX\ error\dots \\*
+ \smallskip
+ \verb@$\hat{a}$@ \\*
+ $\hat{a}$ \\*
+ \end{errexam}
+\end{errdesc}
+
+\begin{errdesc}{No match found for `\%s'.}
+
+ This warning is triggered if we find a single, {\em opening\/}
+ bracket or environment. While bracket matching is not an explicit
+ error, it is usually a sign that something is wrong.
+
+\end{errdesc}
+
+\Keyword{MathEnvir}
+\begin{errdesc}{Mathmode still on at end of LaTeX file.}
+ This error is triggered if you at some point have turned on
+ mathmode, and \chktex\ couldn't see that you remembered to turn it
+ off.
+
+\end{errdesc}
+
+\begin{errdesc}{Number of `character' doesn't match the number of `character'.}
+
+ Should be self-explanatory. \chktex\ didn't find the same number of
+ an opening bracket as it found of a closing bracket.
+
+\end{errdesc}
+
+\begin{errdesc}{You should use either `` or '' as an alternative to `\,"\,'.}
+ Self-explanatory. Look in the example, and you'll understand why.
+
+ \begin{errexam}
+ \verb@This is an @\underline{\tt"}\verb@example@\underline{\tt"} \\*
+ This is an "example" \\*
+ \smallskip
+ \verb@This is an ``example''@ \\*
+ This is an ``example'' \\*
+ \end{errexam}
+\end{errdesc}
+
+\begin{errdesc}{You should use "'" (ASCII 39) instead of
+ "'" (ASCII 180).} On some keyboards you might get the wrong quote.
+ This quote looks, IMHO, {\em ugly\/} compared to the standard
+ quotes, it doesn't even come out as a quote! Just see in the
+ example.
+
+
+ \begin{errexam}
+ \verb@``There@\underline{\tt '}\verb@s quotes and there@\underline{\tt '}\verb@s quotes@
+ \underline{\tt ''} \\* % ''
+ ``There´s quotes and there´s quotes´´ \\* % ''
+ \smallskip
+ \verb@``There's quotes and there's quotes''@ \\*
+ ``There's quotes and there's quotes'' \\*
+ \end{errexam}
+\end{errdesc}
+
+\Keyword{Userwarn}
+\begin{errdesc}{User-specified pattern found.}
+ A substring you've specified using {\tt USERWARN} in the \rsrc\ file,
+ has been found.
+\end{errdesc}
+
+\begin{errdesc*}{This command might not be intended.}
+ I implemented this because a friend of mine kept on making these
+ mistakes. Easily done if you haven't gotten quite into the syntax
+ of \LaTeX.
+
+ \begin{errexam}
+ \verb@\LaTeX\ is an extension of \TeX@\underline{\tt\BS.}\verb@ Right?@ \\*
+ \LaTeX\ is an extension of \TeX\. Right? \\*
+ \smallskip
+ \verb@\LaTeX\ is an extension of \TeX. Right?@ \\*
+ \LaTeX\ is an extension of \TeX. Right? \\*
+ \end{errexam}
+\end{errdesc*}
+
+\begin{errdesc*}{Comment displayed.}
+ \chktex\ dumps all comments it finds, which in some cases is useful.
+ I usually keep all my notes in the comments, and like to review them
+ before I ship the final version. For commenting out parts of the
+ document, the \Cmd{comment} environment is better suited.
+
+\end{errdesc*}
+
+
+\begin{errdesc}{Either ''\BS,' or '\BS,'' will look better.}
+
+ This error is generated whenever you try to typeset three quotes in
+ a row; this will not look pretty, and one of them should be
+ separated from the rest.
+
+ \begin{errexam}
+ \underline{\tt```}\verb@Hello', I heard him said'', she remembered.@ \\*
+ ```Hello', I heard him said'', she remembered. \\*
+ \smallskip
+ \verb@``\,`Hello', I heard him said'', she remembered.@ \\*
+ ``\,`Hello', I heard him said'', she remembered.
+ \end{errexam}
+\end{errdesc}
+
+\Keyword{PostLink}
+\begin{errdesc}{Delete this space to maintain correct pagereferences.}
+ This message, issued when a space is found in front of a
+ \verb@\index@, \verb@\label@ or similar command (can be set in the
+ \rsrc\ file). Sometimes, this space may cause that the word and the
+ index happens on separate pages, if a pagebreak happens just there.
+
+ You might also use this warning to warn you about spaces in front of
+ footnotes; however, the warning text may not be entirely correct
+ then.
+
+ \begin{errexam}
+ \verb@Indexing text@\underline{\tt\ }\verb@\index{text} is fun!@ \\*
+ \smallskip
+ \verb@Indexing text\index{text} is fun!@ \\*
+ \end{errexam}
+\end{errdesc}
+
+\begin{errdesc}{You might wish to put this between a pair of `\{\}'}
+
+ This warning is given whenever \chktex\ finds a \Cmd{\^{ }}' or a
+ \Cmd{\_} followed by either two or more numberic digits or two or
+ more alphabetic characters. In most situations, this means that
+ you've forgotten some \{\}'s.
+
+ \begin{errexam}
+ \verb@$5\cdot10^@\underline{\tt10}\verb@$@ \\*
+ $5\cdot10^10$ \\*
+ \smallskip
+ \verb@$5\cdot10^{10}$@ \\*
+ $5\cdot10^{10}$
+ \end{errexam}
+\end{errdesc}
+
+\begin{errdesc}{You ought to remove spaces in front of punctuation.}
+
+ This warning is issued if \chktex\ finds space in front of an
+ end-of-sentence character.
+
+ \begin{errexam}
+ \verb@Do you understand@\underline{\tt\ }\verb@?@ \\*
+ Do you understand ? \\*
+ \smallskip
+ \verb@Do you understand?@ \\*
+ Do you understand? \\*
+ \end{errexam}
+\end{errdesc}
+
+\begin{errdesc}{Could not execute LaTeX command.}
+
+ Some \LaTeX\ commands will be interpreted by \chktex; however, some
+ of them are sensible to errors in the \LaTeX\ source. Most notably,
+ the \verb@\@\verb@input@ command relies on that the input file exists\dots
+
+\end{errdesc}
+
+\Keyword{Italic\\ItalCmd\\NonItalic}
+\begin{errdesc}{Don't use \BS/ in front of small punctuation.}
+ Italic correction should generally {\em not\/} be used in front of
+ small punctuation characters like `.' and `,'; as it looks better
+ when the preceding italic character leans ``over'' the punctum or
+ comma.
+
+ \begin{errexam}
+ \verb@It is just a {\it test@\underline{\tt\BS/}\verb@}, don't think anything else.@ \\*
+ It is just a {\it test\/}, don't think anything else. \\*
+ \smallskip
+ \verb@It is just a {\it test}, don't think anything else.@ \\*
+ It is just a {\it test}, don't think anything else.
+ \end{errexam}
+\end{errdesc}
+
+\begin{errdesc}{\$\BS{}times\$ may look prettier here.}
+ In ASCII environments, it is usual to use the `x' character as an
+ infix operator to denote a dimension. The mathemathical symbol
+ $\times$ provided by the \verb@$\times$@ command is better suited for
+ this.
+
+ \begin{errexam}
+ \verb@The program opens a screen sized 640@\underline{\tt x}\verb@200 pixels.@ \\*
+ The program opens a screen sized 640x200 pixels. \\*
+ \smallskip
+ \verb@The program opens a screen sized $640\times200$ pixels.@ \\*
+ The program opens a screen sized $640\times200$ pixels.
+ \end{errexam}
+\end{errdesc}
+
+\begin{errdesc*}{Multiple spaces detected in output.}
+
+ This warning, intended for the novice, will remind you that even if
+ you {\em type\/} multiple spaces in your input, only a single space
+ will come out. Some ways to come around this is listed below.
+
+ \begin{errexam}
+ \verb@White is a beautiful colour.@ \\*
+ White is a beautiful colour. \\*
+ \smallskip
+ \verb@White~~~~~{ }{ }{ }\ \ \ is a beautiful colour.@ \\*
+ White~~~~~{ }{ }{ }\ \ \ is a beautiful colour. \\
+ \end{errexam}
+\end{errdesc*}
+
+\Keyword{VerbEnvir}
+\begin{errdesc}{This text may be ignored.}
+ Certain implementations of the \verb@verbatim@ environment and
+ derivations of that, ignore all text on the same line as
+ \verb@\end{verbatim}@. This will warn you about this.
+
+
+\end{errdesc}
+
+\fmted{Use ` to begin quotation, not '.}\hfill\\
+\fmted{Use ' to end quotation, not `.}\hfill\\
+\begin{errdesc}{Don't mix quotes.}
+
+ Proper quotations should start with a \verb@`@ and end with a
+ \verb@'@; anything else isn't very pretty. Both these warnings are
+ relative to this; look in the example below.
+
+ \begin{errexam}
+ \verb@There are @\underline{\tt`'}%
+ \verb@examples'' and there are ``examples@\underline{\tt``}\verb@.@ \\*
+ There are `'examples'' and there are ``examples``. \\*
+ \smallskip
+ \verb@There are ``examples'' and there are ``examples''.@ \\*
+ There are ``examples'' and there are ``examples''.
+ \end{errexam}
+\end{errdesc}
+
+\Keyword{MathRoman}
+\begin{errdesc}{You should perhaps use `cmd' instead.}
+ Most mathematical operators should be set as standard roman font,
+ instead of the math italic \LaTeX\ uses for variables. For many
+ operators, \LaTeX\ provides a pre-defined command which will typeset
+ the operator correctly. Look below for an illustration of the point.
+
+ \begin{errexam}
+ \verb@$@\underline{\tt sin}\verb@^2 x + @\underline{\tt cos}\verb@^2 x = 1$@ \\*
+ $sin^2 x + cos^2 x= 1$ \\*
+ \smallskip
+ \verb@$\sin^2 x + \cos^2 x = 1$@ \\*
+ $\sin^2 x + \cos^2 x = 1$
+ \end{errexam}
+\end{errdesc}
+
+\fmted{You should put a space in front of/after parenthesis.}\hfill\\
+\begin{errdesc}{You should avoid spaces in front of/after parenthesis.}
+ Outside math mode, you should put a space in front of any group of
+ opening parenthesis, and no spaces after. If you have several after
+ each other, you should of course not put a space in between each;
+ look in the example below. Likewise, there should not be spaces in
+ front of closing parenthesis, but there should be at least one
+ after.
+
+
+
+ \begin{errexam}
+ \verb@This@\underline{\tt( }\verb@an example@\underline{\tt( }%
+ \verb@Nuff said@\underline{\tt\ }\verb@)), illustrates@\underline{\tt( }%
+ \verb@``my''@\underline{\tt\ )}\verb@point.@\\
+ This( an example( Nuff said )), illustrates( ``my'' )point. \\
+ \smallskip
+ \verb@This (an example (Nuff said)), illustrates (``my'') point.@\\
+ This (an example (Nuff said)), illustrates (``my'') point.\\
+ \end{errexam}
+\end{errdesc}
+
+\Keyword{QuoteStyle}
+\begin{errdesc}{You should not use punctuation in front of/after
+ quotes.}
+ %
+ For best looking documents, you should decide on how you
+ wish to put quotes relative to punctuation. \chktex\ recognizes two
+ styles; you may specify which you use in the \rsrc\ file. A
+ description on each style follows:
+ \begin{description}
+ \item[Traditional:] This style is the most visually pleasing. It
+ always puts the punctuation {\em in front of\/} the quotes, which
+ gives a continuous bottom line.
+
+ However, it may in certain cases be ambigious. Consider the
+ following example from a fictious \Cmd{vi(1)}
+ tutorial (quote taken from the Jargon file):
+ \begin{center}
+ \verb@Then delete a line from the file by typing ``dd.''@ \\*
+ Then delete a line from the file by typing ``dd.''
+ \end{center}
+ That would be very bad --- because the reader would be prone to
+ type the string d-d-dot, and it happens that in \Cmd{vi(1)} dot
+ repeats the last command accepted. The net result would be to
+ delete {\em two\/} lines! This problem is avoided using logical
+ style, described below.
+ \pagebreak[3]
+ \item[Logical:] This style uses quotes as balanced delimiters like
+ parentheses. While this is not the most visual pleasing, it is
+ can't be misunderstood. The above sentence would then become:
+ \nopagebreak
+ \begin{center}
+ \verb@Then delete a line from the file by typing ``dd''.@ \\*
+ Then delete a line from the file by typing ``dd''.
+ \end{center}
+ \nopagebreak
+ \end{description}
+
+\end{errdesc}
+
+\begin{errdesc}{Double space found.}
+ This warning is triggered whenever \chktex\ finds a space in front
+ of a hard space, or vice versa. This will be rendered as two spaces
+ (which you usually don't wish).
+
+ \begin{errexam}
+ \verb@For output codes, see table@\underline{\tt\ }%
+ \verb@~@\underline{\tt\ }\verb@\ref{foo}.@ \\*
+ For output codes, see table ~ 1.1.\\*
+ \smallskip
+ \verb@For output codes, see table~\ref{foo}.@ \\*
+ For output codes, see table~1.1.
+ \end{errexam}
+\end{errdesc}
+
+\Keyword{MathEnvir}
+\begin{errdesc}{You should put punctuation outside inner/inside
+ display math mode.}
+ As recommended in the \TeX{}book, you should try to put punctuation
+ outside inner math mode, as this is gets formatted better.
+
+ Similarily, you should let any final punctuation in display math
+ mode end up within it. Look at the following example, which was
+ taken from the \TeX{}book:
+ \begin{errexam}
+ \verb@for $x = a@\underline{\tt,}\verb@b$, or $c$.@\\*
+ for $x = a,b$, or $c$. \\*
+ \smallskip
+ \verb@for $x = a$, $b$, or $c$.@\\*
+ for $x = a$, $b$, or $c$.\\*
+ \end{errexam}
+
+\end{errdesc}
+
+\Keyword{Primitives}
+\begin{errdesc*}{You ought to not use primitive TeX in LaTeX code.}
+ This warning is triggered whenever you use a raw \TeX\ command
+ which has been replaced by a \LaTeX\ equivalent. If you consider
+ yourself a purist (or want to be sure your code works under \LaTeX3),
+ you should use the \LaTeX\ equivalent.
+\end{errdesc*}
+
+\Keyword{NotPreSpaced}
+\begin{errdesc}{You should remove spaces in front of `\%s'}
+
+ Some commands should not be prepended by a space character, for cosmetical
+ reasons. This notes you of this whenever this has happened.
+
+ \begin{errexam}
+ \verb@This is a footnote@\underline{\tt\ }\verb@\footnotemark[1] mark.@\\*
+ This is a footnote ${}^1$ mark. \\*
+ \smallskip
+ \verb@This is a footnote\footnotemark[1] mark.@\\*
+ This is a footnote${}^1$ mark. \\*
+ \end{errexam}
+\end{errdesc}
+
+\Keyword{NoCharNext}
+\begin{errdesc}{`\%s' is normally not followed by `\%c'.}
+ \LaTeX' error message when calling \verb@\left \{@ instead of
+ \verb@left \{@ is unfortunately rather poor. This warning detects
+ this and similar errors.
+\end{errdesc}
+
+\section{Future plans}
+
+In a somewhat prioritized sequence, this is what I'd like to put into the
+program --- if I have the time.
+
+\begin{itemize}
+\item Do a final fix for maths mode. Currently, \chktex\ doesn't
+ recognize embedded math mode (i.e.\ constructions like
+ \verb@$$a+b\text{for $a \leq 0$}$$@).
+
+\item Support for regular expressions as user patterns. I'll do it at
+ once I get the GNU \Cmd{rx} package up and running (it doesn't
+ produce correct include files).
+
+\item De-linearize the checker. Currently, it works on a line-by-line
+ basis, in most respects, at least. I hope to be able to remove this
+ barrier; as this will reduce the amount of false warnings
+ somewhat.
+
+\item Probably some more warnings/errors; just have to think them out
+ first. Suggestions are appreciated --- I've ``stolen'' most that
+ similar programs provides, and am running out of ideas, really.
+
+ It would also be nice to investigate the field of ``globally''
+ oriented warnings; i.e.\ warnings regarding the document as a
+ whole. Currently, \chktex\ operates mainly on a local/``greedy''
+ basis.
+
+ If you have suggestions/ideas on this topic, they're certainly
+ welcome, including references to literature.
+
+\item Fix a few more bugs. \smiley
+\end{itemize}
+
+\section{Notes}
+
+\subsection{Wish to help?}
+
+As most other living creatures, I have only a limited amount of time. If
+you like \chktex\ and would like to help improving it, here's a few things
+I would like to receive. The following ideas are given:
+
+\begin{itemize}
+\item Does anyone have a $\mbox{\LaTeX}\rightarrow \mbox{{\tt troff}}$
+ conversion program? It would be really nice if I could extract the
+ relevant sections from this manual, and present them as a man page.
+ I will not, however, convert this manual to \TeX{}info in order to
+ be able to do this; IMHO \TeX{}info documents have far too limited
+ typographic possibilities.
+
+ This doesn't mean that I'm not willing to restructure the document
+ at all. This manual already uses some kind of preprocessing in order
+ to achieve HTML output via \LaTeX2{\tt html}, I'm willing to do the
+ same in order to produce {\tt troff} output.
+
+\item Help me port the program! This is a prioritized one. It's no fun
+ writing ANSI C when people haven't got a C compiler.
+
+ Of course, I'll provide whatever help necessary to modify the sources
+ to fit to the new platform. Take contact if you're interested. I will
+ include your compiled binary in the distribution, and give you
+ credit where appropiate.
+
+ Just one request: If you have to modify the sources in order to make
+ \chktex\ compile \& work on the new platform, {\em please\/} enclose your
+ changes in something like \Cmd{\#ifdef \_\_PLATFORM\_\_\dots code\dots\#endif}!
+ It makes life so much easier later, when we try to merge the two
+ source trees.
+
+\item Reports on problems configuring and compiling \chktex\ on supported
+ (and unsupported) systems are welcomed.
+
+\item Filters for other file formats. I do believe that there are
+ several formats using \LaTeX\ for its formatting purposes, combining
+ that with something else. If you can write a program or script which
+ filters everything away but the \LaTeX\ code, it will surely be
+ appreciated (and included). Look at the \verb@deweb@ script to see
+ what I mean.
+
+\item Arexx interfaces for other editors are also welcomed; these
+ should be rather fast to write. They should to the following:
+ \begin{enumerate}
+ \item Get the filename of the active file.
+ \item If possible, save the file to disk if there has been any
+ changes.
+ \item Call the program \Cmd{ChkTeX.rexx} with the filename as the
+ only parameter.
+ \end{enumerate}
+
+\item If somebody out there actually possesses (and uses) GoldED, it
+ would be nice if they checked whether the ARexx script included
+ actually work. If not, please send me a fixed copy; perhaps also
+ one which supports point 2 above, too. If it does work, then please
+ tell me so, so I can remove this item.
+
+ I don't have GoldEd in my possession; the script was just modelled
+ after Juergen Zeschky's, ({\tt <juergen@sokrates.nbg.de>})
+ $\mbox{PGP}\leftrightarrow\mbox{GoldED}$ interface.
+
+\item If you update the \rsrc\ file in anyway that is not strictly
+ local, I would appreciate to receive your updated version.
+
+\item Suggestions for new warnings are always welcomed. Both formal
+ (i.e.\ regexps or similar) and non-formal (plain English) descriptions
+ are welcomed.
+\end{itemize}
+
+Of course, people doing any of this will be mentioned in this document, and
+thus receive eternal glory and appreciation.
+
+\subsection{Caps and stuff}
+
+This program uses the \Cmd{getopt()} routine, as supplied from GNU\@.
+The source included in this distribution has been modified slightly.
+To make the use of C2LOCAL easier, portions which were
+\verb@#ifdef@'ed out, have now been commented out.
+
+Where trademarks have been used, the author is aware of that they
+belong to someone, and has tried to stick to the original caps.
+
+\section{About the author}
+
+A quick summary of who I am and what I do:
+
+I'm 21 years old, and live in Oslo, the capital of Norway. I'm
+currently studying maths and computer science at the
+University~of~Oslo; planning to get a degree within mathematical
+modeling, with a dash of physics and emphazing the computer part of
+the study. More precisely, in autumn'96 my studies consist of
+mathematical analysis, statistics \& probability calculations plus
+studying the relationship between society and computers.
+
+At home I now possess 4 computers, of which 1 is regular use: A
+vanilla Amiga 1200, expanded only by a HD\@. The others are a {\tt
+ 80286} PC and an Amiga 500, both semi-out-of-order. The last one is
+a Commodore VIC-20, which for some peculiar reason never seems to be
+used. Plans are to get a Linux-capable PC, though.
+
+Most of the time in front of these computers (including SGI Indy's and
+SPARC stations at our university) is spent on C and shell programming,
+plus some text-processing.
+
+ % I am also involved in writing the document
+ % for {\sc Isaac} --- Interactive Simulation as an Alternative to
+ % Advanced Calculations. This is planned to help newcomers to physics,
+ % by providing a computer program which enables one to simulate most
+ % experiments relating to classical mechanics.
+ %
+
+C and shell programming are not my only knowledge areas regarding
+computers, however. I write the following languages more or less:
+Perl, Motorola {\tt 68000} assembly code, ARexx, Simula, C++, \LaTeX,
+HTML, AmigaGuide, Amos Basic and Installer LISP\@. Once I also
+mastered Commodore Basic V2, the ``language'' included with my VIC-20.
+
+However, I also try to not to end up as a computer nerd. Thus, in
+addition to the compulsory (?) interest for computers, I am a scout.
+Still running into the woods, climbing the trees, falling down and
+climbing up once more, in other words. To be more specific, I am a
+now a troop leader for `Ulven' scout-group; Norwegian Scouts
+Association. I am also a active rover in `V{\aa}lerenga' scout-group.
+
+Certainly a lot more to tell (I play the piano and like cross-country
+skiing, for instance); but I'll stop here before you fall
+asleep\dots\smiley
+
+
+\section{Thanks}
+
+The author wishes to thank the following people (in alphabetical order):
+
+\def\Name#1#2{%
+\item[]
+ \setbox0=\hbox{
+ \begin{tabular}{l}
+ \bf #1 \\
+ \tt #2 \\
+ \end{tabular}
+ } \usebox0\\ }
+
+\begin{description}
+
+ \Name{Russ Bubley}{russ@scs.leeds.ac.uk}
+ He has been the main external beta-tester for this program, sending
+ me loads and loads of understandable and reproducible bug reports.
+ If you somehow think that \chktex\ is well-behaved and free from
+ bugs, send warm thoughts to Russ. He has also provided ideas for
+ enhanced checks and so forth.
+
+ In addition, he sent me a huge list of 238 common English
+ abbreviations, for inclusion in the \rsrc\ file! Together with the
+ enhanced abbreviation recognizer, I do now believe most
+ abbreviations should be catched\dots\smiley
+
+ Finally, he has also given me valuable hints for improving the
+ program's outputting routine, and given me lots of suggestions for
+ filtering unnecessary/false warnings away.
+
+ \Name{Gerd B\"ohm}{Gerd.Boehm@physik.uni-regensburg.de}
+ Improved and bug-fixed the MS-DOS port of \chktex\ v1.4, sending me
+ ready-to-yank code patches. The original port didn't respect all
+ the peculiarities of the MS-DOS file-system, unfortunately.
+
+ \Name{Lars Frellesen}{frelle@math-tech.dk} Sent a few bug reports
+ regarding the filtering of messages. He has also helped me to
+ expand the \Cmd{SILENT} keyword in the \rsrc\ file.
+
+ \Name{Wolfgang Fritsch}{fritsch@hmi.de}
+ Author of the OS/2 port, which he did using the emx compiler.
+ Please direct questions regarding strictly to that port to him (I
+ would like to receive a carbon copy, though).
+
+ \Name{Stefan Gerberding}{stefan@inferenzsysteme.informatik.th-darmstadt.de}
+ First one to report the Enforcer hit in v1.2 when using \chktex\ as
+ a pipe. Also came with suggestions to make \chktex\ more easily
+ compile on early gcc compilers.
+
+ He has also kept on beta-testing later versions of \chktex, giving
+ me bug-reports and enhancements requests.
+
+ \Name{Kasper B. Graversen}{kbg2001@internet.dk} Lots of creative
+ suggestions and improvements. Several of the warnings implemented
+ were based on his ideas. In addition, he has given advice for
+ improving the existing warnings.
+
+ Has also provided some OS-oriented code.
+
+ \Name{Frank Luithle}{f\_luithle@outside.sb.sub.de}
+ Wrote a translation for v1.0. Unfortunately, he remained unreachable
+ after that\dots:-/
+
+ \Name{Nat}{nat@nataa.frmug.fr.net}
+ Reported the same bug as Gerberding. In addition, he taught me a
+ few tricks regarding the use of gcc + made me understand that the
+ ANSI standard isn't unambigious; at least the \verb@getenv()@ call
+ seem to be open for interpretations. Many possible
+ incompatibilities have been removed due to these lessons.
+
+ \Name{Michael Sanders}{sanders@umich.edu}
+ Has found some of the bugs in this beast; both obscure and
+ long-lived. Has also provided motivation to clarify this document.
+
+ \Name{Bj\o rn Ove Thue}{bjort@ifi.uio.no}
+ Author of the MSDOS port; please direct questions regarding
+ strictly to that port to him (I would like to receive a carbon
+ copy, though).
+
+ \Name{Martin Ward}{Martin.Ward@durham.ac.uk}
+ Sent a few bug-reports; also gave me information upon where to find
+ regexp code. He also provided a Perl script for checking ordinary
+ text, which ideas I was able to implement in \chktex. In addition,
+ he sent me the source code for \verb@lacheck@; which also inspired some
+ of the warnings.
+\end{description}
+
+%endlatex
+\section{Contacting the author}
+
+If you wish to contact me for any reason or would like to participate in
+the development of \chktex, please write to:
+%latex
+\begin{samepage}
+%endlatex
+ \begin{quote}
+ Jens Berger \\
+ Spektrumvn. 4 \\
+ N-0666 Oslo \\
+ Norway \\
+ E-mail: {\tt <jensthi@ifi.uio.no>}
+ \end{quote}
+%latex
+\end{samepage}
+%endlatex
+Any signs of intelligent life are welcomed; that should exclude piracy.
+
+\medskip\noindent
+Have fun.
+
+\end{document}
+
+
+
diff --git a/Build/source/texk/chktex/FindErrs.c b/Build/source/texk/chktex/FindErrs.c
new file mode 100644
index 00000000000..2014e3923cc
--- /dev/null
+++ b/Build/source/texk/chktex/FindErrs.c
@@ -0,0 +1,1485 @@
+/*
+ * ChkTeX v1.5, error searching & report routines.
+ * Copyright (C) 1995-96 Jens T. Berger Thielemann
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Contact the author at:
+ * Jens Berger
+ * Spektrumvn. 4
+ * N-0666 Oslo
+ * Norway
+ * E-mail: <jensthi@ifi.uio.no>
+ *
+ *
+ */
+
+
+#include "ChkTeX.h"
+#include "FindErrs.h"
+#include "OpSys.h"
+#include "Utility.h"
+#include "Resource.h"
+
+/***************************** ERROR MESSAGES ***************************/
+
+#undef MSG
+#define MSG(num, type, inuse, ctxt, text) {num, type, inuse, ctxt, text},
+
+struct ErrMsg LaTeXMsgs [emMaxFault + 1] =
+{
+ ERRMSGS
+ {emMaxFault, etErr, iuOK, 0, INTERNFAULT}
+};
+
+#define istex(c) (isalpha(c) || (AtLetter && (c == '@')))
+#define CTYPE(func) \
+static int my_##func(int c) \
+{ \
+ return(func(c)); \
+}
+
+#define INUSE(c) (LaTeXMsgs[(enum ErrNum) c].InUse == iuOK)
+
+#define PSERR2(pos,len,err,a,b) \
+ PrintError(CurStkName(&InputStack), RealBuf, pos, len, Line, err, a, b)
+
+#define PSERRA(pos,len,err,a) \
+ PrintError(CurStkName(&InputStack), RealBuf, pos, len, Line, err, a)
+
+#define HEREA(len, err, a) PSERRA(BufPtr - Buf - 1, len, err, a)
+#define PSERR(pos,len,err) PSERRA(pos,len,err,"")
+
+#define HERE(len, err) HEREA(len, err, "")
+
+#define SKIP_BACK(ptr, c, check) \
+ while((c = *ptr--)) \
+ { \
+ ifn(check) break; \
+ } \
+ ptr++;
+
+#define SKIP_AHEAD(ptr, c, check) \
+ while((c = *ptr++)) \
+ { \
+ ifn(check) \
+ break; \
+ } \
+ ptr--;
+
+
+/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */
+
+static ULONG Line;
+
+static STRPTR RealBuf, LineCpy, BufPtr;
+
+static int ItFlag = efNone;
+
+NEWBUF(Buf, BUFSIZ);
+NEWBUF(CmdBuffer, BUFSIZ);
+NEWBUF(ArgBuffer, BUFSIZ);
+
+static enum ErrNum PerformCommand(const STRPTR Cmd, STRPTR Arg);
+
+#ifdef isdigit
+CTYPE(isdigit)
+#else
+# define my_isdigit isdigit
+#endif
+
+#ifdef isalpha
+CTYPE(isalpha)
+#else
+# define my_isalpha isalpha
+#endif
+
+/*
+ * Reads in a TeX token from Src and puts it in Dest.
+ *
+ */
+
+
+static STRPTR GetLTXToken(STRPTR Src, STRPTR Dest)
+{
+ int Char;
+
+ if(Src && *Src)
+ {
+ if(*Src == '\\')
+ {
+ *Dest++ = *Src++;
+ Char = *Dest++ = *Src++;
+
+ if(istex(Char))
+ {
+ while(istex(Char))
+ Char = *Dest++ = *Src++;
+
+ Src--;
+ Dest--;
+ }
+
+ }
+ else
+ *Dest++ = *Src++;
+ *Dest = 0;
+ }
+ else
+ Src = NULL;
+
+ return(Src);
+}
+
+
+/*
+ * Scans the `SrcBuf' for a LaTeX arg, and puts that arg into `Dest'.
+ * `Until' specifies what we'll copy. Assume the text is
+ * "{foo}bar! qux} baz".
+ * GET_TOKEN => "{foo}"
+ * GET_STRIP_TOKEN => "foo"
+ * '!' => "{foo}bar!" (i.e. till the first "!")
+ * Returns NULL if we can't find the argument, ptr to the first character
+ * after the argument in other cases.
+ *
+ * If one of the tokens found is in the wl wordlist, and we're in the
+ * outer most paren, and Until isn't a single character, we'll stop.
+ * You may pass NULL as wl.
+ *
+ * We assume that you've previously skipped over leading spaces.
+ *
+ */
+
+#define GET_TOKEN 256
+#define GET_STRIP_TOKEN 257
+
+static STRPTR GetLTXArg(STRPTR SrcBuf,
+ const STRPTR OrigDest,
+ const int Until,
+ struct WordList *wl)
+
+{
+ STRPTR Retval, TmpPtr, Dest = OrigDest;
+ ULONG DeliCnt = 0;
+
+ *Dest = 0;
+ TmpPtr = SrcBuf;
+
+ switch(Until)
+ {
+ case GET_STRIP_TOKEN:
+ case GET_TOKEN:
+ while((Retval = GetLTXToken(TmpPtr, Dest)))
+ {
+ switch(*Dest)
+ {
+ case '{':
+ DeliCnt++;
+ break;
+ case '}':
+ DeliCnt--;
+ }
+ Dest += Retval - TmpPtr;
+ TmpPtr = Retval;
+
+ if(!DeliCnt || ((DeliCnt == 1) && wl && HasWord(Dest, wl)))
+ break;
+ }
+
+ if(Retval && (*OrigDest == '{') && (Until == GET_STRIP_TOKEN))
+ {
+ strcpy(OrigDest, OrigDest + 1);
+ OrigDest[strlen(OrigDest) - 1] = 0;
+ }
+ break;
+ default:
+ DeliCnt = TRUE;
+ while((Retval = GetLTXArg(TmpPtr, Dest, GET_TOKEN, NULL)))
+ {
+ if(*Dest == Until)
+ DeliCnt = FALSE;
+
+ Dest += Retval - TmpPtr;
+ TmpPtr = Retval;
+
+ if(!DeliCnt)
+ break;
+ }
+ break;
+ }
+ *Dest = 0;
+
+ return(Retval);
+}
+
+
+static STRPTR MakeCpy(void)
+{
+ if(!LineCpy)
+ LineCpy = strdup(RealBuf);
+
+ if(!LineCpy)
+ PrintPrgErr(pmStrDupErr);
+
+ return(LineCpy);
+}
+
+static STRPTR PreProcess(void)
+{
+ /* First, kill comments. */
+
+ STRPTR TmpPtr;
+
+ strcpy(Buf, RealBuf);
+
+ TmpPtr = Buf;
+
+ while((TmpPtr = strchr(TmpPtr, '%')))
+ {
+ if(TmpPtr[-1] != '\\')
+ {
+ PSERR(TmpPtr - Buf, 1, emComment);
+ *TmpPtr = 0;
+ break;
+ }
+ TmpPtr++;
+ }
+ return(Buf);
+}
+
+/*
+ * Interpret environments
+ */
+
+static void PerformEnv(STRPTR Env, BOOL Begin)
+{
+static
+ TEXT VBStr [BUFSIZ] = "";
+
+ if(HasWord(Env, &MathEnvir))
+ {
+ MathMode += Begin ? 1 : -1;
+ MathMode = max(MathMode, 0);
+ }
+
+ if(Begin && HasWord(Env, &VerbEnvir))
+ {
+ VerbMode = TRUE;
+ strcpy(VBStr, "\\end{");
+ strcat(VBStr, Env);
+ strcat(VBStr, "}");
+ VerbStr = VBStr;
+ }
+}
+
+static STRPTR SkipVerb(void)
+{
+ STRPTR TmpPtr = BufPtr;
+ int TmpC;
+
+ if(VerbMode && BufPtr)
+ {
+ ifn(TmpPtr = strstr(BufPtr, VerbStr))
+ BufPtr = &BufPtr[strlen(BufPtr)];
+ else
+ {
+ VerbMode = FALSE;
+ BufPtr = &TmpPtr[strlen(VerbStr)];
+ SKIP_AHEAD(BufPtr, TmpC, LATEX_SPACE(TmpC));
+ if(*BufPtr)
+ PSERR(BufPtr - Buf, strlen(BufPtr) - 2, emIgnoreText);
+ }
+ }
+ return(TmpPtr);
+}
+
+#define CHECKDOTS(wordlist, dtval) \
+for(i = 0; (i < wordlist.Stack.Used) && !(Back && Front); i++) \
+ { if(!strafter(PstPtr, wordlist.Stack.Data[i])) \
+ Back = dtval; \
+ if(!strinfront(PrePtr, wordlist.Stack.Data[i])) \
+ Front = dtval; }
+
+
+
+/*
+ * Checks that the dots are correct
+ */
+
+static enum DotLevel CheckDots(STRPTR PrePtr, STRPTR PstPtr)
+{
+ ULONG i;
+ int TmpC;
+ enum DotLevel Front = dtUnknown, Back = dtUnknown;
+
+ if(MathMode)
+ {
+ PrePtr--;
+#define SKIP_EMPTIES(macro, ptr) macro(ptr, TmpC, \
+(LATEX_SPACE(TmpC) || (TmpC == '{') || (TmpC == '}')))
+
+ SKIP_EMPTIES(SKIP_BACK, PrePtr);
+ SKIP_EMPTIES(SKIP_AHEAD, PstPtr);
+
+ CHECKDOTS(CenterDots, dtCDots);
+
+ ifn(Front && Back)
+ {
+ CHECKDOTS(LowDots, dtLDots);
+ }
+ return(Front & Back);
+ }
+ else
+ return(dtLDots);
+
+}
+
+static STRPTR Dot2Str(enum DotLevel dl)
+{
+ STRPTR Retval = INTERNFAULT;
+ switch(dl)
+ {
+ case dtUnknown:
+ Retval = "\\cdots or \\ldots";
+ break;
+ case dtDots:
+ Retval = "\\dots";
+ break;
+ case dtCDots:
+ Retval = "\\cdots";
+ break;
+ case dtLDots:
+ Retval = "\\ldots";
+ break;
+ }
+ return Retval;
+}
+
+/*
+ * Wipes a command, according to the definition in WIPEARG
+ */
+
+static void WipeArgument(STRPTR Cmd, STRPTR CmdPtr)
+{
+ ULONG CmdLen = strlen(Cmd);
+ STRPTR Format, TmpPtr;
+ int c, TmpC;
+
+ if(Cmd && *Cmd)
+ {
+ TmpPtr = &CmdPtr[CmdLen];
+ Format = &Cmd[CmdLen + 1];
+
+ while(TmpPtr && *TmpPtr && *Format)
+ {
+ switch(c = *Format++)
+ {
+ case '*':
+ SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC));
+ if(*TmpPtr == '*')
+ TmpPtr++;
+ break;
+ case '[':
+ SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC));
+ if(*TmpPtr == '[')
+ TmpPtr = GetLTXArg(TmpPtr, ArgBuffer, ']', NULL);
+ break;
+ case '{':
+ SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC));
+ TmpPtr = GetLTXArg(TmpPtr, ArgBuffer, GET_TOKEN, NULL);
+ case '}':
+ case ']':
+ break;
+ default:
+ PrintPrgErr(pmWrongWipeTemp, &Cmd[strlen(Cmd) + 1]);
+ break;
+ }
+ }
+
+ if(TmpPtr)
+ strwrite(CmdPtr, VerbClear, TmpPtr - CmdPtr);
+ else
+ strxrep(CmdPtr, "()[]{}", *VerbClear);
+ }
+}
+
+/*
+ * Checks italic.
+ *
+ */
+
+static void CheckItal(const STRPTR Cmd)
+{
+ int TmpC;
+ STRPTR TmpPtr;
+ if(HasWord(Cmd, &NonItalic))
+ ItState = itOff;
+ elif(HasWord(Cmd, &Italic))
+ ItState = itOn;
+ elif(HasWord(Cmd, &ItalCmd))
+ {
+ TmpPtr = BufPtr;
+ SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC));
+ if(*TmpPtr == '{')
+ {
+ ItFlag = ItState? efItal : efNoItal;
+ ItState = itOn;
+ }
+ }
+}
+
+/*
+ * Interpret isolated commands.
+ *
+ */
+
+static void PerformBigCmd(STRPTR CmdPtr)
+{
+ STRPTR TmpPtr,
+ ArgEndPtr;
+ ULONG CmdLen = strlen(CmdBuffer);
+ int TmpC;
+ enum ErrNum
+ ErrNum;
+ struct ErrInfo *ei;
+
+ enum DotLevel dotlev, realdl = dtUnknown;
+
+ TmpPtr = BufPtr;
+ SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC));
+
+ ArgEndPtr = GetLTXArg(TmpPtr, ArgBuffer, GET_STRIP_TOKEN, NULL);
+
+ /* Kill `\verb' commands */
+
+ if(WipeVerb)
+ {
+ if(!strcmp(CmdBuffer, "\\verb"))
+ {
+ if(*BufPtr)
+ {
+ if((TmpPtr = strchr(&BufPtr[1], *BufPtr)))
+ strwrite(CmdPtr, VerbClear, (TmpPtr - CmdPtr) + 1);
+ else
+ PSERR(CmdPtr - Buf, 5, emNoArgFound);
+ }
+ }
+ }
+
+ if(HasWord(CmdBuffer, &IJAccent))
+ {
+ if(ArgEndPtr)
+ {
+ TmpPtr = ArgBuffer;
+ SKIP_AHEAD(TmpPtr, TmpC, TmpC == '{'); /* } */
+
+ if((*TmpPtr == 'i') || (*TmpPtr == 'j'))
+ PrintError(CurStkName(&InputStack), RealBuf,
+ CmdPtr - Buf,
+ (LONG) strlen(CmdBuffer), Line,
+ emAccent, CmdBuffer,
+ *TmpPtr, MathMode? "math" : "");
+ }
+ else
+ PSERR(CmdPtr - Buf, CmdLen, emNoArgFound);
+ }
+
+ if(HasWord(CmdBuffer, &NotPreSpaced) &&
+ isspace(CmdPtr[-1]))
+ PSERRA(CmdPtr - Buf - 1, 1, emRemPSSpace, CmdBuffer);
+
+ if((TmpPtr = HasWord(CmdBuffer, &NoCharNext)))
+ {
+ STRPTR BPtr = BufPtr;
+
+ TmpPtr += strlen(TmpPtr) + 1;
+ SKIP_AHEAD(BPtr, TmpC, LATEX_SPACE(TmpC));
+
+ if(strchr(TmpPtr, *BPtr))
+ {
+ PSERR2(CmdPtr - Buf, CmdLen, emNoCharMean,
+ CmdBuffer, *BPtr);
+ }
+ }
+
+ if(!strcmp(CmdBuffer, "\\begin") ||
+ !strcmp(CmdBuffer, "\\end"))
+ {
+ if(ArgEndPtr)
+ {
+ if(!strcmp(ArgBuffer, "document"))
+ InHeader = FALSE;
+
+ if(CmdBuffer[1] == 'b')
+ {
+ ifn(PushErr(ArgBuffer, Line, CmdPtr - Buf,
+ CmdLen, MakeCpy(),
+ &EnvStack))
+ PrintPrgErr(pmNoStackMem);
+ }
+ else
+ {
+ if((ei = PopErr(&EnvStack)))
+ {
+ if(strcmp(ei->Data, ArgBuffer))
+ PrintError(CurStkName(&InputStack), RealBuf,
+ CmdPtr - Buf,
+ (LONG) strlen(CmdBuffer),
+ Line, emExpectC, ei->Data, ArgBuffer);
+
+ FreeErrInfo(ei);
+ }
+ else
+ PrintError(CurStkName(&InputStack), RealBuf,
+ CmdPtr - Buf,
+ (LONG) strlen(CmdBuffer),
+ Line, emSoloC, ArgBuffer);
+ }
+
+ PerformEnv(ArgBuffer, (BOOL) CmdBuffer[1] == 'b');
+ } else
+ PSERR(CmdPtr - Buf, CmdLen, emNoArgFound);
+ }
+
+ CheckItal(CmdBuffer);
+
+ if((ErrNum = PerformCommand(CmdBuffer, BufPtr)))
+ PSERR(CmdPtr - Buf, CmdLen, ErrNum);
+
+ if(!strcmp(CmdBuffer, "\\cdots"))
+ realdl = dtCDots;
+
+ if(!strcmp(CmdBuffer, "\\ldots"))
+ realdl = dtLDots;
+
+ if(!strcmp(CmdBuffer, "\\dots"))
+ realdl = dtLDots;
+
+ if(realdl != dtUnknown)
+ {
+ dotlev = CheckDots(CmdPtr, BufPtr);
+ if(dotlev && (dotlev != realdl))
+ {
+ TmpPtr = Dot2Str(dotlev);
+ PSERRA(CmdPtr - Buf, CmdLen, emEllipsis, TmpPtr);
+ }
+ }
+
+ if((TmpPtr = HasWord(CmdBuffer, &WipeArg)))
+ WipeArgument(TmpPtr, CmdPtr);
+}
+
+/*
+ * Check user abbreviations. Pass a pointer to the `.';
+ * also ensure that it's followed by spaces, etc.
+ *
+ * Note: We assume that all abbrevs have been transferred from
+ * AbbrevCase into Abbrev.
+ */
+
+static void CheckAbbrevs(const STRPTR Buffer)
+{
+ LONG i;
+ STRPTR TmpPtr, AbbPtr;
+
+ if(INUSE(emInterWord))
+ {
+ TmpPtr = TmpBuffer + Abbrev.MaxLen + 2;
+ *TmpPtr = 0;
+ AbbPtr = Buffer;
+
+ for(i = Abbrev.MaxLen;
+ i >= 0;
+ i--)
+ {
+ *--TmpPtr = *AbbPtr--;
+ if(!isalpha(*AbbPtr) && HasWord(TmpPtr, &Abbrev))
+ PSERR(Buffer - Buf + 1, 1, emInterWord);
+ if(!*AbbPtr)
+ break;
+ }
+ }
+}
+
+
+/*
+ * Check misc. things which can't be included in the main loop.
+ *
+ */
+
+static void CheckRest(void)
+{
+ ULONG Count;
+ LONG CmdLen;
+ STRPTR UsrPtr;
+
+ /* Search for user-specified warnings */
+
+ if(INUSE(emUserWarn))
+ {
+ strcpy(TmpBuffer, Buf);
+ FORWL(Count, UserWarn)
+ {
+ for(UsrPtr = TmpBuffer;
+ (UsrPtr = strstr(UsrPtr, UserWarn.Stack.Data[Count]));
+ UsrPtr++)
+ {
+ CmdLen = strlen(UserWarn.Stack.Data[Count]);
+ PSERR(UsrPtr - TmpBuffer, CmdLen, emUserWarn);
+ }
+ }
+
+
+ strlwr(TmpBuffer);
+
+ FORWL(Count, UserWarnCase)
+ {
+ for(UsrPtr = TmpBuffer;
+ (UsrPtr = strstr(UsrPtr, UserWarnCase.Stack.Data[Count]));
+ UsrPtr++)
+ {
+ CmdLen = strlen(UserWarnCase.Stack.Data[Count]);
+ PSERR(UsrPtr - TmpBuffer, CmdLen, emUserWarn);
+ }
+ }
+ }
+}
+
+
+/*
+ * Checks that the dash-len is correct.
+ */
+
+static void CheckDash(void)
+{
+ STRPTR TmpPtr;
+ int TmpC;
+ LONG TmpCount, Len;
+ struct WordList *wl = NULL;
+ ULONG i;
+ BOOL Errored;
+ STRPTR PrePtr = &BufPtr[-2];
+
+ TmpPtr = BufPtr;
+ SKIP_AHEAD(TmpPtr, TmpC, TmpC == '-');
+ TmpCount = TmpPtr - BufPtr + 1;
+
+ if(MathMode)
+ {
+ if(TmpCount > 1)
+ HERE(TmpCount, emWrongDash);
+ }
+ else
+ {
+ if(LATEX_SPACE(*PrePtr) && LATEX_SPACE(*TmpPtr))
+ wl = &WordDash;
+ if(isdigit(*PrePtr) && isdigit(*TmpPtr))
+ wl = &NumDash;
+ if(isalpha(*PrePtr) && isalpha(*TmpPtr))
+ wl = &HyphDash;
+
+ if(wl)
+ {
+ Errored = TRUE;
+ FORWL(i, *wl)
+ {
+ Len = strtol(wl->Stack.Data[i], NULL, 0);
+ if(TmpCount == Len)
+ {
+ Errored = FALSE;
+ break;
+ }
+ }
+ if(Errored)
+ HERE(TmpCount, emWrongDash);
+ }
+ }
+}
+
+/*
+ * Pushes and pops nesting characters.
+ *
+ */
+
+static void HandleBracket(int Char)
+{
+ ULONG BrOffset; /* Offset into BrOrder array */
+ struct ErrInfo *ei;
+ int TmpC, Match;
+ TEXT ABuf[2], BBuf[2];
+ STRPTR TmpPtr;
+
+ AddBracket(Char);
+
+ if((BrOffset = BrackIndex(Char)) != ~0UL)
+ {
+ if(BrOffset & 1) /* Closing bracket of some sort */
+ {
+ if((ei = PopErr(&CharStack)))
+ {
+ Match = MatchBracket(*(ei->Data));
+ if(ei->Flags & efNoItal)
+ {
+ if(ItState == itOn)
+ {
+ TmpPtr = BufPtr;
+ SKIP_AHEAD(TmpPtr, TmpC, TmpC == '}');
+
+ if(!strchr(LTX_SmallPunc, *TmpPtr))
+ HERE(1, emNoItFound);
+ }
+
+ ItState = FALSE;
+ }
+ elif(ei->Flags & efItal)
+ ItState = TRUE;
+ FreeErrInfo(ei);
+ }
+ else
+ Match = 0;
+
+ if(Match != Char)
+ {
+ ABuf[0] = Match;
+ BBuf[0] = Char;
+ ABuf[1] = BBuf[1] = 0;
+ if(Match)
+ PrintError(CurStkName(&InputStack), RealBuf,
+ BufPtr - Buf - 1, 1, Line,
+ emExpectC,
+ ABuf, BBuf);
+ else
+ HEREA(1, emSoloC, BBuf);
+ }
+
+ }
+ else /* Opening bracket of some sort */
+ {
+ if((ei = PushChar(Char, Line, BufPtr - Buf - 1,
+ &CharStack, MakeCpy())))
+ {
+ if(Char == '{')
+ {
+ switch(ItFlag)
+ {
+ default:
+ ei->Flags = ItFlag;
+ ItFlag = efNone;
+ break;
+ case efNone:
+ ei->Flags |= ItState?
+ efItal : efNoItal;
+ }
+ }
+ }
+
+ else
+ PrintPrgErr(pmNoStackMem);
+ }
+ }
+}
+
+
+
+/*
+ * Searches the `Buf' for possible errors, and prints the errors. `Line'
+ * is supplied for error printing.
+ */
+
+BOOL FindErr(const STRPTR _RealBuf, const ULONG _Line)
+{
+ STRPTR
+ CmdPtr, /* We'll have to copy each command out. */
+ PrePtr, /* Ptr to char in front of command, NULL if
+ * the cmd appears as the first character */
+ TmpPtr, /* Temporary pointer */
+ ErrPtr; /* Ptr to where an error started */
+
+ int
+ TmpC, /* Just a temp var used throughout the proc.*/
+ MatchC,
+ Char; /* Char. currently processed */
+ ULONG CmdLen; /* Length of misc. things */
+ BOOL MixingQuotes;
+
+#if defined(_MSC_VER) && (_MSC_VER < 1300)
+ int (* pstcb)(int c);
+#else
+ int (CDECL * pstcb)(int c);
+#endif
+
+ enum DotLevel dotlev;
+
+ LineCpy = NULL;
+
+ if(_RealBuf)
+ {
+ RealBuf = _RealBuf;
+ Line = _Line;
+
+ BufPtr = PreProcess();
+
+ BufPtr = SkipVerb();
+
+ while(BufPtr && *BufPtr)
+ {
+ PrePtr = BufPtr - 1;
+ Char = *BufPtr++;
+ if(isspace(Char))
+ Char = ' ';
+
+ switch(Char)
+ {
+ case '~':
+ TmpPtr = NULL;
+ if(isspace(*PrePtr))
+ TmpPtr = PrePtr;
+ elif(isspace(*BufPtr))
+ TmpPtr = BufPtr;
+
+ if(TmpPtr)
+ PSERR(TmpPtr - Buf, 1, emDblSpace);
+ break;
+
+ case 'X':
+ case 'x':
+ TmpPtr = PrePtr;
+
+ SKIP_BACK(TmpPtr, TmpC,
+ (LATEX_SPACE(TmpC) || strchr("{}$", TmpC)));
+
+ if(isdigit(*TmpPtr))
+ {
+ TmpPtr = BufPtr;
+
+ SKIP_AHEAD(TmpPtr, TmpC,
+ (LATEX_SPACE(TmpC) || strchr("{}$", TmpC)));
+
+ if(isdigit(*TmpPtr))
+ HERE(1, emUseTimes);
+ }
+ /* FALLTHRU */
+ /* CTYPE: isalpha() */
+ 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':
+ if(!isalpha(*PrePtr) && (*PrePtr != '\\') && MathMode)
+ {
+ TmpPtr = BufPtr;
+ CmdPtr = CmdBuffer;
+ do
+ {
+ *CmdPtr++ = Char;
+ Char = *TmpPtr++;
+ } while(isalpha(Char));
+
+ *CmdPtr = 0;
+
+ if(HasWord(CmdBuffer, &MathRoman))
+ HEREA(strlen(CmdBuffer), emWordCommand, CmdBuffer);
+ }
+
+ break;
+ case ' ':
+ TmpPtr = BufPtr;
+ SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC));
+
+ if(*TmpPtr && *PrePtr)
+ {
+ if((TmpPtr - BufPtr) > 0)
+ {
+ HERE(TmpPtr - BufPtr + 1, emMultiSpace);
+ strwrite(BufPtr, VerbClear, TmpPtr - BufPtr - 1);
+ }
+ }
+ break;
+
+ case '.':
+ if((Char == *BufPtr) && (Char == BufPtr[1]))
+ {
+ dotlev = CheckDots(&PrePtr[1], &BufPtr[2]);
+ TmpPtr = Dot2Str(dotlev);
+ HEREA(3, emEllipsis, TmpPtr);
+ }
+
+ /* Regexp: "([^A-Z@.])\.[.!?:;]*\s+[a-z]" */
+
+ TmpPtr = BufPtr;
+ SKIP_AHEAD(TmpPtr, TmpC, strchr(LTX_GenPunc, TmpC));
+ if(LATEX_SPACE(*TmpPtr))
+ {
+ if(!isupper(*PrePtr) && (*PrePtr != '@') &&
+ (*PrePtr != '.'))
+ {
+ SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC));
+ if(islower(*TmpPtr))
+ PSERR(BufPtr - Buf, 1, emInterWord);
+ else
+ CheckAbbrevs(&BufPtr[-1]);
+ }
+ }
+
+ /* FALLTHRU */
+ case ':': case '?': case '!': case ';':
+ /* Regexp: "[A-Z][A-Z][.!?:;]\s+" */
+
+ if(isspace(*BufPtr) && isupper(*PrePtr) &&
+ (isupper(PrePtr[-1]) || (Char != '.')))
+ HERE(1, emInterSent);
+
+ /* FALLTHRU */
+ case ',':
+ if(isspace(*PrePtr) &&
+ !(isdigit(*BufPtr) &&
+ ((BufPtr[-1] == '.') || (BufPtr[-1] == ','))))
+ PSERR(PrePtr - Buf, 1, emSpacePunct);
+
+ if(MathMode &&
+ (((*BufPtr == '$') && (BufPtr[1] != '$')) ||
+ (!strafter(BufPtr, "\\)"))))
+ HEREA(1, emPunctMath, "outside inner");
+
+ if(!MathMode &&
+ (((*PrePtr == '$') && (PrePtr[-1] == '$')) ||
+ (!strinfront(PrePtr, "\\]"))))
+ HEREA(1, emPunctMath, "inside display");
+
+ break;
+ case '\'':
+ case '`':
+ if((Char == *BufPtr) && (Char == BufPtr[1]))
+ {
+ PrintError(CurStkName(&InputStack), RealBuf,
+ BufPtr - Buf - 1, 3, Line,
+ emThreeQuotes,
+ Char, Char, Char,
+ Char, Char, Char);
+ }
+
+ if(Char == '\'')
+ MatchC = '`';
+ else
+ MatchC = '\'';
+
+ TmpPtr = BufPtr;
+ SKIP_AHEAD(TmpPtr, TmpC, TmpC == Char);
+
+ MixingQuotes = FALSE;
+
+ if((*TmpPtr == MatchC) || (*TmpPtr == '\"') ||
+ (*TmpPtr == '´'))
+ MixingQuotes = TRUE;
+
+ SKIP_AHEAD(TmpPtr, TmpC, strchr("`\'\"´", TmpC));
+
+ if(MixingQuotes)
+ HERE(TmpPtr - BufPtr + 1, emQuoteMix);
+
+ switch(Char)
+ {
+ case '\'':
+ if(isalpha(*TmpPtr) &&
+ (strchr(LTX_GenPunc, *PrePtr) || isspace(*PrePtr)))
+ HERE(TmpPtr - BufPtr + 1, emBeginQ);
+
+ /* Now check quote style */
+#define ISPUNCT(ptr) (strchr(LTX_GenPunc, *ptr) && (ptr[-1] != '\\'))
+
+ /* We ignore all single words/abbreviations in quotes */
+
+ {
+ STRPTR WordPtr = PrePtr;
+ SKIP_BACK(WordPtr, TmpC, (isalnum(TmpC) ||
+ strchr(LTX_GenPunc, TmpC)));
+
+ if(*WordPtr != '`')
+ {
+ if(*PrePtr && (Quote != quTrad) && ISPUNCT(PrePtr))
+ PSERRA(PrePtr - Buf, 1, emQuoteStyle,
+ "in front of");
+
+ if(*TmpPtr && (Quote != quLogic) &&
+ ISPUNCT(TmpPtr))
+ PSERRA(TmpPtr - Buf, 1, emQuoteStyle, "after");
+ }
+ }
+
+ break;
+ case '`':
+ if(isalpha(*PrePtr) &&
+ (strchr(LTX_GenPunc, *TmpPtr) || isspace(*TmpPtr)))
+ HERE(TmpPtr - BufPtr + 1, emEndQ);
+ break;
+ }
+ BufPtr = TmpPtr;
+ break;
+ case '"':
+ HERE(1, emUseQuoteLiga);
+ break;
+
+ /* One of these are unnecessary, but what the heck... */
+ case 180: /* ´. NOTE: '\xb4' gets converted to - something*/
+ case ~(0xff &(~180)): /* This yields 0xff...fb4 in */
+ /* arbitrary precision. */
+
+ HERE(1, emUseOtherQuote);
+ break;
+
+ case '_':
+ case '^':
+ if(*PrePtr != '\\')
+ {
+ TmpPtr = PrePtr;
+ SKIP_BACK(TmpPtr, TmpC, LATEX_SPACE(TmpC));
+
+ CmdLen = 1;
+
+ switch(*TmpPtr)
+ {
+ /*{*/
+ case '}':
+ if(PrePtr[-1] != '\\')
+ break;
+
+ CmdLen++;
+ PrePtr--;
+ /* FALLTHRU */
+ /*[(*/
+ case ')':
+ case ']':
+ PSERR(PrePtr - Buf, CmdLen, emEnclosePar);
+ }
+
+ TmpPtr = BufPtr;
+ SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC));
+
+ ErrPtr = TmpPtr;
+
+ if(isalpha(*TmpPtr))
+ pstcb = &my_isalpha;
+ elif(isdigit(*TmpPtr))
+ pstcb = &my_isdigit;
+ else
+ break;
+
+ while((*pstcb)(*TmpPtr++))
+ ;
+ TmpPtr--;
+
+ if((TmpPtr - ErrPtr) > 1)
+ PSERR(ErrPtr - Buf, TmpPtr - ErrPtr, emEmbrace);
+ }
+ break;
+ case '-':
+ CheckDash();
+ break;
+ case '\\': /* Command encountered */
+ BufPtr = GetLTXToken(--BufPtr, CmdBuffer);
+
+ if(LATEX_SPACE(*PrePtr))
+ {
+ if(HasWord(CmdBuffer, &Linker))
+ PSERR(PrePtr - Buf, 1, emNBSpace);
+ if(HasWord(CmdBuffer, &PostLink))
+ PSERR(PrePtr - Buf, 1, emFalsePage);
+ }
+
+ if(LATEX_SPACE(*BufPtr) && !MathMode &&
+ (!HasWord(CmdBuffer, &Silent)) &&
+ (strlen(CmdBuffer) != 2))
+ {
+ PSERR(BufPtr - Buf, 1, emSpaceTerm);
+ }
+ elif((*BufPtr == '\\') && (!isalpha(BufPtr[1])) &&
+ (!LATEX_SPACE(BufPtr[1])))
+ PSERR(BufPtr - Buf, 2, emNotIntended);
+
+ PerformBigCmd(PrePtr + 1);
+ BufPtr = SkipVerb();
+
+ break;
+
+ LOOP(bracket,
+ case '(':
+ ifn(!*PrePtr || LATEX_SPACE(*PrePtr) || isdigit(*PrePtr) ||
+ strchr("([{`~", *PrePtr))
+ {
+ if(PrePtr[-1] != '\\') /* Short cmds */
+ {
+ TmpPtr = PrePtr;
+ SKIP_BACK(TmpPtr, TmpC, istex(TmpC));
+ if(*TmpPtr != '\\') /* Long cmds */
+ PSERRA(BufPtr - Buf - 1, 1, emSpaceParen,
+ "in front of");
+ }
+ }
+ if(isspace(*BufPtr))
+ PSERRA(BufPtr - Buf, 1, emNoSpaceParen, "after");
+
+ LAST(bracket);
+ case ')':
+ if(isspace(*PrePtr))
+ PSERRA(BufPtr - Buf - 1, 1, emNoSpaceParen,
+ "in front of");
+ if(isalpha(*BufPtr))
+ PSERRA(BufPtr - Buf, 1, emSpaceParen, "after");
+
+ LAST(bracket);
+ )
+
+ case '}':
+ case '{':
+ case '[':
+ case ']':
+ HandleBracket(Char);
+ break;
+ case '$':
+ if(*PrePtr != '\\')
+ {
+ if(*BufPtr == '$')
+ BufPtr++;
+ MathMode ^= TRUE;
+ }
+
+ break;
+ }
+ }
+
+ if(!VerbMode)
+ {
+ CheckRest();
+ }
+ }
+
+ return(TRUE);
+}
+
+/*
+ * Tries to create plural forms for words. Put a '%s' where a
+ * suffix should be put, e.g. "warning%s". Watch your %'s!
+ */
+
+static void Transit(FILE *fh, ULONG Cnt, STRPTR Str)
+{
+ switch(Cnt)
+ {
+ case 0:
+ fputs("No ", fh);
+ fprintf(fh, Str, "s");
+ break;
+ case 1:
+ fputs("One ", fh);
+ fprintf(fh, Str, "");
+ break;
+ default:
+ fprintf(fh, "%ld ", Cnt);
+ fprintf(fh, Str, "s");
+ break;
+ }
+}
+
+/*
+ * Prints the status/conclusion after doing all the testing, including
+ * bracket stack status, math mode, etc.
+ */
+
+void PrintStatus(ULONG Lines)
+{
+ ULONG Cnt;
+ struct ErrInfo *ei;
+
+
+ while((ei = PopErr(&CharStack)))
+ {
+ PrintError(ei->File, ei->LineBuf, ei->Column,
+ ei->ErrLen, ei->Line, emNoMatchC,
+ (STRPTR) ei->Data);
+ FreeErrInfo(ei);
+ }
+
+ while((ei = PopErr(&EnvStack)))
+ {
+ PrintError(ei->File, ei->LineBuf, ei->Column,
+ ei->ErrLen, ei->Line, emNoMatchC,
+ (STRPTR) ei->Data);
+ FreeErrInfo(ei);
+ }
+
+ if(MathMode)
+ {
+ PrintError(CurStkName(&InputStack), "", 0L, 0L, Lines,
+ emMathStillOn);
+ }
+
+ for(Cnt = 0L; Cnt < (NUMBRACKETS>>1); Cnt++)
+ {
+ if(Brackets[Cnt << 1] != Brackets[(Cnt << 1) + 1])
+ {
+ PrintError(CurStkName(&InputStack), "", 0L, 0L, Lines,
+ emNoMatchCC,
+ BrOrder[Cnt<<1], BrOrder[(Cnt<<1) + 1]);
+ }
+ }
+
+ if(!Quiet)
+ {
+ Transit(stderr, ErrPrint, "error%s printed; ");
+ Transit(stderr, WarnPrint, "warning%s printed; ");
+ Transit(stderr, UserSupp, "user suppressed warning%s printed.\n");
+ }
+}
+
+
+
+/*
+ * Uses OutputFormat. Be sure that `String'
+ * does not contain tabs, newlines, etc.
+ * Prints a formatted string. Formatting codes understood:
+ * %b - string to print Between fields (from -s option)
+ * %c - Column position of error
+ * %d - lenght of error (Digit)
+ * %f - current Filename
+ * %i - Turn on inverse printing mode.
+ * %I - Turn off inverse printing mode.
+ * %k - Kind of error (warning, error, message)
+ * %l - Line number of error
+ * %m - warning Message
+ * %n - warning Number
+ * %u - an Underlining line (like the one which appears when using -v1)
+ * %r - part of line in front of error ('S' - 1)
+ * %s - part of line which contains error (String) * %t - part of line after error ('S' + 1)
+ */
+
+
+void PrintError(const STRPTR File, const STRPTR String,
+ const LONG Position, const LONG Len,
+ const LONG LineNo, const enum ErrNum Error, ...)
+{
+ static /* Just to reduce stack usage... */
+ TEXT PrintBuffer[BUFSIZ];
+ va_list MsgArgs;
+
+ STRPTR LastNorm = OutputFormat, of;
+ int c;
+
+ enum Context Context;
+
+ if(betw(emMinFault, Error, emMaxFault))
+ {
+ switch(LaTeXMsgs[Error].InUse)
+ {
+ case iuOK:
+ do
+ {
+ Context = LaTeXMsgs[Error].Context;
+
+ if(!HeadErrOut)
+ Context |= ctOutHead;
+
+#define RGTCTXT(Ctxt, Var) if((Context & Ctxt) && !(Var)) break;
+
+ RGTCTXT(ctInMath, MathMode);
+ RGTCTXT(ctOutMath, !MathMode);
+ RGTCTXT(ctInHead, InHeader);
+ RGTCTXT(ctOutHead, !InHeader);
+
+ switch(LaTeXMsgs[Error].Type)
+ {
+ case etWarn:
+ WarnPrint++;
+ break;
+ case etErr:
+ ErrPrint++;
+ break;
+ case etMsg:
+ break;
+ }
+
+ while((of = strchr(LastNorm, '%')))
+ {
+ c = *of;
+ *of = 0;
+
+ fputs(LastNorm, OutputFile);
+
+ *of++ = c;
+
+ switch(c = *of++)
+ {
+ case 'b':
+ fputs(Delimit, OutputFile);
+ break;
+ case 'c':
+ fprintf(OutputFile, "%ld", Position + 1);
+ break;
+ case 'd':
+ fprintf(OutputFile, "%ld", Len);
+ break;
+ case 'f':
+ fputs(File, OutputFile);
+ break;
+ case 'i':
+ fputs(ReverseOn, OutputFile);
+ break;
+ case 'I':
+ fputs(ReverseOff, OutputFile);
+ break;
+ case 'k':
+ switch(LaTeXMsgs[Error].Type)
+ {
+ case etWarn:
+ fprintf(OutputFile, "Warning");
+ break;
+ case etErr:
+ fprintf(OutputFile, "Error");
+ break;
+ case etMsg:
+ fprintf(OutputFile, "Message");
+ break;
+ }
+ break;
+ case 'l':
+ fprintf(OutputFile, "%ld", LineNo);
+ break;
+ case 'm':
+ va_start(MsgArgs, Error);
+ vfprintf(OutputFile, LaTeXMsgs[Error].Message,
+ MsgArgs);
+ va_end(MsgArgs);
+ break;
+ case 'n':
+ fprintf(OutputFile, "%d", Error);
+ break;
+ case 'u':
+ sfmemset(PrintBuffer, ' ', (LONG) Position);
+
+ sfmemset(&PrintBuffer[Position], '^', Len);
+ PrintBuffer[Position + Len] = 0;
+ fputs(PrintBuffer, OutputFile);
+ break;
+ case 'r':
+ substring(String, PrintBuffer, 0L, Position);
+ fputs(PrintBuffer, OutputFile);
+ break;
+ case 's':
+ substring(String, PrintBuffer, Position, Len);
+ fputs(PrintBuffer, OutputFile);
+ break;
+ case 't':
+ substring(String, PrintBuffer, Position + Len, LONG_MAX);
+ fputs(PrintBuffer, OutputFile);
+ break;
+ default:
+ fputc(c, OutputFile);
+ break;
+ }
+ LastNorm = of;
+ }
+ fputs(LastNorm, OutputFile);
+ } while(FALSE);
+ break;
+ case iuNotUser:
+ UserSupp++;
+ break;
+ case iuNotSys:
+ break;
+ }
+ }
+}
+
+/*
+ * All commands isolated is routed through this command, so we can
+ * update global statuses like math mode and whether @ is a letter
+ * or not.
+ */
+
+static enum ErrNum PerformCommand(const STRPTR Cmd, STRPTR Arg)
+{
+ STRPTR Argument = "";
+ enum ErrNum
+ en = emMinFault;
+ int TmpC;
+
+ if(!strcmp(Cmd, "\\makeatletter"))
+ AtLetter = TRUE;
+ elif(!strcmp(Cmd, "\\makeatother"))
+ AtLetter = FALSE;
+ elif(InputFiles &&
+ !(strcmp(Cmd, "\\input") && strcmp(Cmd, "\\include")))
+ {
+ SKIP_AHEAD(Arg, TmpC, LATEX_SPACE(TmpC));
+ if(*Arg == '{') /* } */
+ {
+ if(GetLTXArg(Arg, TmpBuffer, GET_STRIP_TOKEN, NULL))
+ Argument = TmpBuffer;
+ }
+ else
+ Argument = strip(Arg, STRP_BTH);
+
+ ifn(Argument && PushFileName(Argument, &InputStack))
+ en = emNoCmdExec;
+ }
+ elif(HasWord(Cmd, &Primitives))
+ en = emTeXPrim;
+ elif(*Cmd == '\\')
+ {
+ /* Quicker check of single lettered commands. */
+ switch(Cmd[1])
+ {
+ case '(':
+ case '[':
+ MathMode = TRUE;
+ break;
+ case ']':
+ case ')':
+ MathMode = FALSE;
+ break;
+ case '/':
+ switch(ItState)
+ {
+ case itOn:
+ ItState = itCorrected;
+ Argument = Arg;
+
+ SKIP_AHEAD(Argument, TmpC, TmpC == '{' || TmpC == '}');
+
+ if(strchr(".,", *Argument))
+ en = emItPunct;
+
+ break;
+ case itCorrected:
+ en = emItDup;
+ break;
+ case itOff:
+ en = emItInNoIt;
+ }
+ break;
+ }
+ }
+
+ return(en);
+}
diff --git a/Build/source/texk/chktex/FindErrs.h b/Build/source/texk/chktex/FindErrs.h
new file mode 100644
index 00000000000..4ce4924dec0
--- /dev/null
+++ b/Build/source/texk/chktex/FindErrs.h
@@ -0,0 +1,195 @@
+/*
+ * ChkTeX v1.5, header file for main program.
+ * Copyright (C) 1995-96 Jens T. Berger Thielemann
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Contact the author at:
+ * Jens Berger
+ * Spektrumvn. 4
+ * N-0666 Oslo
+ * Norway
+ * E-mail: <jensthi@ifi.uio.no>
+ *
+ *
+ */
+
+#ifndef FINDERRS_H
+#define FINDERRS_H
+#ifndef FINDERRS_H
+# include "FindErrs.h"
+#endif /* FINDERRS_H */
+#ifndef CHKTEX_H
+# include "ChkTeX.h"
+#endif /* CHKTEX_H */
+
+
+#undef ERRMSGS
+#undef MSG
+
+#define ERRMSGS \
+ MSG(emMinFault, etErr, iuOK, ctNone,\
+ INTERNFAULT)\
+ MSG(emSpaceTerm, etWarn, iuOK, ctOutMath,\
+ "Command terminated with space.")\
+ MSG(emNBSpace, etWarn, iuOK, ctNone,\
+ "Non-breaking space (`~') should have been used.")\
+ MSG(emEnclosePar, etWarn, iuOK, ctInMath,\
+ "You should enclose the previous parenthesis with `{}\'.")\
+ MSG(emItInNoIt, etWarn, iuOK, ctNone,\
+ "Italic correction (`\\/') found in non-italic buffer.")\
+ MSG(emItDup, etWarn, iuOK, ctNone,\
+ "Italic correction (`\\/') found more than once.")\
+ MSG(emNoItFound, etWarn, iuOK, ctNone,\
+ "No italic correction (`\\/') found.")\
+ MSG(emAccent, etWarn, iuOK, ctNone,\
+ "Accent command `%s' needs use of `\\%c%s'.")\
+ MSG(emWrongDash, etWarn, iuOK, ctOutMath,\
+ "Wrong length of dash may have been used.")\
+ MSG(emExpectC, etWarn, iuOK, ctNone,\
+ "`%s' expected, found `%s'.")\
+ MSG(emSoloC, etWarn, iuOK, ctNone,\
+ "Solo `%s' found.")\
+ MSG(emEllipsis, etWarn, iuOK, ctNone,\
+ "You should use %s to achieve an ellipsis.")\
+ MSG(emInterWord, etWarn, iuOK, ctOutMath,\
+ "Interword spacing (`\\ ') should perhaps be used.")\
+ MSG(emInterSent, etWarn, iuOK, ctOutMath,\
+ "Intersentence spacing (`\\@') should perhaps be used.")\
+ MSG(emNoArgFound, etErr, iuOK, ctNone,\
+ "Could not find argument for command.")\
+ MSG(emNoMatchC, etWarn, iuOK, ctOutMath,\
+ "No match found for `%s'.")\
+ MSG(emMathStillOn, etWarn, iuOK, ctNone,\
+ "Mathmode still on at end of LaTeX file.")\
+ MSG(emNoMatchCC, etWarn, iuOK, ctNone,\
+ "Number of `%c' doesn't match the number of `%c'!")\
+ MSG(emUseQuoteLiga, etWarn, iuOK, ctNone,\
+ "Use either `` or '' as an alternative to `\"'.")\
+ MSG(emUseOtherQuote, etWarn, iuOK, ctNone,\
+ "Use \"'\" (ASCII 39) instead of \"´\" (ASCII 180).")\
+ MSG(emUserWarn, etWarn, iuOK, ctNone,\
+ "User-specified pattern found.")\
+ MSG(emNotIntended, etWarn, iuNotSys, ctNone,\
+ "This command might not be intended.")\
+ MSG(emComment, etMsg, iuNotSys, ctNone,\
+ "Comment displayed.")\
+ MSG(emThreeQuotes, etWarn, iuOK, ctNone,\
+ "Either %c\\,%c%c or %c%c\\,%c will look better.")\
+ MSG(emFalsePage, etWarn, iuOK, ctOutMath,\
+ "Delete this space to maintain correct pagereferences.")\
+ MSG(emEmbrace, etWarn, iuOK, ctInMath,\
+ "You might wish to put this between a pair of `{}'")\
+ MSG(emSpacePunct, etWarn, iuOK, ctOutMath,\
+ "You ought to remove spaces in front of punctuation.")\
+ MSG(emNoCmdExec, etWarn, iuOK, ctNone,\
+ "Could not execute LaTeX command.")\
+ MSG(emItPunct, etWarn, iuOK, ctNone,\
+ "Don't use \\/ in front of small punctuation.")\
+ MSG(emUseTimes, etWarn, iuOK, ctNone,\
+ "$\\times$ may look prettier here.")\
+ MSG(emMultiSpace, etWarn, iuNotSys, ctOutMath,\
+ "Multiple spaces detected in input.")\
+ MSG(emIgnoreText, etWarn, iuOK, ctNone,\
+ "This text may be ignored.")\
+ MSG(emBeginQ, etWarn, iuOK, ctOutMath,\
+ "Use ` to begin quotation, not '.")\
+ MSG(emEndQ, etWarn, iuOK, ctOutMath,\
+ "Use ' to end quotation, not `.")\
+ MSG(emQuoteMix, etWarn, iuOK, ctNone,\
+ "Don't mix quotes.")\
+ MSG(emWordCommand, etWarn, iuOK, ctInMath,\
+ "You should perhaps use `\\%s' instead.")\
+ MSG(emSpaceParen, etWarn, iuOK, ctOutMath,\
+ "You should put a space %s parenthesis.")\
+ MSG(emNoSpaceParen, etWarn, iuOK, ctOutMath,\
+ "You should avoid spaces %s parenthesis.")\
+ MSG(emQuoteStyle, etWarn, iuOK, ctOutMath,\
+ "You should not use punctuation %s quotes.")\
+ MSG(emDblSpace, etWarn, iuOK, ctOutMath,\
+ "Double space found.")\
+ MSG(emPunctMath, etWarn, iuOK, ctNone,\
+ "You should put punctuation %s math mode.")\
+ MSG(emTeXPrim, etWarn, iuNotSys, ctNone,\
+ "You ought to not use primitive TeX in LaTeX code.")\
+ MSG(emRemPSSpace, etWarn, iuOK, ctOutMath,\
+ "You should remove spaces in front of `%s'") \
+ MSG(emNoCharMean, etWarn, iuOK, ctNone,\
+ "`%s' is normally not followed by `%c'.")
+
+#undef MSG
+#define MSG(num, type, inuse, ctxt, text) num,
+
+enum ErrNum
+{
+ ERRMSGS
+ emMaxFault
+};
+#undef MSG
+
+enum Context {
+ ctNone = 0x00,
+ ctInMath = 0x01,
+ ctOutMath = 0x02,
+ ctInHead = 0x04,
+ ctOutHead = 0x08
+};
+
+struct ErrMsg {
+ enum ErrNum Number;
+ enum {
+ etMsg,
+ etWarn,
+ etErr
+ } Type;
+
+ enum {
+ iuNotSys,
+ iuNotUser,
+ iuOK
+ } InUse;
+
+ /* Requirements posed upon environment */
+ enum Context Context;
+
+ STRPTR Message;
+};
+
+enum ItState {
+ itOff,
+ itOn,
+ itCorrected
+};
+
+
+enum DotLevel {
+ dtUnknown = 0x0,
+ dtCDots = 0x1,
+ dtLDots = 0x2,
+ dtDots = 0x4
+};
+
+extern struct ErrMsg
+ LaTeXMsgs [emMaxFault + 1];
+
+extern STRPTR OutputFormat;
+
+BOOL FindErr __PROTO((STRPTR const, ULONG const));
+void PrintError __PROTO((const STRPTR,
+ const STRPTR, const LONG, const LONG,
+ const LONG, const enum ErrNum, ...));
+void PrintStatus __PROTO((ULONG Lines));
+
+#endif /* FINDERRS */
diff --git a/Build/source/texk/chktex/HashWord.a b/Build/source/texk/chktex/HashWord.a
new file mode 100644
index 00000000000..2954f84c766
--- /dev/null
+++ b/Build/source/texk/chktex/HashWord.a
@@ -0,0 +1,122 @@
+*
+* ChkTeX v1.5, hashes a NULL-terminated string.
+* Copyright (C) 1995-96 Jens T. Berger Thielemann
+*
+* This program is free software; you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation; either version 2 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*
+* Contact the author at:
+* Jens Berger
+* Spektrumvn. 4
+* N-0666 Oslo
+* Norway
+* E-mail: <jensthi@ifi.uio.no>
+*
+*
+
+******* HashWord() ****************************************************
+*
+* NAME
+* HashWord() - hashes a NULL-terminated string
+*
+* SYNOPSIS
+*
+* HashVal = @HashWord(char *String)
+* D0.W A0
+*
+* HashVal = _HashWord(char *String)
+* D0.W 4(SP)
+*
+* FUNCTION
+* Hashes a NULL-terminated string.
+*
+* Well optimized (I believe), should be near optimal for this
+* approach to hashing. Optimized for caches, loops and pipelines.
+* Inner loop size: 12 bytes.
+*
+*
+* INPUTS
+* String - a NULL-terminated 8-bit C string. May be passed on
+* stack or in A0, depending on entry point.
+*
+* RETURNS
+* HashVal - the hashed value of the string.
+*
+* NOTES
+* Registers a0 and d1 are destroyed.
+*
+* This function works best when there's a slight difference in
+* the length of the strings.
+*
+* On non-Amiga machines a similar routine is implemented in
+* "Utility.c" in the ChkTeX distribution.
+*
+* It should be possible to adopt this to other 680x0 computers,
+* too.
+*
+* BUGS
+* None known.
+*
+***********************************************************************
+*
+*
+*
+*
+*
+
+ SECTION text,code
+ XDEF _HashWord
+ XDEF @HashWord
+
+HashShift EQU 5 * Experiments show this to be best;
+ * reasonable, as most TeX commands
+ * only use lowercase letters.
+
+REG_HashVal EQUR d0
+REG_TmpChar EQUR d1
+REG_StrLen EQUR d2
+REG_String EQUR a0
+
+Len_Incr EQU 6
+
+CLRD MACRO \1 * Clears data reg
+ moveq #0,\1
+ ENDM
+
+_HashWord * Stack entry
+ move.l 4(sp),REG_String
+@HashWord * Register entry
+ CLRD REG_HashVal
+ CLRD REG_TmpChar
+
+ move.b (REG_String)+,REG_TmpChar
+ beq.b return
+
+ move.l REG_StrLen,-(sp)
+ CLRD REG_StrLen
+
+loop
+ eor.w REG_TmpChar,REG_HashVal
+ addq.w #Len_Incr,REG_StrLen
+ ror.w #HashShift,REG_HashVal
+ eor.w REG_StrLen,REG_HashVal
+
+ move.b (REG_String)+,REG_TmpChar
+ bne.b loop
+
+ move.l (sp)+,REG_StrLen
+return
+ rts
+
+ END
diff --git a/Build/source/texk/chktex/MakeHTML.in b/Build/source/texk/chktex/MakeHTML.in
new file mode 100644
index 00000000000..669afc481c9
--- /dev/null
+++ b/Build/source/texk/chktex/MakeHTML.in
@@ -0,0 +1,20 @@
+#! @PERL5@
+
+$latexonly = 0;
+
+while(<>)
+{
+ $latexonly = 1 if /^%latex/i;
+ $latexonly = 0 if /^%endlatex/i;
+
+
+ if($latexonly) {
+ if(/^%!(.*)/)
+ {
+ print $1;
+ }
+ }
+ else {
+ print;
+ }
+}
diff --git a/Build/source/texk/chktex/Makefile.in b/Build/source/texk/chktex/Makefile.in
new file mode 100644
index 00000000000..a7ca9402cf0
--- /dev/null
+++ b/Build/source/texk/chktex/Makefile.in
@@ -0,0 +1,345 @@
+#
+# Makefile for ChkTeX project, creates the stuff.
+# Copyright (C) 1996 Jens T. Berger Thielemann
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# Contact the author at:
+# Jens Berger
+# Spektrumvn. 4
+# N-0666 Oslo
+# Norway
+# E-mail: <jensthi@ifi.uio.no>
+#
+
+
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+bindir=@bindir@
+datadir=@datadir@
+srcdir=@srcdir@
+mandir=@mandir@
+INSTALL=@INSTALL@
+INSTALL_PROGRAM=@INSTALL_PROGRAM@
+INSTALL_DATA=@INSTALL_DATA@
+ELISPDIR=@ELISPDIR@
+
+CC=@CC@
+CFLAGS=@CFLAGS@
+CPPFLAGS=@CPPFLAGS@
+DEFS=@DEFS@
+LIBS=@LIBS@
+LDFLAGS=@LDFLAGS@
+LN_S=@LN_S@
+LATEX=@LATEX@
+DVIPS=@DVIPS@
+PERL5=@PERL5@
+LATEX2HTML=@LATEX2HTML@
+LYNX=@LYNX@
+GROFF=@GROFF@
+SHELL=/bin/sh
+
+SCRIPTS=@SCRIPTS@
+
+USRDEFS=-DDATADIR=\"$(datadir)\"
+
+#####################################################################
+
+INSTALLFILES= configure.in Makefile.in config.h.in chktexrc MakeHTML.in
+
+WEBFILES= chkweb deweb.in
+
+DOCFILES= ChkTeX.tex ChkTeX.dvi \
+ChkTeX.readme COPYING WB2Argv.readme deweb.1 deweb.doc
+
+SOURCEFILES= ChkTeX.c ChkTeX.h FindErrs.c FindErrs.h OpSys.c OpSys.h \
+Resource.c Resource.h Utility.c Utility.h WB2Argv.c WB2Argv.h \
+getopt.c getopt.h getopt1.c HashWord.a chktex.el
+
+PORTFILES= config.msd ChkTeX.dsk ChkTeX.prj SCOPTIONS SMakefile config.AMIGA
+
+TESTFILES= Test.tex input.tex Test.out
+
+
+###
+#
+# OS specific files
+#
+###
+
+## AMIGA
+
+REXXFILES= amiga/ChkTeX.ced amiga/ChkTeX.ged amiga/ChkTeX.scm \
+amiga/ChkTeX.vbr amiga/GotoFile.ced
+
+AMIGAFILES= amiga/ChkTeX.install amiga/ChkTeX.install.info \
+amiga/ChkTeX amiga/ChkTeX.info amiga/COPYING.info \
+amiga/ChkTeX.readme.info amiga/lacheck $(REXXFILES)
+
+## MSDOS
+
+MSDOSFILES= msdos/ChkTeX.exe
+
+## OS/2
+
+OS2FILES= os2/Readme.os2 os2/ChkTeX.exe
+
+## UNIX
+
+UNIXFILES= configure install-sh unix/lacheck
+
+COMMONFILES= $(INSTALLFILES) $(WEBFILES) $(DOCFILES) $(SOURCEFILES) \
+$(TESTFILES) $(PORTFILES)
+
+ARCHIVES= chktex.lha chktex.tar.gz
+
+all: chktex
+
+dist: configure ChkTeX.dvi Test.out ChkTeX.readme deweb.doc
+ touch chktex $(ARCHIVES)
+ rm -r chktex $(ARCHIVES)
+ mkdir chktex chktex/generic chktex/generic/exec
+ for file in $(COMMONFILES); do \
+ cp $$file chktex/generic; \
+ done
+ cp exec/types.h chktex/generic/exec
+ srcdir=`pwd`; \
+ for dir in chktex/amiga/ chktex/msdos/ chktex/os2/ chktex/unix; do \
+ cd $$srcdir; \
+ mkdir $$dir; \
+ cd $$dir; \
+ for file in $(COMMONFILES); do \
+ $(LN_S) ../generic/$$file .; \
+ done; \
+ mkdir exec; cd exec; \
+ $(LN_S) ../../generic/exec/types.h .; \
+ done
+ for file in $(AMIGAFILES); do\
+ cp /hom/jensthi/chktex/source/$$file chktex/amiga; \
+ done
+ for file in $(MSDOSFILES); do\
+ cp /hom/jensthi/chktex/source/$$file chktex/msdos; \
+ done
+ for file in $(OS2FILES); do\
+ cp /hom/jensthi/chktex/source/$$file chktex/os2; \
+ done
+ for file in $(UNIXFILES); do\
+ cp /hom/jensthi/chktex/source/$$file chktex/unix; \
+ done
+ cp README chktex/
+ -rm chktex.lha
+ lha a chktex.lha chktex/amiga/ chktex/README
+ -rm chktex_unix.tar.gz
+ tar chf chktex_unix.tar chktex/unix
+ gzip chktex_unix.tar
+ -rm chktex_gen.tar.gz
+ tar chf chktex_gen.tar chktex/generic
+ gzip chktex_gen.tar
+ -rm chktex_msdos.zip chktex_os2.zip
+ zip -r chktex_msdos chktex/msdos
+ tar cf chktex.tar chktex
+ gzip chktex.tar
+ rm -r chktex
+
+########################################################################
+
+
+.c.o:
+ $(CC) $(CFLAGS) -I$(srcdir) -I. $(DEFS) $(USRDEFS) -c $< -o $@
+
+###################### MAIN DEPENDENCIES ################################
+
+OBJS= ChkTeX.o FindErrs.o getopt.o getopt1.o OpSys.o Resource.o Utility.o
+
+MAKETEST= ./chktex -mall -r -g0 -lchktexrc Test.tex
+
+Test.out: chktex Test.tex ChkTeX.tex
+ touch Test.out
+ rm -f Test.out
+ $(MAKETEST) 1> Test.out
+
+check: chktex
+ @echo ">>> Testing that checking algorithms work correctly..."
+ @touch chktest
+ @rm -f chktest
+ @$(MAKETEST) 1> chktest
+ @if cmp -s chktest Test.out; then \
+ echo ">>> OK!"; \
+ rm -f chktest; \
+ else \
+ echo "***WARNING***"; \
+ echo "Problems when checking compilation. This may or may not"; \
+ echo "be a problem; anyway, I'm giving you a diff from what the"; \
+ echo "results were *supposed* to be..."; \
+ diff -c chktest Test.out; \
+ fi
+
+
+chktex: $(OBJS)
+ touch chktex
+ rm -r chktex
+ $(CC) $(LDFLAGS) -o chktex $(OBJS) $(LIBS)
+
+install: chktex ChkTeX.dvi
+ $(INSTALL) -d $(bindir)
+ for program in chktex $(SCRIPTS); do \
+ $(INSTALL_PROGRAM) $$program $(bindir); \
+ done
+ $(INSTALL) -d $(datadir)
+ $(INSTALL_DATA) chktexrc $(datadir)
+ if (eval echo "$(SCRIPTS)") | egrep deweb >/dev/null 2>&1; then \
+ $(INSTALL) -d $(mandir); \
+ $(INSTALL) -d $(mandir)/man1; \
+ cp deweb.1 $(mandir)/man1; \
+ fi
+ if (eval echo "$(ELISPDIR)") | egrep "/" >/dev/null 2>&1; then \
+ $(INSTALL_DATA) chktex.el $(ELISPDIR); \
+ fi
+
+
+
+uninstall:
+ -rm -f $(bindir)/chktex
+ -rm -f $(bindir)/chkweb
+ -rm -f $(bindir)/deweb
+ -rm -f $(datadir)/chktexrc
+
+test:
+ chktex -v2 -mall Test.tex | less -r
+
+mostlyclean: clean
+
+clean:
+ -rm -r *.o *.aux *.log MakeHTML chktex deweb HTML rme 2> /dev/null
+
+distclean: clean
+ -rm -r *.cache *.status *.log *.tar.gz *.lha 2> /dev/null
+
+maintainer-clean: clean
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+ -rm -r *.rme *.dvi *.ps *.doc Test.out 2> /dev/null
+
+dvi: ChkTeX.dvi
+
+html:
+ touch HTML
+ rm -r HTML
+ mkdir HTML
+ chmod u+x MakeHTML
+ ./MakeHTML ChkTeX.tex > HTML/ChkTeX.tex
+ cd HTML; $(LATEX2HTML) ChkTeX.tex
+ $(PERL5) -i -pe 's%</code> %</code>%gi;s%\s+([.,?!])%$$1%g;' HTML/ChkTeX/*.html
+
+ChkTeX.readme: ChkTeX.tex
+ touch rme
+ rm -r rme
+ mkdir rme
+ chmod u+x MakeHTML
+ ./MakeHTML ChkTeX.tex > rme/ChkTeX.tex
+ cd rme; $(LATEX2HTML) -split 0 ChkTeX.tex
+ $(PERL5) -i -pe 's%</code> %</code>%gi;s%\s+([.,?!])%$$1%g;' rme/ChkTeX/*.html
+ $(LYNX) -dump rme/ChkTeX/ChkTeX.html > ChkTeX.rme
+ cp Readme.header ChkTeX.readme
+ $(PERL5) -e 'undef $$/;$$_=<>;($$_)=/(.*INTRODUCTION(.|\n)*?)[ \t]+ABOUT THIS DOCUMENT/i;s/[ \t]+\n/\n/g;s/\n\n\n/\n/g;s/\[\d+\]//g;print;' ChkTeX.rme >> ChkTeX.readme
+
+###################### INDIVIDUAL DEPENDENCIES ##########################
+
+deweb.doc: deweb.1
+ touch deweb.doc
+ rm -rf deweb.doc
+ $(GROFF) deweb.1 > deweb.doc
+
+configure: configure.in
+ autoconf
+
+ChkTeX.dvi: ChkTeX.tex
+ $(LATEX) ChkTeX.tex
+
+ChkTeX.ps: ChkTeX.dvi
+ $(DVIPS) -o ChkTeX.ps ChkTeX.dvi
+
+ChkTeX: ChkTeX.c
+ @echo
+
+ChkTeX.o: ChkTeX.c WB2Argv.h getopt.h ChkTeX.h exec/types.h \
+Utility.h OpSys.h FindErrs.h Resource.h config.h
+
+FindErrs.o: FindErrs.c ChkTeX.h exec/types.h FindErrs.h \
+Utility.h OpSys.h Resource.h config.h
+
+getopt.o: getopt.c config.h getopt.h
+
+getopt1.o: getopt1.c config.h getopt.h
+
+OpSys.o: OpSys.c ChkTeX.h exec/types.h Utility.h OpSys.h config.h
+
+Resource.o: Resource.c ChkTeX.h exec/types.h Utility.h OpSys.h Resource.h \
+config.h
+
+Utility.o: Utility.c ChkTeX.h exec/types.h Utility.h OpSys.h Resource.h \
+config.h
+
+RegExps.o: RegExps.c RegExps.h config.h
+
+WB2Argv.o: WB2Argv.c WB2Argv.h
+
+cover:
+ chktex -h
+ chktex Test.tex
+ chktex -v2 -t -o tmptmptmp <Test.tex
+ chktex -v2 -t -o tmptmptmp Test.tex
+ chktex Test.tex -v
+ chktex Test.tex -v0
+ chktex Test.tex -v1
+ chktex Test.tex -v2
+ chktex Test.tex -v3
+ chktex Test.tex -v4
+ chktex -t -v0s::: Test.tex -x
+ chktex -p FOO Test.tex
+ chktex -t Test.tex
+ chktex -o tmptmptmp -o tmptmptmptmp Test.tex
+ chktex -l t:faultrc test.tex
+ chktex -e30w22n1 Test.tex
+ chktex -w33e-n1 Test.tex
+ chktex -i
+ chktex -v2 -t -o tmptmptmp <Test.tex
+ chktex -I Test.tex
+ chktex -rd2 Test.tex
+ chktex -gd2 Test.tex
+ chktex -f "*N\
+Between: %b*N\
+Column: %c*N\
+Lenght: %d*N\
+File: %f*N\
+%iInverse%I*N\
+Kind: %k*N\
+Line: %l*N\
+Msg: %m*N\
+Num: %n*N\
+Und: %u*N\
+Pre: %r*N\
+Str: %s*N\
+Post: %t*N\
+*N\
+%k in %f line %l: %m*N\
+%r%i%s%I%t*N\
+%u*N\
+*N" Test.tex
+ chktex -o tmptmptmp -r -d2 Test.tex
+ chktex -qv0 Test.tex
+ chktex -w30 Test.tex
+ chktex -g --localrc=.testrc -d2 Test.tex
+ cover
diff --git a/Build/source/texk/chktex/OpSys.c b/Build/source/texk/chktex/OpSys.c
new file mode 100644
index 00000000000..02589d1c5f1
--- /dev/null
+++ b/Build/source/texk/chktex/OpSys.c
@@ -0,0 +1,644 @@
+/*
+ * ChkTeX v1.5, operating system specific code for ChkTeX.
+ * Copyright (C) 1995-96 Jens T. Berger Thielemann
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Contact the author at:
+ * Jens Berger
+ * Spektrumvn. 4
+ * N-0666 Oslo
+ * Norway
+ * E-mail: <jensthi@ifi.uio.no>
+ *
+ *
+ */
+
+
+/*
+ * Some functions which have to be made different from OS to OS,
+ * unfortunately...:\
+ *
+ */
+
+#ifdef KPATHSEA
+#include <kpathsea/config.h>
+#include <kpathsea/lib.h>
+#include <kpathsea/expand.h>
+#include <kpathsea/tex-file.h>
+#endif
+
+#include "ChkTeX.h"
+#include "OpSys.h"
+#include "Utility.h"
+
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef HAVE_STAT_H
+# include <stat.h>
+#endif
+
+#if HAVE_DIRENT_H
+# include <dirent.h>
+# define NAMLEN(dirent) strlen((dirent)->d_name)
+#else
+# define dirent direct
+# define NAMLEN(dirent) (dirent)->d_namlen
+# if HAVE_SYS_NDIR_H
+# include <sys/ndir.h>
+# endif
+# if HAVE_SYS_DIR_H
+# include <sys/dir.h>
+# endif
+# if HAVE_NDIR_H
+# include <ndir.h>
+# endif
+#endif
+
+#if defined(HAVE_OPENDIR) && defined(HAVE_CLOSEDIR) && \
+ defined(HAVE_READDIR) && defined(HAVE_STAT) && \
+ defined(S_IFDIR) && defined(SLASH)
+# define USE_RECURSE 1
+#else
+# define USE_RECURSE 0
+#endif
+
+#if defined(HAVE_LIBTERMCAP) || defined(HAVE_LIBTERMLIB)
+# define USE_TERMCAP 1
+#endif
+
+
+#ifdef USE_TERMCAP
+# ifdef HAVE_TERMCAP_H
+# include <termcap.h>
+# elif HAVE_TERMLIB_H
+# include <termlib.h>
+# else
+int tgetent (char *BUFFER, char *TERMTYPE);
+char *tgetstr (char *NAME, char **AREA);
+# endif
+static char term_buffer[2048];
+#endif
+
+#ifdef AMIGA
+# define __USE_SYSBASE
+# include <dos.h>
+# include <dos/dos.h>
+# include <dos/dosasl.h>
+# include <proto/dos.h>
+# include <proto/exec.h>
+# include <signal.h>
+#endif
+
+/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */
+
+
+#ifdef AMIGA
+const char
+ VersString [] = "$VER: ChkTeX 1.5 " __AMIGADATE__
+ " Copyright (c) 1995-96 Jens T. Berger Thielemann "
+ "<jensthi@ifi.uio.no>",
+ __stdiowin [] = "CON:0/10/640/180/ChkTeX",
+ __stdiov37 [] = "/AUTO/CLOSE/WAIT";
+
+const ULONG __MemPoolPuddleSize = 16384,
+ __MemPoolThreshSize = 8192;
+
+static struct AnchorPath *AnchorPath = NULL;
+
+static void KillAnchorPath(void);
+static STRPTR InitAnchorPath(STRPTR String);
+# define V37 (DOSBase->dl_lib.lib_Version > 36)
+#endif
+
+
+/*
+ * This is the name of the global resource file.
+ */
+
+#ifndef DATADIR
+# ifdef AMIGA
+# define DATADIR "S:"
+# elif defined(__unix__)
+# define DATADIR "/usr/local/lib/"
+# elif defined(__MSDOS__)
+# define DATADIR "\\emtex\\data\\"
+# else
+# define DATADIR
+# endif
+#endif
+#define RCBASENAME "chktexrc"
+
+#ifdef __MSDOS__
+# define LOCALRCFILE RCBASENAME
+#else
+# define LOCALRCFILE "." RCBASENAME
+#endif
+
+TEXT ConfigFile [BUFSIZ] = LOCALRCFILE;
+STRPTR ReverseOn, ReverseOff;
+
+
+static BOOL HasFile(STRPTR Dir, const STRPTR Filename, const STRPTR App);
+
+#if USE_RECURSE
+static BOOL SearchFile(STRPTR Dir, const STRPTR Filename, const STRPTR App);
+#endif /* USE_RECURSE */
+
+/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */
+
+
+/*
+ * Modify this one to suit your needs. In any case, it should fill
+ * the ConfigFile (sized BUFLEN) buffer above with full name & path
+ * for the configuration file. The macro RCFILE will give you the
+ * filename part of the file, if you need that.
+ *
+ * Note: This routine will be called several times. Your mission will
+ * be to look in each location, and see whether a .chktexrc file exist
+ * there.
+ *
+ * If you choose to do nothing, only the current directory will be
+ * searched.
+ *
+ */
+
+enum LookIn
+{
+ liMin,
+ liSysDir,
+ liUsrDir,
+ liEnvir,
+ liCurDir,
+ liNFound,
+ liMax
+};
+
+
+BOOL SetupVars(void)
+{
+ STRPTR Env;
+#ifdef __MSDOS__
+ STRPTR Ptr;
+#endif
+ static enum LookIn i = liMin;
+ static BOOL FoundFile;
+
+ while(++i < liMax)
+ {
+ switch(i)
+ {
+ case liCurDir: /* Current directory */
+ strcpy(ConfigFile, LOCALRCFILE);
+ break;
+ case liEnvir: /* Environment defined */
+#ifdef __MSDOS__
+ if((Env = getenv("CHKTEXRC")) ||
+ (Env = getenv("CHKTEX_HOME")))
+#else
+ if((Env = getenv("CHKTEXRC")))
+#endif
+ {
+ strcpy(ConfigFile, Env);
+ tackon(ConfigFile, LOCALRCFILE);
+ }
+ else
+#ifdef __MSDOS__
+ if((Env = getenv("EMTEXDIR")))
+ {
+ strcpy(ConfigFile, Env);
+ tackon(ConfigFile, "data");
+ tackon(ConfigFile, LOCALRCFILE);
+ }
+ else
+#endif
+ *ConfigFile = 0;
+ break;
+ case liUsrDir: /* User dir for resource files */
+#ifdef KPATHSEA
+ {
+ char *f = concat("~/", LOCALRCFILE);
+ char *p = kpse_path_expand(f);
+ if (p) {
+ strcpy(ConfigFile, p);
+ free(p);
+ }
+ else {
+ *ConfigFile = 0;
+ }
+ free(f);
+ }
+#else /* ! KPATHSEA */
+#ifdef AMIGA
+ if(V37)
+ strcpy(ConfigFile, "ENV:");
+ else
+ strcpy(ConfigFile, "S:");
+
+ tackon(ConfigFile, LOCALRCFILE);
+#elif defined(__unix__)
+ if((Env = getenv("HOME")) ||
+ (Env = getenv("LOGDIR")))
+ {
+ strcpy(ConfigFile, Env);
+ tackon(ConfigFile, LOCALRCFILE);
+ }
+ else
+ *ConfigFile = 0;
+#elif defined(__MSDOS__)
+ strcpy(ConfigFile, PrgName);
+ if((Ptr = strrchr(ConfigFile, '\\')) ||
+ (Ptr = strchr(ConfigFile, ':')))
+ strcpy(++Ptr, RCBASENAME);
+ else
+ *ConfigFile = 0;
+#endif
+#endif /* KPATHSEA */
+ break;
+ case liSysDir: /* System dir for resource files */
+#ifdef KPATHSEA
+ {
+ char *f = kpse_find_file(LOCALRCFILE, kpse_program_text_format, TRUE);
+ if (f) {
+ strcpy(ConfigFile, f);
+ }
+ else {
+ *ConfigFile = '\0';
+ }
+ }
+#else /* ! KPATHSEA */
+#if defined(__unix__) || defined(__MSDOS__)
+ strcpy(ConfigFile, DATADIR);
+ tackon(ConfigFile, RCBASENAME);
+#else
+ *ConfigFile = 0;
+#endif
+#endif /* KPATHSEA */
+ break;
+ case liNFound:
+ case liMin:
+ case liMax:
+ *ConfigFile = 0;
+ if(!FoundFile)
+ PrintPrgErr(pmNoRsrc);
+ }
+
+ if(*ConfigFile && fexists(ConfigFile))
+ break;
+ }
+ FoundFile |= *ConfigFile;
+
+ return(*ConfigFile);
+}
+
+/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */
+
+/*
+ * This function should initialize the global variables ReverseOn
+ * and ReverseOff to magic cookies, which when printed, makes the
+ * text in between stand out.
+ */
+
+void SetupTerm(void)
+{
+#ifdef USE_TERMCAP
+ char *termtype = getenv("TERM");
+ int success;
+ char *buffer;
+
+ ifn(termtype)
+ PrintPrgErr(pmSpecifyTerm);
+
+ success = tgetent(term_buffer, termtype);
+ if(success < 0)
+ PrintPrgErr(pmNoTermData);
+ if(success == 0)
+ PrintPrgErr(pmNoTermDefd);
+
+ ifn((buffer = (char *) malloc(strlen(term_buffer))) &&
+ (ReverseOn = tgetstr("so", &buffer)) &&
+ (ReverseOff = tgetstr("se", &buffer)))
+#endif
+ {
+ ReverseOn = PRE_ERROR_STR;
+ ReverseOff = POST_ERROR_STR;
+ }
+
+}
+
+/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */
+
+/*
+ * Concatenates the `File' string to the `Dir' string, leaving the result
+ * in the `Dir' buffer. Takes care of inserting `directory' characters;
+ * if we've got the strings "/usr/foo" and "bar", we'll get
+ * "/usr/foo/bar".
+ *
+ * Behaviour somewhat controlled by the macros SLASH and DIRCHARS in the
+ * OpSys.h file.
+ *
+ */
+
+void tackon(STRPTR Dir, const STRPTR File)
+{
+ int EndC;
+ ULONG SLen;
+
+ if(Dir && (SLen = strlen(Dir)))
+ {
+ EndC = Dir[SLen -1];
+ ifn(strchr(DIRCHARS, EndC))
+ {
+ Dir[SLen++] = SLASH;
+ Dir[SLen ] = 0L;
+ }
+ }
+
+ strcat(Dir, File);
+}
+
+/*
+ * This function should add the appendix App to the filename Name.
+ * If the resulting filename gets too long due to this, it may
+ * overwrite the old appendix.
+ *
+ * Name may be assumed to be a legal filename under your OS.
+ *
+ * The appendix should contain a leading dot.
+ */
+
+void AddAppendix(STRPTR Name, const STRPTR App)
+{
+#ifdef __MSDOS__
+ STRPTR p;
+
+ if((p = strrchr(Name, '.')))
+ strcpy(p, App);
+ else
+ strcat(Name, App);
+#else
+ /*
+ * NOTE! This may fail if your system has a claustrophobic file
+ * name length limit.
+ */
+ strcat(Name, App);
+#endif
+
+}
+
+/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */
+
+
+/*
+ * Locates a file, given a wordlist containing paths. If a
+ * dir ends in a double SLASH, we'll search it recursively.
+ *
+ * We assume that
+ * a) a deeper level in the dir. tree. has a longer path than
+ * one above.
+ * b) adding a level doesn't change any of the previous levels.
+ *
+ * If this function returns TRUE, Dest is guaranteed to contain
+ * path & name of the found file.
+ *
+ * FALSE indicates that the file was not found; Dest is then
+ * unspecified.
+ */
+
+#ifdef KPATHSEA
+BOOL LocateFile(const STRPTR Filename, /* File to search for */
+ STRPTR Dest, /* Where to put final file */
+ const STRPTR App, /* Extra optional appendix */
+ struct WordList *wl) /* Not used with kpathsea.
+ */
+{
+ BOOL ret;
+ char *fn, *p;
+
+ fn = Filename;
+ p = kpse_find_file(fn, kpse_tex_format, FALSE);
+
+ if (! p || ! *p) {
+ fn = concat(Filename, App);
+ p = kpse_find_file(fn, kpse_tex_format, FALSE);
+ free(fn);
+ }
+
+ if (p) {
+ strcpy(Dest, p);
+ free(p);
+ ret = TRUE;
+ }
+ else {
+ fprintf(stderr, "%s: warning, file %s%s not found.\n", kpse_program_name, Filename, App);
+ ret = FALSE;
+ }
+
+ return ret;
+}
+#else
+BOOL LocateFile(const STRPTR Filename, /* File to search for */
+ STRPTR Dest, /* Where to put final file */
+ const STRPTR App, /* Extra optional appendix */
+ struct WordList *wl) /* List of paths, entries
+ * ending in // will be recursed
+ */
+{
+ ULONG i, Len;
+
+ FORWL(i, *wl)
+ {
+ strcpy(Dest, wl->Stack.Data[i]);
+
+#if USE_RECURSE
+ Len = strlen(Dest);
+
+ if(Len && (Dest[Len - 1] == SLASH) && (Dest[Len - 2] == SLASH))
+ {
+ Dest[Len - 1] = Dest[Len - 2] = 0;
+ if(SearchFile(Dest, Filename, App))
+ return(TRUE);
+ }
+ else
+#endif /* USE_RECURSE */
+ {
+ if(HasFile(Dest, Filename, App))
+ return(TRUE);
+ }
+ }
+ return(FALSE);
+}
+#endif
+
+static BOOL HasFile(STRPTR Dir, const STRPTR Filename, const STRPTR App)
+{
+ int DirLen = strlen(Dir);
+
+ tackon(Dir, Filename);
+ if(fexists(Dir))
+ return(TRUE);
+
+ if(App)
+ {
+ AddAppendix(Dir, App);
+ if(fexists(Dir))
+ return(TRUE);
+ }
+
+ Dir[DirLen] = 0;
+ return(FALSE);
+
+}
+
+
+#if USE_RECURSE
+static BOOL SearchFile(STRPTR Dir, const STRPTR Filename, const STRPTR App)
+{
+ struct stat *statbuf;
+ struct dirent *de;
+ DIR *dh;
+
+ int DirLen = strlen(Dir);
+ BOOL Found = FALSE;
+
+ DEBUG(("Searching %s for %s\n", Dir, Filename));
+
+ if(HasFile(Dir, Filename, App))
+ return(TRUE);
+ else
+ {
+ if((statbuf = malloc(sizeof(struct stat))))
+ {
+ if((dh = opendir(Dir)))
+ {
+ while(!Found && (de = readdir(dh)))
+ {
+ Dir[DirLen] = 0;
+ if(strcmp(de->d_name, ".") && strcmp(de->d_name, ".."))
+ {
+ tackon(Dir, de->d_name);
+
+ if(!stat(Dir, statbuf))
+ {
+ if((statbuf->st_mode & S_IFMT) == S_IFDIR)
+ Found = SearchFile(Dir, Filename, App);
+ }
+ }
+ }
+ closedir(dh);
+ }
+ else
+ PrintPrgErr(pmNoOpenDir, Dir);
+ free(statbuf);
+ }
+ }
+ return(Found);
+}
+#endif /* USE_RECURSE */
+
+
+
+/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */
+
+/*
+ * This function should be called first with String being a file pattern.
+ * It should then return the first filename matching that pattern.
+ * Subsequent calls will be made with String = NULL; it should then return
+ * any other filenames that matches the same pattern.
+ * If the first call is made with NULL, you should return NULL.
+ * It may be called more than once with String != NULL, however, you need
+ * only to keep track of the last invocation.
+ *
+ * If a string doesn't match any pattern at all, return the string itself.
+ *
+ * Don't assume that the String passed will live on until the next
+ * invocation, though. strdup() it if you need it after the first time.
+ */
+
+#ifdef AMIGA
+
+STRPTR MatchFileName(STRPTR String)
+{
+ STRPTR Retval = NULL;
+
+ if(AnchorPath || String) /* Is this the first invocation? */
+ {
+ if(V37)
+ {
+ ifn(AnchorPath)
+ {
+ if(AnchorPath = malloc(sizeof(struct AnchorPath) + FMSIZE))
+ {
+ Retval = InitAnchorPath(String);
+ atexit(&KillAnchorPath);
+ }
+ }
+ else
+ {
+ if(String)
+ {
+ MatchEnd(AnchorPath);
+ Retval = InitAnchorPath(String);
+ }
+ else
+ {
+ ifn(MatchNext(AnchorPath))
+ Retval = AnchorPath->ap_Buf;
+ }
+ }
+ }
+ else /* ARP support may be added in the future */
+ Retval = String;
+
+ if(AnchorPath && AnchorPath->ap_FoundBreak)
+ raise(SIGINT);
+ }
+
+ if(!Retval && String)
+ Retval = String;
+
+ return(Retval);
+}
+
+static void KillAnchorPath(void)
+{
+ MatchEnd(AnchorPath);
+}
+
+static STRPTR InitAnchorPath(STRPTR String)
+{
+ STRPTR Retval = NULL;
+
+ AnchorPath->ap_BreakBits = SIGBREAKF_CTRL_C;
+ AnchorPath->ap_Strlen = FMSIZE;
+ AnchorPath->ap_FoundBreak = FALSE;
+ AnchorPath->ap_Flags = 0L;
+
+ ifn(MatchFirst(String, AnchorPath))
+ Retval = AnchorPath->ap_Buf;
+ else
+ PrintPrgErr(pmNoFileMatch, String);
+
+ AnchorPath->ap_Flags &= ~(APF_DODIR);
+ return(Retval);
+}
+
+#else
+STRPTR MatchFileName(STRPTR String)
+{
+ return(String);
+}
+#endif
diff --git a/Build/source/texk/chktex/OpSys.h b/Build/source/texk/chktex/OpSys.h
new file mode 100644
index 00000000000..a7fda5a8e3a
--- /dev/null
+++ b/Build/source/texk/chktex/OpSys.h
@@ -0,0 +1,217 @@
+/*
+ * ChkTeX v1.5, operating system specific code for ChkTeX.
+ * Copyright (C) 1995-96 Jens T. Berger Thielemann
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Contact the author at:
+ * Jens Berger
+ * Spektrumvn. 4
+ * N-0666 Oslo
+ * Norway
+ * E-mail: <jensthi@ifi.uio.no>
+ *
+ *
+ */
+
+#ifndef OPSYS_H
+#define OPSYS_H
+#ifndef CHKTEX_H
+# include "ChkTeX.h"
+#endif /* CHKTEX_H */
+#ifndef UTILITY_H
+# include "Utility.h"
+#endif /* UTILITY_H */
+
+/********************************************************************/
+/**************** START OF USER SETTABLE PREFERENCES ****************/
+
+/*
+ * Note: This file contains most defines you'll wish to change if you
+ * wish to adopt ChkTeX to a new system. It is, as you might notice,
+ * heavily documented. If you wish to get into the internals of ChkTeX,
+ * the interesting stuff is at the bottom of this file, and in the .c
+ * files. However, you should also take a look at the "config.h.in" file
+ * in this directory if you haven't got a shell able to run the "configure"
+ * script.
+ *
+ * This program relies heavily on that the system which
+ * automagically free()'s all malloc()'ed memory, works. The program
+ * itself does not call free() very much. This is because we're doing
+ * lots of tiny allocations, and a properly designed pooling system will
+ * hopefully do a quicker job than we'll be able to do. So there.
+ *
+ * To keep things simple, we trust that the fclose()'ing of fopen()'ed
+ * also happens automagically.
+ *
+ * Please use the getopt included, as we will modify optarg during
+ * command processing.
+ *
+ * You may wish to modify the SetupVars() (OpSys.c) to better suit your
+ * preferences. In any case, it should put the filename (and full path)
+ * of the `.chktexrc' file into the ConfigFile array. The array is sized
+ * BUFSIZ bytes.
+ *
+ * The program does also assume that AMIGA is defined if the source
+ * compiled on an Amiga machine, and that __unix__ is defined if the
+ * source is compiled on a UNIX machine.
+ *
+ */
+
+
+/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */
+
+/*
+ * Here you should define what codes which should be returned to the
+ * shell upon success/failure.
+ *
+ */
+
+#ifndef EXIT_FAILURE
+# ifdef AMIGA
+# define EXIT_FAILURE 20
+# else
+# define EXIT_FAILURE 1
+# endif
+#endif
+
+#ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+#endif
+
+/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */
+
+/*
+ * SLASH should be defined to the character your computer uses to
+ * separate files/directories. Most systems use '/', messydos uses
+ * '\'.
+ *
+ * DIRCHARS should be defined to the characters a directory entry
+ * may end on. On Amigas, this is ":/" (either "FOO:BAR/" or "FOO:"),
+ * Unix uses only "/", while messydos uses ":\\".
+ *
+ * This data will be used to automatically concatenate a directory
+ * path and a filename.
+ *
+ * Adjust both to suit your needs.
+ */
+
+
+#if defined(__unix__) || defined(AMIGA) || defined(WIN32)
+# define SLASH '/'
+#elif defined(__MSDOS__)
+# define SLASH '\\'
+#endif
+
+#if defined(AMIGA)
+# define DIRCHARS ":/"
+#elif defined(__unix__)
+# define DIRCHARS "/"
+#elif defined(__MSDOS__)
+# define DIRCHARS ":\\"
+#elif defined(WIN32)
+#define DIRCHARS ":\\/"
+#endif
+
+/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */
+
+/*
+ * Here, define what key-combination which is used to abort stdin
+ * keyboard input. It should be a string, as we we'll type it out as
+ * information to the user.
+ */
+
+#ifdef AMIGA
+# define STDIN_BREAK "Ctrl-\\"
+#elif defined(__unix__)
+# define STDIN_BREAK "Ctrl-D"
+#elif defined(__MSDOS__)
+# define STDIN_BREAK "Ctrl-Z + Enter"
+#else
+# define STDIN_BREAK "stdin break combination"
+#endif
+
+/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */
+
+/*
+ * For fancy printing of commands, we'll use these strings to turn
+ * on/off the error indication. The codes listed here are ANSI
+ * compatible; if you don't have that type of terminal, you may wish
+ * to adjust this. Use "chktex -v2 Test.tex" to check the effects of
+ * these macros. Note: These strings will be printf()'ed, so watch your
+ * %'s.
+ *
+ * Under UNIX, we'll ignore these values and use termcap instead, where
+ * that is installed.
+ *
+ * If these strings can't be specified statically, you'll have to add
+ * code in the SetupTerm() function.
+ *
+ * PRE_ERROR_STR is of course printed in front of each location we
+ * wish to show as an error, and POST_ERROR_STR after each location.
+ *
+ * The codes #defined here, will switch back- and foreground colours.
+ * We're using '\033[' as escape character, some terminals may like
+ * '\233' better.
+ *
+ */
+
+#ifdef AMIGA
+# define PRE_ERROR_STR "\033[43m\033[32m"
+# define POST_ERROR_STR "\033[0m"
+#else
+# define PRE_ERROR_STR "\033[7m"
+# define POST_ERROR_STR "\033[0m"
+#endif
+
+
+/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */
+
+/*
+ * This macro should contain the appendix for backup files, which
+ * will be appended onto the original filename. It should contain
+ * a leading dot.
+ */
+
+#ifdef __MSDOS__
+# define BAKAPPENDIX ".$cl"
+#else
+# define BAKAPPENDIX ".bak"
+#endif
+
+/***************** END OF USER SETTABLE PREFERENCES *****************/
+/********************************************************************/
+
+#ifndef WORDLIST_DEFINED
+struct WordList;
+#endif
+ /* Sorry; there are now cyclic dependencies in the
+ * source tree. :-/
+ */
+
+extern STRPTR ReverseOn, ReverseOff;
+extern TEXT ConfigFile[BUFSIZ];
+
+STRPTR MatchFileName __PROTO((STRPTR String));
+BOOL SetupVars __PROTO((void));
+void SetupTerm __PROTO((void));
+void AddAppendix __PROTO((STRPTR Name, const STRPTR App));
+void tackon __PROTO((STRPTR, const STRPTR));
+BOOL LocateFile __PROTO((const STRPTR Filename, STRPTR Dest,
+ const STRPTR App, struct WordList *wl));
+
+
+#endif /* OPSYS_H */
+
diff --git a/Build/source/texk/chktex/Resource.c b/Build/source/texk/chktex/Resource.c
new file mode 100644
index 00000000000..9a79ab9f2a3
--- /dev/null
+++ b/Build/source/texk/chktex/Resource.c
@@ -0,0 +1,518 @@
+/*
+ * ChkTeX v1.5, resource file reader.
+ * Copyright (C) 1995-96 Jens T. Berger Thielemann
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Contact the author at:
+ * Jens Berger
+ * Spektrumvn. 4
+ * N-0666 Oslo
+ * Norway
+ * E-mail: <jensthi@ifi.uio.no>
+ *
+ *
+ */
+
+#include "ChkTeX.h"
+#include "OpSys.h"
+#include "Utility.h"
+#include "Resource.h"
+
+#define LNEMPTY(a) struct WordList a = {0, 1, {0}, {0}};
+#define LIST(a) struct WordList a = {0, 0, {0}, {0}};
+#define LCASE(a) LIST(a) LIST(a ## Case)
+#define KEY(a,def) STRPTR a = def;
+
+RESOURCE_INFO
+
+#undef KEY
+#undef LCASE
+#undef LNEMPTY
+#undef LIST
+
+struct KeyWord
+{
+ STRPTR Name;
+ STRPTR *String; /* Keyword = item */
+ struct WordList
+ *List, /* Case-sensitive strings */
+ *CaseList; /* Case-insensitive strings */
+};
+
+#define LNEMPTY LIST
+#define LIST(name) {#name, NULL, &name, NULL},
+#define LCASE(name) {#name, NULL, &name, &name ## Case},
+#define KEY(name,def) {#name, &name, NULL, NULL},
+
+struct KeyWord Keys [] =
+{
+ RESOURCE_INFO
+ {NULL, NULL, NULL, NULL}
+};
+
+#undef KEY
+#undef LCASE
+#undef LNEMPTY
+#undef LIST
+
+
+/***************************** RESOURCE HANDLING **************************/
+
+#define TOKENBITS(name) enum name { \
+ BIT(Eof), /* End-of-file */ \
+ BIT(Open), /* { */ \
+ BIT(Close), /* } */ \
+ BIT(BrOpen), /* [ */ \
+ BIT(BrClose), /* ] */ \
+ BIT(Equal), /* = */ \
+ BIT(Word), /* Keyword */ \
+ BIT(Item) /* List item */ \
+};
+
+#undef BIT
+#define BIT BITDEF1
+TOKENBITS(Token_BIT)
+
+#undef BIT
+#define BIT BITDEF2
+TOKENBITS(Token)
+
+
+static enum Token Expect;
+static ULONG RsrcLine;
+
+static enum Token ReadWord __PROTO((STRPTR, FILE *));
+static TEXT MapChars __PROTO((STRPTR *String));
+
+
+
+/*
+ * Parses the contents of a resource file.
+ *
+ * Format:
+ * Keyword { item1 item2 ... } [ item1 item2 ... ]
+ * Keyword [ item1 item2 ... ] { item1 item2 ... }
+ * Keyword = { item1 item2 ... }
+ * Keyword = [ item1 item2 ... ]
+ * Keyword = item
+ *
+ * Returns whether the attempt was a successful one.
+ */
+
+BOOL ReadRC(const STRPTR Filename)
+{
+ STRPTR String;
+ BOOL Success = FALSE;
+ FILE *fh;
+ enum Token Token;
+ ULONG Counter;
+
+ struct KeyWord *CurWord = NULL;
+
+ /* Interpret incoming words as ... */
+ enum
+ {
+ whList, /* List elements */
+ whCaseList, /* Case insensitive list elements */
+ whEqual, /* Solo elements */
+ whNone /* List items not accepted */
+ } What = whNone;
+
+
+ RsrcLine = 0;
+ Expect = FLG_Word | FLG_Eof;
+
+ if((fh = fopen(Filename, "r")))
+ {
+ Success = TRUE;
+ do
+ {
+ Token = ReadWord(ReadBuffer, fh);
+ ifn(Expect & Token)
+ {
+ switch(Token)
+ {
+ case FLG_Item:
+ String = "item";
+ break;
+ case FLG_Word:
+ String = "word";
+ break;
+ case FLG_Equal:
+ String = "`='";
+ break;
+ case FLG_Open:
+ String = "`{'";
+ break;
+ case FLG_Close:
+ String = "`}'";
+ break;
+ case FLG_BrOpen:
+ String = "`['";
+ break;
+ case FLG_BrClose:
+ String = "`]'";
+ break;
+ case FLG_Eof:
+ String = "EOF";
+ break;
+ }
+ PrintPrgErr(pmFaultFmt, Filename, RsrcLine, String);
+ Success = FALSE;
+ Token = FLG_Eof;
+ }
+
+ switch(Token)
+ {
+ case FLG_Word:
+ for(Counter = 0;
+ Keys[Counter].Name;
+ Counter++)
+ {
+ if(!strcasecmp(ReadBuffer, Keys[Counter].Name))
+ {
+ CurWord = &Keys[Counter];
+ Expect = (CurWord->List? FLG_Open : 0) |
+ (CurWord->CaseList? FLG_BrOpen : 0) |
+ FLG_Equal;
+ break;
+ }
+ }
+ if(!Keys[Counter].Name)
+ {
+ PrintPrgErr(pmKeyWord, ReadBuffer, Filename);
+ Success = FALSE;
+ Token = FLG_Eof;
+ }
+ break;
+ case FLG_Item:
+ switch(What)
+ {
+ case whEqual:
+ ifn(*(CurWord->String) = strdup(ReadBuffer))
+ {
+ PrintPrgErr(pmStrDupErr);
+ Token = FLG_Eof;
+ Success = FALSE;
+ }
+
+ What = whNone;
+ Expect = FLG_Word | FLG_Eof;
+ break;
+ case whCaseList:
+ if(!InsertWord(ReadBuffer, CurWord->CaseList))
+ {
+ Token = FLG_Eof;
+ Success = FALSE;
+ }
+ break;
+ case whList:
+ if(!InsertWord(ReadBuffer, CurWord->List))
+ {
+ Token = FLG_Eof;
+ Success = FALSE;
+ }
+ break;
+ case whNone:
+ PrintPrgErr(pmAssert);
+ }
+ break;
+ case FLG_Equal:
+ What = whEqual;
+ Expect = (CurWord->List? FLG_Open : 0) |
+ (CurWord->CaseList? FLG_BrOpen : 0) |
+ (CurWord->String? FLG_Item : 0);
+ break;
+ case FLG_BrOpen:
+ if(What == whEqual)
+ ClearWord(CurWord->CaseList);
+ What = whCaseList;
+ Expect = FLG_Item | FLG_BrClose;
+ break;
+ case FLG_Open:
+ if(What == whEqual)
+ ClearWord(CurWord->List);
+ What = whList;
+ Expect = FLG_Item | FLG_Close;
+ break;
+ case FLG_BrClose:
+ case FLG_Close:
+ Expect = (CurWord->List? FLG_Open : 0) |
+ (CurWord->CaseList? FLG_BrOpen : 0) |
+ FLG_Equal | FLG_Word | FLG_Eof;
+ What = whNone;
+ break;
+ case FLG_Eof:
+ break;
+ }
+ } while(Token != FLG_Eof);
+
+ fclose(fh);
+ }
+ else
+ PrintPrgErr(pmRsrcOpen, Filename);
+
+ return(Success);
+}
+
+/*
+ * Reads a token from the `.chktexrc' file; if the token is
+ * FLG_Item or FLG_Word, Buffer will contain the plaintext of the
+ * token. If not, the contents are undefined.
+ */
+
+static enum Token ReadWord(STRPTR Buffer, FILE *fh)
+{
+ static
+ STRPTR String = NULL;
+ static
+ TEXT StatBuf[BUFSIZ];
+ enum Token Retval = FLG_Eof;
+
+ UWORD Chr;
+
+ STRPTR Ptr;
+ BOOL OnceMore = TRUE, Cont = TRUE;
+
+ if(Buffer)
+ {
+ do
+ {
+ if(!(String && *String))
+ {
+ if(fgets(StatBuf, BUFSIZ-1, fh))
+ String = strip(StatBuf, STRP_RGT);
+ RsrcLine++;
+ }
+
+ Ptr = Buffer;
+ if(String && (String = strip(String, STRP_LFT)))
+ {
+ switch(Chr = *String)
+ {
+ case 0:
+ case CMNT:
+ String = NULL;
+ break;
+ case QUOTE: /* Quoted argument */
+ Cont = TRUE;
+ String++;
+
+ while(Cont)
+ {
+ switch(Chr = *String++)
+ {
+ case 0:
+ case QUOTE:
+ Cont = FALSE;
+ break;
+ case ESCAPE:
+ ifn(Chr = MapChars(&String))
+ break;
+
+ /* FALLTHRU */
+ default:
+ *Ptr++ = Chr;
+ }
+ }
+ *Ptr = 0;
+ Retval = FLG_Item;
+ OnceMore = FALSE;
+ break;
+
+#define DONEKEY (FLG_Open | FLG_Equal | FLG_BrOpen)
+#define DONELIST (FLG_Close | FLG_BrClose)
+#define TOKEN(c, ctxt, tk) case c: if(Expect & (ctxt)) Retval = tk; LAST(token);
+
+ LOOP(token,
+ TOKEN('{', DONEKEY, FLG_Open);
+ TOKEN('[', DONEKEY, FLG_BrOpen);
+ TOKEN('=', DONEKEY, FLG_Equal);
+ TOKEN(']', DONELIST, FLG_BrClose);
+ TOKEN('}', DONELIST, FLG_Close);
+ )
+
+ if(Retval != FLG_Eof)
+ {
+ OnceMore = FALSE;
+ String++;
+ break;
+ }
+
+ /* FALLTHRU */
+
+ default: /* Non-quoted argument */
+ OnceMore = FALSE;
+ if(Expect & FLG_Word)
+ {
+ while(Cont)
+ {
+ Chr = *String++;
+ if(isalpha(Chr))
+ *Ptr++ = Chr;
+ else
+ Cont = FALSE;
+ }
+ String--;
+ Retval = FLG_Word;
+ }
+ else /* Expect & FLG_Item */
+ {
+ while(Cont)
+ {
+ switch(Chr = *String++)
+ {
+ case CMNT:
+ case 0:
+ String = NULL;
+ Cont = FALSE;
+ break;
+ case ESCAPE:
+ ifn(Chr = MapChars(&String))
+ break;
+
+ *Ptr++ = Chr;
+ break;
+ default:
+ if(!isspace(Chr))
+ *Ptr++ = Chr;
+ else
+ Cont = FALSE;
+ }
+ }
+ Retval = FLG_Item;
+ }
+
+ ifn(Buffer[0])
+ {
+ PrintPrgErr(pmEmptyToken);
+ if(*String)
+ String++;
+ }
+ *Ptr = 0;
+ break;
+ }
+ }
+ else
+ OnceMore = FALSE;
+ } while(OnceMore);
+ }
+ return(Retval);
+}
+
+
+
+/*
+ * Translates escape codes. Give it a pointer to the char after the
+ * escape char, and we'll return what it maps to.
+ */
+
+#define MAP(a,b) case a: Tmp = b; break;
+
+static TEXT MapChars(STRPTR *String)
+{
+ int Chr, Tmp = 0;
+ UWORD Cnt;
+
+ Chr = *((STRPTR) (*String)++);
+
+ switch(tolower(Chr))
+ {
+ MAP(QUOTE, QUOTE);
+ MAP(ESCAPE, ESCAPE);
+ MAP(CMNT, CMNT);
+ MAP('n', '\n');
+ MAP('r', '\r');
+ MAP('b', '\b');
+ MAP('t', '\t');
+ MAP('f', '\f');
+ MAP('{', '{');
+ MAP('}', '}');
+ MAP('[', '[');
+ MAP(']', ']');
+ MAP('=', '=');
+ MAP(' ', ' ');
+ case 'x':
+ Tmp = 0;
+
+ for(Cnt = 0; Cnt < 2; Cnt++)
+ {
+ Chr = *((*String)++);
+ if(isxdigit(Chr))
+ {
+ Chr = toupper(Chr);
+ Tmp = (Tmp<<4) + Chr;
+
+ if(isdigit(Chr))
+ Tmp -= '0';
+ else
+ Tmp -= 'A' - 10;
+ }
+ else
+ {
+ if(Chr)
+ {
+ PrintPrgErr(pmNotPSDigit, Chr, "hex");
+ Tmp = 0;
+ }
+ break;
+ }
+ }
+ break;
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7':
+
+ Tmp = Chr - '0';
+
+ for(Cnt = 0; Cnt < 2; Cnt++)
+ {
+ Chr = *((*String)++);
+ if(within('0',Chr,'7'))
+ Tmp = (Tmp * 8) + Chr - '0';
+ else
+ {
+ if(Chr)
+ {
+ PrintPrgErr(pmNotPSDigit, Chr, "octal");
+ Tmp = 0;
+ }
+ break;
+ }
+ }
+ break;
+ case 'd':
+ for(Cnt = 0; Cnt < 3; Cnt++)
+ {
+ if(isdigit(Chr = *((*String)++)))
+ Tmp = (Tmp * 10) + Chr - '0';
+ else
+ {
+ if(Chr)
+ {
+ PrintPrgErr(pmNotPSDigit, Chr, "");
+ Tmp = 0;
+ }
+ break;
+ }
+ }
+ break;
+ default:
+ PrintPrgErr(pmEscCode, ESCAPE, Chr);
+ }
+ return(Tmp);
+}
+
+
diff --git a/Build/source/texk/chktex/Resource.h b/Build/source/texk/chktex/Resource.h
new file mode 100644
index 00000000000..f0e7b9b58e8
--- /dev/null
+++ b/Build/source/texk/chktex/Resource.h
@@ -0,0 +1,64 @@
+/*
+ * ChkTeX v1.5, resource file reader.
+ * Copyright (C) 1995-96 Jens T. Berger Thielemann
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Contact the author at:
+ * Jens Berger
+ * Spektrumvn. 4
+ * N-0666 Oslo
+ * Norway
+ * E-mail: <jensthi@ifi.uio.no>
+ *
+ *
+ */
+
+#ifndef RESOURCE_H
+#define RESOURCE_H
+#ifndef CHKTEX_H
+# include "ChkTeX.h"
+#endif /* CHKTEX_H */
+
+#define QUOTE '\"' /* Char used to quote text containing blanks */
+#define ESCAPE '!' /* Char used to access special characters */
+#define CMNT '#' /* Char used as comment */
+
+#define RESOURCE_INFO \
+ LIST(Silent) LIST(Linker) LIST(IJAccent) LIST(Italic)\
+ LIST(ItalCmd) LIST(PostLink) LIST(WipeArg) LIST(VerbEnvir)\
+ LIST(MathEnvir) LIST(MathRoman) LIST(HyphDash) LIST(NumDash)\
+ LIST(WordDash) LIST(CenterDots) LIST(LowDots) LIST(OutFormat)\
+ LIST(Primitives) LIST(NotPreSpaced) LIST(NonItalic) LIST(NoCharNext)\
+ LNEMPTY(CmdLine) LNEMPTY(TeXInputs)\
+ LCASE(Abbrev) LCASE(UserWarn)\
+ KEY(VerbClear, "|") KEY(QuoteStyle, "Traditional") KEY(TabSize, "8")
+
+#define LIST(a) extern struct WordList a;
+#define LNEMPTY LIST
+#define LCASE(a) LIST(a) LIST(a ## Case)
+#define KEY(a,def) extern STRPTR a;
+
+RESOURCE_INFO
+
+#undef KEY
+#undef LCASE
+#undef LNEMPTY
+#undef LIST
+
+BOOL ReadRC __PROTO((STRPTR const));
+
+
+#endif /* RESOURCE */
diff --git a/Build/source/texk/chktex/Test.out b/Build/source/texk/chktex/Test.out
new file mode 100644
index 00000000000..5d7b70d8ba9
--- /dev/null
+++ b/Build/source/texk/chktex/Test.out
@@ -0,0 +1,408 @@
+Message 30 in Test.tex line 2: Multiple spaces detected in input.
+ o To test the program upon it
+ ^^^
+Message 30 in Test.tex line 3: Multiple spaces detected in input.
+ o To show off some of the features
+ ^^^
+Message 22 in Test.tex line 8: Comment displayed.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+^
+Message 22 in Test.tex line 10: Comment displayed.
+% Warning 1
+^
+Message 1 in Test.tex line 12: Command terminated with space.
+\foo This is an error.
+ ^
+Message 22 in Test.tex line 15: Comment displayed.
+% Warning 2
+^
+Message 2 in Test.tex line 17: Non-breaking space (`~') should have been used.
+This is a faulty reference to \ref{foo}
+ ^
+Message 22 in Test.tex line 20: Comment displayed.
+% Warning 3
+^
+Message 3 in Test.tex line 22: You should enclose the previous parenthesis with `{}'.
+$[(ab)^{-1}]^{-2}$ is not beautiful
+ ^
+Message 3 in Test.tex line 22: You should enclose the previous parenthesis with `{}'.
+$[(ab)^{-1}]^{-2}$ is not beautiful
+ ^
+Message 30 in Test.tex line 22: Multiple spaces detected in input.
+$[(ab)^{-1}]^{-2}$ is not beautiful
+ ^^
+Message 22 in Test.tex line 25: Comment displayed.
+% Warning 4-6, 28
+^
+Message 6 in Test.tex line 27: No italic correction (`\/') found.
+Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}.
+ ^
+Message 42 in Test.tex line 27: You should remove spaces in front of `\/'
+Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}.
+ ^
+Message 4 in Test.tex line 27: Italic correction (`\/') found in non-italic buffer.
+Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}.
+ ^^
+Message 28 in Test.tex line 27: Don't use \/ in front of small punctuation.
+Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}.
+ ^^
+Message 42 in Test.tex line 27: You should remove spaces in front of `\/'
+Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}.
+ ^
+Message 5 in Test.tex line 27: Italic correction (`\/') found more than once.
+Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}.
+ ^^
+Message 22 in Test.tex line 30: Comment displayed.
+% LaTeX2e
+^
+Message 42 in Test.tex line 32: You should remove spaces in front of `\/'
+Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}.
+ ^
+Message 4 in Test.tex line 32: Italic correction (`\/') found in non-italic buffer.
+Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}.
+ ^^
+Message 28 in Test.tex line 32: Don't use \/ in front of small punctuation.
+Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}.
+ ^^
+Message 42 in Test.tex line 32: You should remove spaces in front of `\/'
+Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}.
+ ^
+Message 4 in Test.tex line 32: Italic correction (`\/') found in non-italic buffer.
+Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}.
+ ^^
+Message 4 in Test.tex line 32: Italic correction (`\/') found in non-italic buffer.
+Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}.
+ ^^
+Message 4 in Test.tex line 33: Italic correction (`\/') found in non-italic buffer.
+Testing \textem{italic\/} in this \textit{sentence}, as \textem{you see}.
+ ^^
+Message 22 in Test.tex line 35: Comment displayed.
+% Warning 7
+^
+Message 7 in Test.tex line 37: Accent command `\'' needs use of `\i'.
+This \'is a test of $\hat{j}$ accents.
+ ^^
+Message 7 in Test.tex line 37: Accent command `\hat' needs use of `\jmath'.
+This \'is a test of $\hat{j}$ accents.
+ ^^^^
+Message 22 in Test.tex line 40: Comment displayed.
+% Warning 8
+^
+Message 8 in Test.tex line 42: Wrong length of dash may have been used.
+It wasn't anything - just a 2---3 star--shots.
+ ^
+Message 8 in Test.tex line 42: Wrong length of dash may have been used.
+It wasn't anything - just a 2---3 star--shots.
+ ^^^
+Message 8 in Test.tex line 42: Wrong length of dash may have been used.
+It wasn't anything - just a 2---3 star--shots.
+ ^^
+Message 22 in Test.tex line 45: Comment displayed.
+% Warning 9-10
+^
+Message 22 in Test.tex line 47: Comment displayed.
+% Brackets:
+^
+Message 10 in Test.tex line 49: Solo `)' found.
+)}{[])} }}}]]])))
+^
+Message 10 in Test.tex line 49: Solo `}' found.
+)}{[])} }}}]]])))
+ ^
+Message 9 in Test.tex line 49: `}' expected, found `)'.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex line 49: Solo `}' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex line 49: Solo `}' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex line 49: Solo `}' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex line 49: Solo `}' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex line 49: Solo `]' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex line 49: Solo `]' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex line 49: Solo `]' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex line 49: Solo `)' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex line 49: Solo `)' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex line 49: Solo `)' found.
+)}{[])} }}}]]])))
+ ^
+Message 22 in Test.tex line 52: Comment displayed.
+% Envs:
+^
+Message 9 in Test.tex line 54: `baz' expected, found `quux'.
+\begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo}
+ ^^^^
+Message 9 in Test.tex line 54: `quux' expected, found `baz'.
+\begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo}
+ ^^^^
+Message 10 in Test.tex line 54: Solo `asoi' found.
+\begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo}
+ ^^^^
+Message 22 in Test.tex line 58: Comment displayed.
+% Warning 11
+^
+Message 11 in Test.tex line 60: You should use \ldots to achieve an ellipsis.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^
+Message 11 in Test.tex line 60: You should use \ldots to achieve an ellipsis.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^
+Message 11 in Test.tex line 60: You should use \cdots to achieve an ellipsis.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^
+Message 11 in Test.tex line 60: You should use \ldots to achieve an ellipsis.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^^^^
+Message 11 in Test.tex line 60: You should use \cdots to achieve an ellipsis.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^^^^
+Message 22 in Test.tex line 63: Comment displayed.
+% Warning 12
+^
+Message 12 in Test.tex line 65: Interword spacing (`\ ') should perhaps be used.
+1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar
+ ^
+Message 12 in Test.tex line 65: Interword spacing (`\ ') should perhaps be used.
+1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar
+ ^
+Message 12 in Test.tex line 65: Interword spacing (`\ ') should perhaps be used.
+1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar
+ ^
+Message 22 in Test.tex line 68: Comment displayed.
+% Warning 13
+^
+Message 13 in Test.tex line 70: Intersentence spacing (`\@') should perhaps be used.
+Look at THIS! It's an error.
+ ^
+Message 22 in Test.tex line 73: Comment displayed.
+% Warning 14
+^
+Message 1 in Test.tex line 75: Command terminated with space.
+\hat
+ ^
+Message 14 in Test.tex line 75: Could not find argument for command.
+\hat
+^^^^
+Message 22 in Test.tex line 78: Comment displayed.
+% Warning 18,19
+^
+Message 18 in Test.tex line 80: Use either `` or '' as an alternative to `"'.
+Is this an "example", or is it an ´example´.
+ ^
+Message 18 in Test.tex line 80: Use either `` or '' as an alternative to `"'.
+Is this an "example", or is it an ´example´.
+ ^
+Message 19 in Test.tex line 80: Use "'" (ASCII 39) instead of "´" (ASCII 180).
+Is this an "example", or is it an ´example´.
+ ^
+Message 19 in Test.tex line 80: Use "'" (ASCII 39) instead of "´" (ASCII 180).
+Is this an "example", or is it an ´example´.
+ ^
+Message 22 in Test.tex line 83: Comment displayed.
+% Warning 20
+^
+Message 20 in Test.tex line 85: User-specified pattern found.
+That bug is \unknown\ to me.
+ ^^^^^^^^
+Message 22 in Test.tex line 87: Comment displayed.
+% Warning 21
+^
+Message 21 in Test.tex line 89: This command might not be intended.
+\LaTeX\ is an extension of \TeX\. Right?
+ ^^
+Message 22 in Test.tex line 92: Comment displayed.
+% Warning 23
+^
+Message 23 in Test.tex line 94: Either `\,`` or ``\,` will look better.
+```Hello', I heard him said'', she remembered.
+^^^
+Message 22 in Test.tex line 97: Comment displayed.
+% Warning 24
+^
+Message 24 in Test.tex line 99: Delete this space to maintain correct pagereferences.
+Indexing text \index{text} is fun!
+ ^
+Message 22 in Test.tex line 102: Comment displayed.
+% Warning 25
+^
+Message 25 in Test.tex line 104: You might wish to put this between a pair of `{}'
+$5\cdot10^10$
+ ^^
+Message 22 in Test.tex line 107: Comment displayed.
+% Warning 26
+^
+Message 26 in Test.tex line 109: You ought to remove spaces in front of punctuation.
+Do you understand ?
+ ^
+Message 22 in Test.tex line 112: Comment displayed.
+% Warning 27
+^
+Message 1 in input.tex line 1: Command terminated with space.
+\this is a test of whether the file is actually inputted...
+ ^
+Message 11 in input.tex line 1: You should use \ldots to achieve an ellipsis.
+\this is a test of whether the file is actually inputted...
+ ^^^
+Message 1 in input.tex line 1: Command terminated with space.
+\this is a test of whether the file is actually inputted...
+ ^
+Message 11 in input.tex line 1: You should use \ldots to achieve an ellipsis.
+\this is a test of whether the file is actually inputted...
+ ^^^
+Message 22 in Test.tex line 117: Comment displayed.
+% Warning 29
+^
+Message 29 in Test.tex line 118: $\times$ may look prettier here.
+The program opens a screen sized 640x200 pixels
+ ^
+Message 22 in Test.tex line 121: Comment displayed.
+% Warning 30
+^
+Message 30 in Test.tex line 123: Multiple spaces detected in input.
+White is a beautiful colour.
+ ^^^^^^^^^^^
+Message 22 in Test.tex line 126: Comment displayed.
+% Warning 31
+^
+Message 31 in Test.tex line 129: This text may be ignored.
+\end{verbatim} foo bar
+ ^^^^^^^
+Message 22 in Test.tex line 131: Comment displayed.
+% Warning 32-34
+^
+Message 32 in Test.tex line 133: Use ` to begin quotation, not '.
+This is either an 'example`, an ''example`` or an `"`example'`'.
+ ^
+Message 33 in Test.tex line 133: Use ' to end quotation, not `.
+This is either an 'example`, an ''example`` or an `"`example'`'.
+ ^
+Message 32 in Test.tex line 133: Use ` to begin quotation, not '.
+This is either an 'example`, an ''example`` or an `"`example'`'.
+ ^^
+Message 33 in Test.tex line 133: Use ' to end quotation, not `.
+This is either an 'example`, an ''example`` or an `"`example'`'.
+ ^^
+Message 34 in Test.tex line 133: Don't mix quotes.
+This is either an 'example`, an ''example`` or an `"`example'`'.
+ ^^^
+Message 34 in Test.tex line 133: Don't mix quotes.
+This is either an 'example`, an ''example`` or an `"`example'`'.
+ ^^^
+Message 22 in Test.tex line 136: Comment displayed.
+% Warning 35
+^
+Message 35 in Test.tex line 138: You should perhaps use `\sin' instead.
+$sin^2 + cos^2 = 1$
+ ^^^
+Message 35 in Test.tex line 138: You should perhaps use `\cos' instead.
+$sin^2 + cos^2 = 1$
+ ^^^
+Message 22 in Test.tex line 141: Comment displayed.
+% Warning 36-37
+^
+Message 36 in Test.tex line 143: You should put a space in front of parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 37 in Test.tex line 143: You should avoid spaces after parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 36 in Test.tex line 143: You should put a space in front of parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 37 in Test.tex line 143: You should avoid spaces after parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 37 in Test.tex line 143: You should avoid spaces in front of parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 36 in Test.tex line 143: You should put a space in front of parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 37 in Test.tex line 143: You should avoid spaces after parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 37 in Test.tex line 143: You should avoid spaces in front of parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 36 in Test.tex line 143: You should put a space after parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 22 in Test.tex line 146: Comment displayed.
+% Warning 38
+^
+Message 38 in Test.tex line 147: You should not use punctuation in front of quotes.
+``An example,'' he said, ``would be great.''
+ ^
+Message 38 in Test.tex line 147: You should not use punctuation in front of quotes.
+``An example,'' he said, ``would be great.''
+ ^
+Message 22 in Test.tex line 150: Comment displayed.
+% Warning 39
+^
+Message 39 in Test.tex line 152: Double space found.
+For output codes, see table ~\ref{tab:fmtout}.
+ ^
+Message 22 in Test.tex line 155: Comment displayed.
+% Warning 40
+^
+Message 40 in Test.tex line 156: You should put punctuation outside inner math mode.
+$\this,$ and $$this$$.
+ ^
+Message 40 in Test.tex line 156: You should put punctuation inside display math mode.
+$\this,$ and $$this$$.
+ ^
+Message 22 in Test.tex line 159: Comment displayed.
+% Warning 41
+^
+Message 1 in Test.tex line 160: Command terminated with space.
+foo \above qux
+ ^
+Message 41 in Test.tex line 160: You ought to not use primitive TeX in LaTeX code.
+foo \above qux
+ ^^^^^^
+Message 22 in Test.tex line 163: Comment displayed.
+% Warning 42
+^
+Message 42 in Test.tex line 164: You should remove spaces in front of `\footnote'
+This is a footnote \footnote{foo}.
+ ^
+Message 22 in Test.tex line 168: Comment displayed.
+% Verb check
+^
+Message 14 in Test.tex line 171: Could not find argument for command.
+\verb#
+^^^^^
+Message 31 in Test.tex line 175: This text may be ignored.
+\end{verbatim} FOO
+ ^^^
+Message 22 in Test.tex line 177: Comment displayed.
+% Warning 16,15
+^
+Message 16 in Test.tex line 181: Mathmode still on at end of LaTeX file.
+
+
+Message 17 in Test.tex line 181: Number of `(' doesn't match the number of `)'!
+
+
+Message 17 in Test.tex line 181: Number of `[' doesn't match the number of `]'!
+
+
+Message 17 in Test.tex line 181: Number of `{' doesn't match the number of `}'!
+
+
diff --git a/Build/source/texk/chktex/Test.tex b/Build/source/texk/chktex/Test.tex
new file mode 100644
index 00000000000..65067b75f16
--- /dev/null
+++ b/Build/source/texk/chktex/Test.tex
@@ -0,0 +1,181 @@
+Note: This file was written with only two purposes in mind:
+ o To test the program upon it
+ o To show off some of the features
+
+Most of the file does thus consist of lots of pseudo-commands, which
+are nonsense in a TeXnical manner.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Warning 1
+
+\foo This is an error.
+\smallskip This is a not. $\foo Neither$ is this.
+
+% Warning 2
+
+This is a faulty reference to \ref{foo}
+This is not a faulty reference to~\ref{foo}
+
+% Warning 3
+
+$[(ab)^{-1}]^{-2}$ is not beautiful
+${{[{(ab)}^{-1}]}}^{-2}$ is beautiful
+
+% Warning 4-6, 28
+
+Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}.
+Testing {\it italic\/} in this {\em sentence}, as {\em you see}.
+
+% LaTeX2e
+
+Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}.
+Testing \textem{italic\/} in this \textit{sentence}, as \textem{you see}.
+
+% Warning 7
+
+This \'is a test of $\hat{j}$ accents.
+This \'{\i}s a test of $\hat{\jmath}$ accents.
+
+% Warning 8
+
+It wasn't anything - just a 2---3 star--shots.
+It wasn't anything --- just a 2--3 star-shots.
+
+% Warning 9-10
+
+% Brackets:
+
+)}{[])} }}}]]])))
+{[]} ((([[[{{{}}}]]])))
+
+% Envs:
+
+\begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo}
+
+\begin{foo} \begin{bar} \end{bar}\end{foo}
+
+% Warning 11
+
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$.
+
+% Warning 12
+
+1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar
+1st.\ foo Inc.\ ab.cd.\ foo ab.cd.\ Foo.\ bar
+
+% Warning 13
+
+Look at THIS! It's an error.
+Look at THIS\@! It's an error. D. E. Knuth.
+
+% Warning 14
+
+\hat
+\hat{a}
+
+% Warning 18,19
+
+Is this an "example", or is it an ´example´.
+Is this an `example', or is it an `example'.
+
+% Warning 20
+
+That bug is \unknown\ to me.
+
+% Warning 21
+
+\LaTeX\ is an extension of \TeX\. Right?
+\LaTeX\ is an extension of \TeX. Right?
+
+% Warning 23
+
+```Hello', I heard him said'', she remembered.
+``\,`Hello', I heard him said'', she remembered.
+
+% Warning 24
+
+Indexing text \index{text} is fun!
+Indexing text\index{text} is fun!
+
+% Warning 25
+
+$5\cdot10^10$
+$5\cdot10^{10}$
+
+% Warning 26
+
+Do you understand ?
+Do you understand?
+
+% Warning 27
+
+\input input.tex
+\input input
+
+% Warning 29
+The program opens a screen sized 640x200 pixels
+The program opens a screen sized $640\times200$ pixels
+
+% Warning 30
+
+White is a beautiful colour.
+White is a beautiful colour.
+
+% Warning 31
+\begin{verbatim}
+\this is
+\end{verbatim} foo bar
+
+% Warning 32-34
+
+This is either an 'example`, an ''example`` or an `"`example'`'.
+This is either an `example', an ``example'' or an ``example''.
+
+% Warning 35
+
+$sin^2 + cos^2 = 1$
+$\sin^2 + \cos^2 = 1$
+
+% Warning 36-37
+
+This( an example( Nuff said )), illustrates( ``my'' )point.
+This (an example (Nuff said)), illustrates (``my'') point.
+
+% Warning 38
+``An example,'' he said, ``would be great.''
+``An example'', he said, ``would be great''.
+
+% Warning 39
+
+For output codes, see table ~\ref{tab:fmtout}.
+For output codes, see table~\ref{tab:fmtout}.
+
+% Warning 40
+$\this,$ and $$this$$.
+$\this$, and $$this.$$
+
+% Warning 41
+foo \above qux
+\frac{foo}{qux}
+
+% Warning 42
+This is a footnote \footnote{foo}.
+This is a footnote\footnote{foo}.
+
+
+% Verb check
+
+\verb@\this is )() lots of errors, etc. Or what?@
+\verb#
+
+\begin{verbatim}
+\this is
+\end{verbatim} FOO
+
+% Warning 16,15
+
+$$(
+
+
diff --git a/Build/source/texk/chktex/Utility.c b/Build/source/texk/chktex/Utility.c
new file mode 100644
index 00000000000..e5428593b5b
--- /dev/null
+++ b/Build/source/texk/chktex/Utility.c
@@ -0,0 +1,937 @@
+/*
+ * ChkTeX v1.5, utility functions.
+ * Copyright (C) 1995-96 Jens T. Berger Thielemann
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Contact the author at:
+ * Jens Berger
+ * Spektrumvn. 4
+ * N-0666 Oslo
+ * Norway
+ * E-mail: <jensthi@ifi.uio.no>
+ *
+ *
+ */
+
+#include "ChkTeX.h"
+#include "Utility.h"
+#include "Resource.h"
+#include "OpSys.h"
+
+#ifdef ASM_HASHWORD
+extern UWORD HashWord(STRPTR a);
+typedef UWORD HASH_TYPE;
+#else
+typedef ULONG HASH_TYPE;
+#endif
+
+/***************************** SUPPORT FUNCTIONS ************************/
+
+
+/*
+ * Copies a string with a maximum length of `len' starting at `pos' in
+ * `source' into `dest'.
+ * Returns -1 if the pos value is beyond the length of the source value,
+ * else NULL.
+ */
+
+
+WORD substring(const STRPTR source, STRPTR dest, ULONG pos, LONG len)
+{
+ STRPTR Start;
+ WORD Retval = -1;
+
+ if(len >= 0)
+ {
+ if(strlen(source) > pos)
+ {
+ Start = &source[pos];
+
+ while((len-- > 0) && (*dest++ = *Start++))
+ ;
+
+ if(len == -1)
+ Retval = 0;
+ }
+ }
+ else
+ Retval = 0L;
+
+ *dest = 0;
+
+ return(Retval);
+}
+
+
+/*
+ * Determine whether a file exists.
+ *
+ */
+
+
+BOOL fexists(const STRPTR Filename)
+{
+ BOOL Retval;
+
+#if defined(F_OK) && defined(R_OK) && defined(HAVE_ACCESS)
+ Retval = access(Filename, F_OK|R_OK) == 0;
+#else
+ FILE *fh;
+
+ if(fh = fopen(Filename, "r"))
+ {
+ Retval = TRUE;
+ fclose(fh);
+ }
+ else
+ Retval = FALSE;
+#endif
+ return(Retval);
+}
+
+
+
+/*
+ * 'Safe' memset() replacement.
+ * Just tries to check the parameters, so that the risk of killing
+ * innocent memory is lowered.
+ * Please note that the `n' parameter now is an signed longword, not
+ * an size_t. Won't permit that `n' exceeds BUFLEN, nor negative sizes.
+ * Returns `to' if some memset()'ing was done, NULL if not.
+ */
+
+APTR sfmemset(APTR to, int c, LONG n)
+{
+ if(to && (n > 0))
+ {
+ n = min(n, BUFSIZ);
+
+ return(memset(to, c, (size_t) n));
+ }
+ return(NULL);
+}
+
+
+/*
+ * Quick replace function
+ * Replaces every occurrence of a character in a string with another one.
+ */
+
+void strrep(STRPTR String, /* String to replace within. */
+ const TEXT From, /* Character to search for. */
+ const TEXT To) /* Character to put instead. */
+{
+ register int c;
+ while((c = *String++))
+ {
+ if(c == From)
+ String[-1] = To;
+ }
+}
+
+/*
+ * Replaces every char not in Prot with To in Buf
+ */
+
+void strxrep(STRPTR Buf,
+ const STRPTR Prot,
+ const TEXT To)
+{
+ int c;
+
+ while((c = *Buf))
+ {
+ if(!strchr(Prot, c))
+ *Buf = To;
+ Buf++;
+ }
+}
+
+/*
+ * Strips tail and/or front of a string
+ * Kills trailing/leading spaces. The macro/function LATEX_SPACE(char c)
+ * is used to decide whether a space should be skipped. This function
+ * should return TRUE if the character should be skipped, FALSE if not.
+ * Returns the string which was passed onto it.
+ */
+
+
+STRPTR strip(STRPTR str, /* String to strip */
+ const enum Strip flags)
+ /* One of the following: */
+ /* STRP_LFT - Strips leading blanks */
+ /* STRP_RGT - Strips trailing blanks */
+ /* STRP_BTH - Strips on both sides */
+{
+ STRPTR bufptr = str, nlptr;
+ TEXT c;
+
+ if(bufptr && (c = *bufptr))
+ {
+ if(flags & STRP_LFT)
+ {
+ if(LATEX_SPACE(c) && c)
+ {
+ do
+ {
+ c = *++bufptr;
+ } while(LATEX_SPACE(c) && c);
+ }
+ }
+
+ if(flags & STRP_RGT)
+ {
+ if(c && *bufptr)
+ {
+ nlptr = bufptr;
+
+ while(*++nlptr);
+
+ do
+ {
+ *nlptr = 0;
+ c = *--nlptr;
+ } while(LATEX_SPACE(c) && c && (nlptr > bufptr));
+
+ }
+ else
+ *bufptr = 0;
+ }
+ }
+ return(bufptr);
+}
+
+
+/*
+ * Converts all the chars in the string passed into lowercase.
+ */
+
+#ifndef HAVE_STRLWR
+STRPTR strlwr(STRPTR String)
+{
+ STRPTR Bufptr;
+ TEXT TmpC;
+
+ for(Bufptr = String;
+ (TmpC = *Bufptr);
+ Bufptr++)
+ *Bufptr = tolower(TmpC);
+
+ return(String);
+}
+#endif
+
+/*
+ * Returns a duplicate of the string passed.
+ */
+
+#ifndef HAVE_STRDUP
+STRPTR strdup(const STRPTR String)
+{
+ STRPTR Retval = NULL;
+ size_t Len;
+
+ if(String)
+ {
+ Len = strlen(String) + 1;
+ if((Retval = malloc(Len)))
+ memcpy(Retval, String, Len);
+ }
+
+ return(Retval);
+}
+#endif
+
+/*
+ * Does the same as strdup, but adds a zero-filled padding, length extra bytes.
+ */
+
+STRPTR strdupx(const STRPTR String, int Extra)
+{
+ STRPTR Retval = NULL;
+ size_t Len;
+
+ if(String)
+ {
+ Len = strlen(String) + 1 + Extra;
+ if((Retval = malloc(Len)))
+ strncpy(Retval, String, Len);
+ }
+
+ return(Retval);
+}
+
+/*
+ * Case-insensitive comparison of two strings.
+ */
+
+#ifndef HAVE_STRCASECMP
+int strcasecmp(const char* a, const char *b)
+{
+ int aa, bb;
+
+ do
+ {
+ aa = *a++;
+ bb = *b++;
+ } while(aa && (tolower(aa) == tolower(bb)));
+ /* bb != 0 is implicit */
+
+ return(tolower(aa) - tolower(bb));
+}
+#endif
+
+/*
+ * Not all reallocs are intelligent enough to handle NULL's as
+ * parameters. This fixes this.
+ */
+
+void *saferealloc(void *b, size_t n)
+{
+ APTR Retval = NULL;
+
+ if(b)
+ {
+ if(n)
+ Retval = realloc(b, n);
+ else
+ free(b);
+ }
+ else
+ Retval = malloc(n);
+
+ return(Retval);
+}
+
+/*
+ * Repeatedly writes the From string over To so that we overwrite Len bytes.
+ * Does nothing if passed empty/NULL string.
+ */
+
+void strwrite (STRPTR To, const STRPTR From, ULONG Len)
+{
+ ULONG i, j;
+ ULONG FromLen = strlen(From);
+
+ Len = min(Len, BUFSIZ);
+
+ if(To && From)
+ {
+ switch(FromLen)
+ {
+ case 0:
+ break;
+ case 1:
+ memset(To, *From, Len);
+ break;
+ default:
+ for(i = j = 0;
+ i < Len;
+ i++, j++)
+ {
+ if(j >= FromLen)
+ j = 0;
+ To[i] = From[j];
+ }
+ }
+ }
+}
+
+/*
+ * Checks whether Cmp comes after Str.
+ *
+ */
+
+int strafter(const STRPTR Str, const STRPTR Cmp)
+{
+ return(strncmp(Str, Cmp, strlen(Cmp)));
+}
+
+/*
+ * Checks whether Cmp comes before Str. Returns 0 if so, non-zero if not.
+ *
+ */
+
+int strinfront(STRPTR Str, STRPTR Cmp)
+{
+ int CmpLen;
+
+ if((CmpLen = strlen(Cmp)))
+ {
+ Cmp += CmpLen;
+ Str++;
+
+ while((*--Cmp == *--Str) && (--CmpLen > 0))
+ ;
+
+ return(CmpLen);
+ }
+ else
+ return(1);
+}
+
+
+/*************************** HASH INDEX **************************/
+
+/*
+ * Hashes a string. The string ought be rather short. We use an asm
+ * version the Amiga; note that this returns an UWORD instead.
+ *
+ * The algorithm was designed by Peter Weinberger. This version was
+ * adapted from Dr Dobb's Journal April 1996 page 26.
+ */
+
+#ifndef ASM_HASHWORD
+inline static ULONG HashWord(STRPTR str)
+{
+ register ULONG h = 0, hbit, c;
+
+ while((c = *str++))
+ {
+ h = (h<<4) ^ c;
+ if((hbit = h & 0xf0000000))
+ h ^= hbit>>24;
+ h &= ~hbit;
+ }
+
+ return(h);
+}
+#endif
+
+/*
+ * Inserts a string into a hash index. Note: You'll have to
+ * duplicate the string yourself.
+ */
+
+inline void InsertHash(const STRPTR a, struct Hash *h)
+{
+ struct HashEntry **he, *newhe;
+
+ if(!h->Index)
+ {
+ ifn((h->Index = calloc(HASH_SIZE, sizeof(struct HashEntry *))))
+ PrintPrgErr(pmWordListErr);
+ }
+
+ he = &h->Index[HashWord(a) % HASH_SIZE];
+
+ if((newhe = malloc(sizeof(struct HashEntry))))
+ {
+ newhe->Next = *he;
+ newhe->Str = a;
+ *he = newhe;
+ }
+ else
+ PrintPrgErr(pmWordListErr);
+}
+
+/*
+ * Checks whether a string previously has been registered in a
+ * hash index.
+ */
+
+inline STRPTR HasHash(const STRPTR a, const struct Hash *h)
+{
+ struct HashEntry *he;
+ HASH_TYPE i; /* Special magic to optimize SAS/C */
+
+ i = HashWord(a);
+ i %= HASH_SIZE;
+ he = h->Index[i];
+
+ while(he)
+ {
+ if(!strcmp(he->Str, a))
+ return(he->Str);
+ else
+ he = he->Next;
+ }
+ return(NULL);
+}
+
+/*
+ * Clears a hash table.
+ */
+
+void ClearHash(struct Hash *h)
+{
+ if(h && h->Index)
+ memset(h->Index, '\0', HASH_SIZE * sizeof(struct HashEntry *));
+}
+
+/*
+ * Rehashes a wordlist. If you change any of the elem's, you must
+ * call this.
+ *
+ */
+
+static void ReHash(struct WordList *WL)
+{
+ ULONG i = 0;
+
+ ClearHash(&WL->Hash);
+ FORWL(i, *WL)
+ InsertHash(WL->Stack.Data[i], &WL->Hash);
+}
+
+/*************************** WORDLIST HANDLING **************************/
+
+/*
+ * Inserts a duplicate of `Word' into the `Wordlist' structure. You do thus
+ * not need to make a duplicate of `Word' yourself.
+ */
+
+BOOL InsertWord(const STRPTR Word, struct WordList *WL)
+{
+ STRPTR WrdCpy;
+ ULONG Len;
+
+ if((WrdCpy = strdupx(Word, WALLBYTES)))
+ {
+ if(StkPush(WrdCpy, &WL->Stack))
+ {
+ Len = strlen(Word);
+ if(WL->MaxLen < Len)
+ WL->MaxLen = Len;
+
+ InsertHash(WrdCpy, &WL->Hash);
+ return(TRUE);
+ }
+
+ free(WrdCpy);
+ }
+
+ return(FALSE);
+}
+
+/*
+ * Clears a WordList; removing all items.
+ */
+
+void ClearWord(struct WordList *WL)
+{
+ if(WL)
+ {
+ WL->Stack.Used = 0;
+ WL->MaxLen = 0;
+ ClearHash(&WL->Hash);
+ if(WL->NonEmpty)
+ InsertWord("", WL);
+ }
+}
+
+/*
+ * Query whether a `Word' is previously InsertWord()'ed into the WL
+ * structure. Does case-sensitive comparison.
+ *
+ * Returns the data in the list.
+ */
+
+
+STRPTR HasWord(const STRPTR Word, struct WordList *WL)
+{
+ return(HasHash(Word, &WL->Hash));
+}
+
+/*
+ * Make all the words in a list lower case for later case-insensitive
+ * comparison.
+ */
+
+void MakeLower(struct WordList *wl)
+{
+ ULONG i;
+ FORWL(i, *wl)
+ strlwr(wl->Stack.Data[i]);
+ ReHash(wl);
+}
+
+/*
+ * Calls strrep on each argument in a list.
+ */
+
+void ListRep(struct WordList *wl, const TEXT From, const TEXT To)
+{
+ ULONG i;
+ FORWL(i, *wl)
+ strrep(wl->Stack.Data[i], From, To);
+ ReHash(wl);
+}
+
+
+
+/************************** GENERIC STACK ******************************/
+
+/*
+ * Push something onto a stack. Returns TRUE if successful, else FALSE.
+ * Note: You can not push a NULL Data element.
+ */
+
+BOOL StkPush(const APTR Data, struct Stack *Stack)
+{
+ ULONG NewSize;
+ APTR *NewBuf;
+
+ if(Data && Stack)
+ {
+ if(Stack->Used >= Stack->Size)
+ {
+ NewSize = Stack->Size + MINPUDDLE;
+
+ if((NewBuf = saferealloc(Stack->Data,
+ (size_t) NewSize * sizeof(APTR))))
+ {
+ Stack->Size = NewSize;
+ Stack->Data = NewBuf;
+ }
+ else
+ return(FALSE);
+ }
+
+ Stack->Data[Stack->Used++] = Data;
+ return(TRUE);
+ }
+
+ return(FALSE);
+}
+
+/*
+ * Pops an element from the stack.
+ *
+ */
+
+inline APTR StkPop(struct Stack *Stack)
+{
+ APTR Retval = NULL;
+
+ if(Stack && (Stack->Used > 0))
+ {
+ Retval = Stack->Data[--Stack->Used];
+
+#ifdef NO_DIRTY_TRICKS
+ {
+ APTR *NewBuf;
+
+ if(Stack->Used < (Stack->Size/2))
+ {
+ ULONG NewSize;
+ NewSize = Stack->Size - MINPUDDLE;
+ NewSize = max(NewSize, MINPUDDLE);
+
+ if(NewBuf = saferealloc(Stack->Data,
+ (size_t) NewSize * sizeof(APTR)))
+ {
+ Stack->Size = NewSize;
+ Stack->Data = NewBuf;
+ }
+ }
+ }
+#endif
+ }
+ return(Retval);
+}
+
+/*
+ * Returns the topmost element of the stack.
+ */
+
+APTR StkTop(struct Stack *Stack)
+{
+ if(Stack && (Stack->Used > 0))
+ return(Stack->Data[Stack->Used - 1]);
+ else
+ return(NULL);
+}
+
+/****************************** INPUT STACK *****************************/
+
+BOOL PushFileName(const STRPTR Name, struct Stack *stack)
+{
+ FILE *fh = NULL;
+ static
+ TEXT NameBuf [BUFSIZ];
+
+ if(Name && stack)
+ {
+ if(LocateFile(Name, NameBuf, ".tex", &TeXInputs))
+ {
+ if((fh = fopen(NameBuf, "r")))
+ {
+ return(PushFile(NameBuf, fh, stack));
+ }
+ }
+ PrintPrgErr(pmNoTeXOpen, Name);
+ }
+ return(FALSE);
+}
+
+
+BOOL PushFile(STRPTR Name, FILE *fh, struct Stack *stack)
+{
+ struct FileNode *fn;
+
+ if(Name && fh && stack)
+ {
+ if((fn = malloc(sizeof(struct FileNode))))
+ {
+ if((fn->Name = strdup(Name)))
+ {
+ fn->fh = fh;
+ fn->Line = 0L;
+ if(StkPush(fn, stack))
+ return(TRUE);
+ free(fn->Name);
+ }
+ free(fn);
+ }
+ PrintPrgErr(pmNoStackMem);
+ }
+
+ return(FALSE);
+}
+
+STRPTR FGetsStk(STRPTR Dest, ULONG len, struct Stack *stack)
+{
+ struct FileNode *fn;
+ STRPTR Retval = NULL;
+
+ if((fn = StkTop(stack)))
+ {
+ do
+ {
+ if((Retval = fgets(Dest, (int) len, fn->fh)))
+ {
+ fn->Line++;
+ break;
+ }
+
+ fn = StkPop(stack);
+ fclose(fn->fh);
+ free(fn);
+
+ } while(!Retval && (fn = StkTop(stack)));
+ }
+
+ return(Retval);
+}
+
+STRPTR CurStkName(struct Stack *stack)
+{
+ struct FileNode *fn;
+ static
+ STRPTR LastName = "";
+
+ if(PseudoInName && (stack->Used <= 1))
+ return(PseudoInName);
+ else
+ {
+ if((fn = StkTop(stack)))
+ return(LastName = fn->Name);
+ else
+ return(LastName);
+ }
+}
+
+
+FILE *CurStkFile(struct Stack *stack)
+{
+ struct FileNode *fn;
+
+ if((fn = StkTop(stack)))
+ return(fn->fh);
+ else
+ return(NULL);
+}
+
+ULONG CurStkLine(struct Stack *stack)
+{
+ struct FileNode *fn;
+ static
+ ULONG LastLine = 0L;
+
+ if((fn = StkTop(stack)))
+ return(LastLine = fn->Line);
+ else
+ return(LastLine);
+}
+
+
+
+/************************** CHARACTER STACK ******************************/
+
+/*
+ * Pushes the character on the stack.
+ */
+
+struct ErrInfo *PushChar(const TEXT c, const ULONG Line,
+ const ULONG Column, struct Stack *Stk,
+ const STRPTR LineCpy)
+{
+ TEXT Buf[2];
+
+ Buf[0] = c; Buf[1] = 0;
+
+ return(PushErr( Buf, Line, Column, 1, LineCpy, Stk));
+}
+
+struct ErrInfo *PushErr(const STRPTR Data, const ULONG Line,
+ const ULONG Column, const ULONG ErrLen,
+ const STRPTR LineCpy, struct Stack *Stk)
+{
+ struct ErrInfo *ci;
+
+ if((ci = malloc(sizeof(struct ErrInfo))))
+ {
+ if((ci->Data = strdup(Data)))
+ {
+ ci->File = CurStkName(&InputStack);
+ ci->Line = Line;
+ ci->ErrLen = ErrLen;
+ ci->Column = Column;
+ ci->LineBuf = LineCpy;
+ ci->Flags = efNone;
+
+ if(StkPush(ci, Stk))
+ return(ci);
+ }
+ else
+ PrintPrgErr(pmStrDupErr);
+ free(ci);
+ }
+
+ return(NULL);
+}
+
+/*
+ * Finds the uppermost entry in the stack with a data matching
+ * String.
+ */
+
+struct ErrInfo *TopMatch(struct Stack *Stack, STRPTR String)
+{
+ int i;
+ struct ErrInfo *retval = NULL;
+
+ if(Stack && String)
+ {
+ for(i = Stack->Used - 1;
+ i >= 0;
+ i--)
+ {
+ if(!strcmp(String, ((struct ErrInfo *) Stack->Data[i])->Data))
+ {
+ retval = (struct ErrInfo *) Stack->Data[i];
+ break;
+ }
+ }
+ }
+ return(retval);
+}
+
+/*
+ * Returns and removes a character from the stack, returns NULL if
+ * the stack is empty.
+ */
+
+
+struct ErrInfo *PopErr(struct Stack *Stack)
+{
+ return((struct ErrInfo *) StkPop(Stack));
+}
+
+/*
+ * Same as PopChar(), but lets the error alone on the stack.
+ */
+
+
+struct ErrInfo *TopErr(struct Stack *Stack)
+{
+ return((struct ErrInfo *) StkTop(Stack));
+}
+
+/*
+ * Free all resources associated with a struct FreeInfo.
+ */
+
+void FreeErrInfo(struct ErrInfo* ei)
+{
+ if(ei) {
+ if(ei->Data)
+ free(ei->Data);
+
+ free(ei);
+ }
+}
+
+
+/************************* OPEN/CLOSE COUNTING **************************/
+
+/*
+ * Returns the index a given bracket (`()[]{}') character has in the
+ * BrOrder array. Returns ~0 if the character was not a bracket.
+ */
+
+LONG BrackIndex(const TEXT c)
+{
+ switch(c)
+ {
+ case '(':
+ return(0);
+ case ')':
+ return(1);
+ case '[':
+ return(2);
+ case ']':
+ return(3);
+ case '{':
+ return(4);
+ case '}':
+ return(5);
+ default:
+ return(~0L);
+ }
+}
+
+/*
+ * Counts brackets for you. Give it a bracket, and it will update the
+ * corresponding counter.
+ */
+
+void AddBracket(const TEXT c)
+{
+ LONG Index;
+
+ if((Index = BrackIndex(c)) != -1)
+ Brackets[Index]++;
+
+}
+
+/*
+ * Returns the character that matches the given bracket, NULL if `c'
+ * wasn't a bracket character.
+ */
+
+TEXT MatchBracket(const TEXT c)
+{
+ ULONG Index;
+ TEXT Char = 0;
+
+
+ if((Index = BrackIndex(c)) != ~0UL)
+ Char = BrOrder[Index ^ 1];
+
+ return(Char);
+}
diff --git a/Build/source/texk/chktex/Utility.h b/Build/source/texk/chktex/Utility.h
new file mode 100644
index 00000000000..98acdd444f4
--- /dev/null
+++ b/Build/source/texk/chktex/Utility.h
@@ -0,0 +1,181 @@
+/*
+ * ChkTeX v1.5, utility functions -- header file.
+ * Copyright (C) 1995-96 Jens T. Berger Thielemann
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Contact the author at:
+ * Jens Berger
+ * Spektrumvn. 4
+ * N-0666 Oslo
+ * Norway
+ * E-mail: <jensthi@ifi.uio.no>
+ *
+ *
+ */
+
+#ifndef UTILITY_H
+#define UTILITY_H 1
+
+#ifndef CHKTEX_H
+# include "ChkTeX.h"
+#endif /* CHKTEX_H */
+#ifndef OPSYS_H
+# include "OpSys.h"
+#endif /* OPSYS_H */
+
+
+/*
+ * How many indexes we'll allocate first time
+ */
+#define MINPUDDLE 256
+
+/*
+ * How many bytes we want in front/end of each TEXT buffer. > 2
+ */
+#define WALLBYTES 4
+
+#ifndef HASH_SIZE
+# define HASH_SIZE 1009 /* A reasonably large prime */
+#endif
+
+#define FORWL(ind, list) for(ind = 0; ind < (list).Stack.Used; ind++)
+
+
+enum Strip {
+ STRP_LFT = 0x01,
+ STRP_RGT = 0x02,
+ STRP_BTH = 0x03
+};
+
+struct HashEntry {
+ struct HashEntry *Next;
+ STRPTR Str;
+};
+
+struct Hash {
+ struct HashEntry **Index;
+};
+
+struct Stack {
+ APTR *Data;
+ ULONG Size, Used;
+};
+
+struct WordList {
+ ULONG MaxLen;
+ BOOL NonEmpty;
+ struct Stack Stack;
+ struct Hash Hash;
+};
+#define WORDLIST_DEFINED
+
+struct FileNode {
+ STRPTR Name;
+ FILE *fh;
+ ULONG Line;
+};
+
+/* Rotates x n bits left (should be an int, long, etc.) */
+#define ROTATEL(x,n) ((x<<n) | (x>>((CHAR_BIT*sizeof(x)) - n)))
+
+/* Rotates x n bits right (should be an int, long, etc.) */
+#define ROTATER(x,n) ((x>>n) | (x<<((CHAR_BIT*sizeof(x)) - n)))
+
+BOOL fexists __PROTO((const STRPTR Filename));
+
+APTR sfmemset __PROTO((APTR to, int c, LONG n));
+void * saferealloc __PROTO((void *old, size_t newsize));
+
+int strafter __PROTO((const STRPTR Str, const STRPTR Cmp));
+void strrep __PROTO((STRPTR String, const TEXT From,
+ const TEXT To));
+void strxrep __PROTO((STRPTR Buf, const STRPTR Prot,
+ const TEXT To));
+STRPTR strip __PROTO((STRPTR String, const enum Strip What));
+void strwrite __PROTO((STRPTR To, const STRPTR From, ULONG Len));
+int strinfront __PROTO((STRPTR Str, STRPTR Cmp));
+STRPTR strdupx __PROTO((const STRPTR String, int Extra));
+void strmove __PROTO((char *a, const char *b));
+
+inline void
+ ClearHash __PROTO((struct Hash *h));
+inline void
+ InsertHash __PROTO((const STRPTR a, struct Hash *h));
+inline STRPTR
+ HasHash __PROTO((const STRPTR a, const struct Hash *h));
+
+BOOL InsertWord __PROTO((const STRPTR Word, struct WordList *WL));
+STRPTR HasWord __PROTO((const STRPTR Word, struct WordList *WL));
+void MakeLower __PROTO((struct WordList *wl));
+void ListRep __PROTO((struct WordList *wl, const TEXT From,
+ const TEXT To));
+void ClearWord __PROTO((struct WordList *WL));
+
+BOOL StkPush __PROTO((const APTR Data, struct Stack *Stack));
+inline APTR
+ StkPop __PROTO((struct Stack *Stack));
+APTR
+ StkTop __PROTO((struct Stack *Stack));
+
+FILE * CurStkFile __PROTO((struct Stack *stack));
+STRPTR CurStkName __PROTO((struct Stack *stack));
+ULONG CurStkLine __PROTO((struct Stack *stack));
+STRPTR FGetsStk __PROTO((STRPTR Dest, ULONG len, struct Stack *stack));
+BOOL PushFileName __PROTO((const STRPTR Name, struct Stack *stack));
+BOOL PushFile __PROTO((STRPTR, FILE *, struct Stack *));
+
+
+void FreeErrInfo __PROTO((struct ErrInfo* ei));
+struct ErrInfo *
+ PushChar __PROTO((const TEXT c, const ULONG Line,
+ const ULONG Column, struct Stack *Stk,
+ const STRPTR LineCpy));
+struct ErrInfo *
+ PushErr __PROTO((const STRPTR Data, const ULONG Line,
+ const ULONG Column, const ULONG ErrLen,
+ const STRPTR LineCpy, struct Stack *Stk));
+struct ErrInfo *TopChar __PROTO((struct Stack *Stack));
+struct ErrInfo *TopErr __PROTO((struct Stack *Stack));
+struct ErrInfo *PopErr __PROTO((struct Stack *Stack));
+struct ErrInfo *TopMatch __PROTO((struct Stack *Stack, STRPTR String));
+
+LONG BrackIndex __PROTO((TEXT const c));
+void AddBracket __PROTO((TEXT const c));
+TEXT MatchBracket __PROTO((TEXT const));
+
+
+
+WORD substring __PROTO((const STRPTR source, STRPTR dest,
+ ULONG pos, LONG len));
+
+#ifndef HAVE_STRLWR
+# define strlwr mystrlwr
+STRPTR mystrlwr __PROTO((STRPTR String));
+#endif
+
+#ifndef HAVE_STRDUP
+# define strdup mystrdup
+STRPTR mystrdup __PROTO((const STRPTR String));
+#endif
+
+
+#ifndef HAVE_STRCASECMP
+int strcasecmp(char* a, char* b);
+#endif
+
+
+
+#endif /* UTILITY_H */
diff --git a/Build/source/texk/chktex/chktex.c b/Build/source/texk/chktex/chktex.c
new file mode 100644
index 00000000000..62e2d40236c
--- /dev/null
+++ b/Build/source/texk/chktex/chktex.c
@@ -0,0 +1,1080 @@
+/*
+ * ChkTeX v1.5, finds typographic errors in (La)TeX files.
+ * Copyright (C) 1995-96 Jens T. Berger Thielemann
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Contact the author at:
+ * Jens Berger
+ * Spektrumvn. 4
+ * N-0666 Oslo
+ * Norway
+ * E-mail: <jensthi@ifi.uio.no>
+ *
+ *
+ */
+
+
+#ifdef AMIGA
+# include <exec/execbase.h>
+# include "WB2Argv.h"
+#endif
+
+#ifdef WIN32
+#include <getopt.h>
+#else
+#include "getopt.h"
+#endif
+#include "ChkTeX.h"
+#include "OpSys.h"
+#include "Utility.h"
+#include "FindErrs.h"
+#include "Resource.h"
+#include <string.h>
+
+#ifdef KPATHSEA
+#include <kpathsea/config.h>
+#include <kpathsea/progname.h>
+#endif
+
+#undef MSG
+#define MSG(num, type, inuse, ctxt, text) {num, type, inuse, ctxt, text},
+
+struct ErrMsg PrgMsgs [pmMaxFault + 1] =
+{
+ PRGMSGS
+ {pmMaxFault, etErr, TRUE, 0, INTERNFAULT}
+};
+
+struct Stack
+ CharStack = {0L},
+ InputStack = {0L},
+ EnvStack = {0L};
+
+/************************************************************************/
+
+const TEXT BrOrder [NUMBRACKETS + 1] = "()[]{}";
+
+ULONG Brackets [NUMBRACKETS];
+
+/************************************************************************/
+
+
+/*
+ * Have to do things this way, to ease some checking throughout the
+ * program.
+ */
+
+
+NEWBUF(TmpBuffer, BUFSIZ);
+NEWBUF(ReadBuffer, BUFSIZ);
+
+static const STRPTR
+ Banner =
+"ChkTeX v1.5 - Copyright 1995-96 Jens T. Berger Thielemann.\n"
+#ifdef __OS2__
+"OS/2 port generated with emx compiler, by Wolfgang Fritsch, <fritsch@hmi.de>"
+#elif defined(__MSDOS__)
+"MS-DOS port by Bj\\o rn Ove Thue, <bjort@ifi.uio.no>"
+#elif defined(KPATHSEA)
+"Kpathsea port by Fabrice Popineau, <Fabrice.Popineau@supelec.fr>"
+#endif
+"\n",
+ BigBanner =
+"ChkTeX comes with ABSOLUTELY NO WARRANTY; details on this and\n"
+"distribution conditions in the GNU General Public License file.\n"
+"Type \"ChkTeX -h\" for help, \"ChkTeX -i\" for distribution info.\n"
+"Author: Jens Berger, Spektrumvn. 4, N-0666 Oslo, Norway.\n"
+"E-mail: <jensthi@ifi.uio.no>\n"
+"Press " STDIN_BREAK " to abort stdin input.\n",
+ GiftBanner =
+"\n"
+" If you like this program and use it frequently the author\n"
+" would like you to send him any gift that you feel would\n"
+" be an appropriate `payment' for `ChkTeX' --- thank you!\n"
+"\n",
+Distrib =
+"\n"
+"This program is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n"
+"\n"
+"This program is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
+"GNU General Public License for more details.\n"
+"\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n"
+,
+OnText =
+"On",
+OffText =
+"Off",
+HowHelp =
+"-h or --help gives usage information. See also ChkTeX.{ps,dvi}.\n",
+HelpText =
+"\n"
+"\n"
+" Usage of ChkTeX v1.5\n"
+" ~~~~~~~~~~~~~~~~~~~~\n"
+"\n"
+" Template\n"
+" ~~~~~~~~\n"
+"chktex [-hiqrW] [-v[0-...]] [-l <rcfile>] [-[wemn] <[1-42]|all>]\n"
+" [-d[0-...]] [-p <name>] [-o <outfile>] [-[btxgI][0|1]]\n"
+" file1 file2 ...\n"
+"\n"
+"----------------------------------------------------------------------\n"
+" Description of options:\n"
+" ~~~~~~~~~~~~~~~~~~~~~~~\n"
+"Misc. options\n"
+"~~~~~~~~~~~~~\n"
+" -h --help : This text.\n"
+" -i --license : Show distribution information\n"
+" -l --localrc : Read local .chktexrc formatted file.\n"
+" -d --debug : Debug information. Give it a number.\n"
+" -r --reset : Reset settings to default.\n"
+"\n"
+"Muting warning messages:\n"
+"~~~~~~~~~~~~~~~~~~~~~~~~\n"
+" -w --warnon : Makes msg # given a warning and turns it on.\n"
+" -e --erroron : Makes msg # given an error and turns it on.\n"
+" -m --msgon : Makes msg # given a message and turns it on.\n"
+" -n --nowarn : Mutes msg # given.\n"
+"\n"
+"Output control flags:\n"
+"~~~~~~~~~~~~~~~~~~~~~\n"
+" -v --verbosity : How errors are displayed.\n"
+" Default 1, 0=Less, 2=Fancy, 3=lacheck.\n"
+" -V --pipeverb : How errors are displayed when stdout != tty.\n"
+" Defaults to the same as -v.\n"
+" -s --splitchar : String used to split fields when doing -v0\n"
+" -o --output : Redirect error report to a file.\n"
+" -q --quiet : Shuts up about version information.\n"
+" -p --pseudoname: Input file-name when reporting.\n"
+" -f --format : Format to use for output\n"
+"\n"
+"Boolean switches (1 -> enables / 0 -> disables):\n"
+"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"
+" -b --backup : Backup output file.\n"
+" -x --wipeverb : Ignore contents of `\\verb' commands.\n"
+" -g --globalrc : Read global .chktexrc file.\n"
+" -I --inputfiles: Execute \\input statements.\n"
+" -H --headererr : Show errors found in front of \\begin{document}\n"
+"\n"
+"Miscellaneous switches:\n"
+"~~~~~~~~~~~~~~~~~~~~~~~\n"
+" -W --version : Version information\n"
+"\n"
+"----------------------------------------------------------------------\n"
+"If no LaTeX files are specified on the command line, we will read from\n"
+"stdin. For explanation of warning/error messages, please consult the\n"
+"main document ChkTeX.dvi or ChkTeX.ps.\n";
+
+
+
+
+#define CHAR(a) a,
+
+TEXT LTX_EosPunc[] = {LATEX_EOSPUNC 0};
+TEXT LTX_GenPunc[] = {LATEX_GENPUNC 0};
+TEXT LTX_SmallPunc[] = {LATEX_SMALLPUNC 0};
+
+/*
+ * Options we will set.
+ *
+ */
+
+enum Quote Quote;
+
+TEXT VerbNormal [] =
+ "%k %n in %f line %l: %m\n"
+ "%r%s%t\n"
+ "%u\n";
+
+#define DEF(type, name, value) type name = value;
+OPTION_DEFAULTS
+STATE_VARS
+#undef DEF
+
+FILE *OutputFile = NULL;
+
+STRPTR PrgName;
+
+BOOL StdInTTY, StdOutTTY;
+
+/*
+ * End of config params.
+ */
+
+static int ParseArgs __PROTO((int argc, char **argv));
+static void ShowIntStatus __PROTO((void));
+static BOOL OpenOut __PROTO((void));
+static int ShiftArg __PROTO((STRPTR *Argument));
+
+
+/*
+ * Duplicates all arguments, and appends an asterix to each of them.
+ */
+
+static void AddStars(struct WordList *wl)
+{
+ ULONG Count, CmdLen;
+ STRPTR Data;
+
+ FORWL(Count, *wl)
+ {
+ Data = wl->Stack.Data[Count];
+ CmdLen = strlen(Data);
+ if(Data[CmdLen - 1] != '*')
+ {
+ strcpy(TmpBuffer, Data);
+ strcat(TmpBuffer, "*");
+ InsertWord(TmpBuffer, wl);
+ }
+ }
+}
+
+/*
+ * Sets up all the lists.
+ *
+ */
+
+static void SetupLists(void)
+{
+ ULONG i;
+
+ AddStars(&VerbEnvir);
+ AddStars(&MathEnvir);
+
+ MakeLower(&UserWarnCase);
+
+ ListRep(&WipeArg, ':', 0);
+ ListRep(&NoCharNext, ':', 0);
+
+#define ThisItem ((STRPTR) AbbrevCase.Stack.Data[i])
+
+ FORWL(i, AbbrevCase)
+ {
+ if(isalpha(ThisItem[0]))
+ {
+ ThisItem[0] = toupper(ThisItem[0]);
+ InsertWord(ThisItem, &Abbrev);
+ ThisItem[0] = tolower(ThisItem[0]);
+ }
+ InsertWord(ThisItem, &Abbrev);
+ }
+}
+
+#define NOCOMMON(a,b) NoCommon(&a,#a,&b,#b)
+
+/*
+ * Checks that two lists don't have any common element.
+ */
+
+static void NoCommon(struct WordList *a, const STRPTR aName,
+ struct WordList *b, const STRPTR bName)
+{
+ ULONG i;
+
+ FORWL(i, *a)
+ {
+ if(HasWord((STRPTR) a->Stack.Data[i], b))
+ PrintPrgErr(pmNoCommon, a->Stack.Data[i], aName, bName);
+ }
+}
+
+/*
+ * Expands the tabs in a string to regular intervals sized
+ * TSize.
+ */
+
+static void ExpandTabs(STRPTR From, STRPTR To, LONG TSize)
+{
+ STRPTR Next, Orig;
+ ULONG Diff;
+
+ Next = From;
+ Orig = To;
+
+ while((Next = strchr(From, '\t')))
+ {
+ if((Diff = Next - From))
+ {
+ strncpy(To, From, Diff);
+ To += Diff;
+ Diff = TSize - ((To - Orig) % TSize);
+ }
+ else
+ Diff = TSize;
+
+ memset(To, ' ', Diff);
+ To += Diff;
+
+ From = ++Next;
+ }
+ strcpy(To, From);
+}
+
+
+int main(int argc, char **argv)
+{
+ int retval = EXIT_FAILURE, CurArg;
+ ULONG Count;
+ BOOL StdInUse = FALSE;
+ STRPTR NameMatch = "";
+ LONG Tab = 8;
+
+#ifdef KPATHSEA
+ extern KPSEDLL char *kpse_bug_address;
+
+ kpse_set_program_name (argv[0], "ChkTeX");
+#endif
+
+#ifdef __LOCALIZED
+ InitStrings();
+#endif
+
+#ifdef AMIGA
+ if(_WBenchMsg)
+ {
+ if(argv = WB2Argv(_WBenchMsg, W2A_LOWER))
+ argc = CountArgv(argv);
+ else
+ exit(EXIT_FAILURE);
+ }
+#endif
+
+ OutputFile = stdout;
+ PrgName = argv[0];
+
+#undef KEY
+#undef LCASE
+#undef LIST
+#undef LNEMPTY
+#define KEY(a, def)
+#define LCASE(a)
+#define LIST(a)
+#define LNEMPTY(a) InsertWord("", &a);
+
+ RESOURCE_INFO;
+
+ while(SetupVars())
+ ReadRC(ConfigFile);
+
+ if(CmdLine.Stack.Used)
+ {
+ ParseArgs(CmdLine.Stack.Used, (STRPTR *) CmdLine.Stack.Data);
+ CmdLine.Stack.Used = 1L;
+ }
+
+ if((CurArg = ParseArgs((ULONG) argc, argv)))
+ {
+ if(CmdLine.Stack.Used)
+ {
+ ParseArgs(CmdLine.Stack.Used, (STRPTR *) CmdLine.Stack.Data);
+ CmdLine.Stack.Used = 1L;
+ }
+
+ if(!Quiet || LicenseOnly)
+ fprintf(stderr, Banner);
+
+ if(CurArg == argc)
+ UsingStdIn = TRUE;
+
+#if defined(HAVE_FILENO) && defined(HAVE_ISATTY)
+ StdInTTY = isatty(fileno(stdin));
+ StdOutTTY = isatty(fileno(stdout));
+#else
+ StdInTTY = StdOutTTY = TRUE;
+#endif
+ SetupTerm();
+
+ if((UsingStdIn && StdInTTY && !Quiet) || LicenseOnly)
+ {
+ fprintf(stderr, BigBanner);
+ if(!LicenseOnly)
+ fprintf(stderr, GiftBanner);
+ }
+
+ if(!StdOutTTY && PipeOutputFormat)
+ OutputFormat = PipeOutputFormat;
+
+ if(LicenseOnly)
+ {
+ fprintf(stderr, Distrib);
+ fprintf(stderr, GiftBanner);
+ }
+ else
+ {
+ SetupLists();
+ if(QuoteStyle)
+ {
+ if(!strcasecmp(QuoteStyle, "LOGICAL"))
+ Quote = quLogic;
+ elif(!strcasecmp(QuoteStyle, "TRADITIONAL"))
+ Quote = quTrad;
+ else
+ {
+ PrintPrgErr(pmQuoteStyle, QuoteStyle);
+ Quote = quTrad;
+ }
+ }
+
+ if(DebugLevel)
+ ShowIntStatus();
+
+ NOCOMMON(Italic, NonItalic);
+ NOCOMMON(Italic, ItalCmd);
+ NOCOMMON(LowDots, CenterDots);
+
+ if(TabSize && isdigit(*TabSize))
+ Tab = strtol(TabSize, NULL, 10);
+
+ if(OpenOut())
+ {
+ for(;;)
+ {
+ for(Count = 0; Count < NUMBRACKETS; Count++)
+ Brackets[Count] = 0L;
+
+#define DEF(type, name, value) name = value;
+ STATE_VARS
+#undef DEF
+
+ if(UsingStdIn) {
+ if(StdInUse)
+ break;
+ else {
+ StdInUse = TRUE;
+ PushFile("stdin", stdin, &InputStack);
+ }
+ } else {
+ if((CurArg <= argc) || NameMatch) {
+ ifn(NameMatch = MatchFileName(NULL)) {
+ if(CurArg < argc)
+ NameMatch = MatchFileName(argv[CurArg++]);
+ }
+
+ if(!PushFileName(NameMatch, &InputStack))
+ break;
+ }
+ }
+
+ if(StkTop(&InputStack) && OutputFile)
+ {
+ while(!ferror(OutputFile) && StkTop(&InputStack) &&
+ !ferror(CurStkFile(&InputStack)) &&
+ FGetsStk(ReadBuffer, BUFSIZ-1, &InputStack))
+ {
+
+ /* Make all spaces ordinary spaces */
+
+ strrep(ReadBuffer, '\n', ' ');
+ strrep(ReadBuffer, '\r', ' ');
+ ExpandTabs(ReadBuffer, TmpBuffer, Tab);
+ strcpy(ReadBuffer, TmpBuffer);
+
+ strcat(ReadBuffer, " ");
+ FindErr(ReadBuffer, CurStkLine(&InputStack));
+ }
+
+ PrintStatus(CurStkLine(&InputStack));
+ retval = EXIT_SUCCESS;
+ }
+ }
+ }
+ }
+ }
+ exit(retval);
+ return retval;
+}
+
+/*
+ * Opens the output file handle & possibly renames
+ */
+
+static BOOL OpenOut(void)
+{
+#ifdef __MSDOS__
+ char *p;
+#endif
+ BOOL Success = TRUE;
+
+ if(*OutputName)
+ {
+ if(BackupOut && fexists(OutputName))
+ {
+ strcpy(TmpBuffer, OutputName);
+ AddAppendix(TmpBuffer, BAKAPPENDIX);
+
+ if(fexists(TmpBuffer))
+ remove(TmpBuffer);
+
+ if(!rename(OutputName, TmpBuffer))
+ PrintPrgErr(pmRename,
+ OutputName, TmpBuffer);
+ else
+ {
+ PrintPrgErr(pmRenameErr,
+ OutputName, TmpBuffer);
+ Success = FALSE;
+ }
+
+ }
+
+ if(Success)
+ {
+ ifn(OutputFile = fopen(OutputName, "w"))
+ {
+ PrintPrgErr(pmOutOpen);
+ Success = FALSE;
+ }
+ }
+ }
+ else
+ OutputFile = stdout;
+
+ return(Success);
+}
+
+#ifndef STRIP_DEBUG
+static void ShowWL(const STRPTR Name, const struct WordList *wl)
+{
+ ULONG i, j, percent;
+
+ fprintf(stderr,
+ "Name: %12s", Name);
+
+ if(DebugLevel & FLG_DbgListInfo)
+ {
+ fprintf(stderr, ", MaxLen: %3ld, Entries: %3ld, ",
+ wl->MaxLen, wl->Stack.Used);
+
+ if(wl->Hash.Index && wl->Stack.Used)
+ {
+ for(i = j = 0;
+ i < HASH_SIZE;
+ i++)
+ {
+ if(wl->Hash.Index[i])
+ j++;
+ }
+ percent = (j * 10000)/wl->Stack.Used;
+
+
+ fprintf(stderr, "Hash usage: %3ld.%02ld%%",
+ percent/100, percent%100);
+ }
+ else
+ fprintf(stderr, "No hash table.");
+ }
+
+ fputc('\n', stderr);
+
+ if(DebugLevel & FLG_DbgListCont)
+ {
+ FORWL(i, *wl)
+ fprintf(stderr, "\t%s\n", (STRPTR) wl->Stack.Data[i]);
+ }
+}
+#endif
+
+#define BOOLDISP(var) ((var)? OnText : OffText)
+#define SHOWSTAT(text, arg) fprintf(stderr, "\t" text ": %s\n", arg)
+#define BOOLSTAT(name, var) SHOWSTAT(name, BOOLDISP(var))
+#define SHOWSTR(text, arg) fprintf(stderr, "%s:\n\t%s\n", text, arg);
+
+
+/*
+ * Prints some of the internal flags; mainly for debugging purposes
+ */
+
+static void ShowIntStatus(void)
+{
+#ifndef STRIP_DEBUG
+ ULONG Cnt;
+ STRPTR String, iuStr;
+
+ if(DebugLevel & FLG_DbgMsgs)
+ {
+ fprintf(stderr, "There are %d warnings/error messages available:\n",
+ emMaxFault - emMinFault - 1);
+
+ for(Cnt = emMinFault + 1; Cnt < emMaxFault; Cnt++)
+ {
+ switch(LaTeXMsgs[Cnt].Type)
+ {
+ case etWarn: String = "Warning"; break;
+ case etErr: String = "Error"; break;
+ case etMsg: String = "Message"; break;
+ default: String = ""; break;
+ }
+
+ switch(LaTeXMsgs[Cnt].InUse)
+ {
+ case iuOK: iuStr = "In use"; break;
+ case iuNotUser: iuStr = "User muted"; break;
+ case iuNotSys: iuStr = "System muted"; break;
+ }
+
+ fprintf(stderr, "Number: %2ld, Type: %s, Status: %s\n"
+ "\tText: %s\n\n",
+ Cnt, String,
+ iuStr, LaTeXMsgs[Cnt].Message);
+ }
+ }
+
+#undef KEY
+#undef LCASE
+#undef LNEMPTY
+#undef LIST
+
+#define LNEMPTY LIST
+#define LIST(a) ShowWL(#a, &a);
+#define LCASE(a) LIST(a); LIST(a ## Case);
+#define KEY(a,def) SHOWSTR(#a, a);
+
+
+ if(DebugLevel & (FLG_DbgListInfo | FLG_DbgListCont))
+ {
+ RESOURCE_INFO;
+ }
+
+ if(DebugLevel & FLG_DbgOtherInfo)
+ {
+ SHOWSTR("Outputformat", OutputFormat);
+
+ fprintf(stderr, "Current flags include:\n");
+
+ BOOLSTAT("Read global resource", GlobalRC);
+ BOOLSTAT("Wipe verbose commands", WipeVerb);
+ BOOLSTAT("Backup outfile", BackupOut);
+ BOOLSTAT("Quiet mode", Quiet);
+ BOOLSTAT("Show license", LicenseOnly);
+ BOOLSTAT("Use stdin", UsingStdIn);
+ BOOLSTAT("\\input files", InputFiles);
+ BOOLSTAT("Output header errors", HeadErrOut);
+ }
+#endif
+}
+
+/*
+ * Resets all stacks.
+ *
+ */
+
+#undef KEY
+#undef LCASE
+#undef LNEMPTY
+#undef LIST
+
+#define LNEMPTY LIST
+#define LIST(a) ClearWord(&a);
+#define LCASE(a) LIST(a); LIST(a ## Case);
+#define KEY(a,def) a = def;
+
+static void ResetStacks(void)
+{
+ RESOURCE_INFO;
+
+}
+
+/*
+ * Resets all flags (not wordlists) to their default values. Sets
+ * Outputfile to stdout.
+ *
+ */
+
+static void ResetSettings(void)
+{
+
+#define DEF(type, name, value) name = value;
+OPTION_DEFAULTS
+#undef DEF
+
+ if(OutputFile != stdout)
+ {
+ fclose(OutputFile);
+ OutputFile = stdout;
+ }
+}
+
+/*
+ * Reads a numerical argument from the argument. Supports concatenation
+ * of arguments (main purpose)
+ */
+
+static int ParseNumArg(LONG *Dest, /* Where to put the value */
+ LONG Default, /* Value to put in if no in argue */
+ STRPTR *Argument) /* optarg or similar */
+{
+ if(Argument && *Argument && isdigit(**Argument))
+ *Dest = strtol(*Argument, Argument, 10);
+ else
+ *Dest = Default;
+
+ return(ShiftArg(Argument));
+}
+
+/*
+ * Same as above; however, will toggle the boolean if user doesn't
+ * supply value
+ */
+
+static int ParseBoolArg(BOOL *Dest, /* Boolean value */
+ STRPTR *Argument) /* optarg or similar */
+{
+ LONG D = *Dest? 1L : 0L;
+ int Retval;
+
+ Retval = ParseNumArg(&D, *Dest? 0L : 1L, Argument);
+
+ *Dest = D ? TRUE : FALSE;
+
+ return(Retval);
+}
+
+/*
+ * Returns the first character in the string passed, updates the
+ * string pointer, if the string is non-empty.
+ *
+ * 0 if the string is empty.
+ */
+
+static int ShiftArg(STRPTR *Argument) /* optarg or similar */
+{
+ if(Argument && *Argument && **Argument)
+ return(*((STRPTR) (*Argument)++));
+ else
+ return 0;
+}
+
+/*
+ * Parses an argv similar array.
+ */
+
+static int ParseArgs(int argc, char **argv)
+{
+ /* Needed for option parsing. */
+
+static const
+ struct option long_options[] =
+ {
+ {"help", no_argument, 0L, 'h'},
+ {"localrc", required_argument, 0L, 'l'},
+ {"output", required_argument, 0L, 'o'},
+ {"warnon", required_argument, 0L, 'w'},
+ {"erroron", required_argument, 0L, 'e'},
+ {"msgon", required_argument, 0L, 'm'},
+ {"nowarn", required_argument, 0L, 'n'},
+ {"verbosity", optional_argument, 0L, 'v'},
+ {"pipeverb", optional_argument, 0L, 'V'},
+ {"debug", required_argument, 0L, 'd'},
+ {"reset", no_argument, 0L, 'r'},
+ {"quiet", no_argument, 0L, 'q'},
+ {"license", no_argument, 0L, 'i'},
+ {"splitchar", required_argument, 0L, 's'},
+ {"format", required_argument, 0L, 'f'},
+ {"pseudoname", required_argument, 0L, 'p'},
+
+ {"inputfiles", optional_argument, 0L, 'I'},
+ {"backup", optional_argument, 0L, 'b'},
+ {"globalrc", optional_argument, 0L, 'g'},
+ {"wipeverb", optional_argument, 0L, 'x'},
+ {"tictoc", optional_argument, 0L, 't'},
+ {"headererr", optional_argument, 0L, 'H'},
+ {"version", no_argument, 0L, 'W'},
+
+ {0L, 0L, 0L, 0L}
+ };
+
+ int option_index = 0L, c, i, nextc, ErrType;
+
+ int Retval = FALSE, InUse;
+ BOOL Success, Foo;
+ LONG Err, Verb = 1, PipeVerb = 1;
+
+ enum
+ {
+ aeNoErr = 0,
+ aeArg, /* missing/bad required argument */
+ aeOpt, /* unknown option returned */
+ aeHelp, /* just a call for help */
+ aeMem /* no memory */
+ } ArgErr = aeNoErr;
+
+ optind = 0;
+
+ while(!ArgErr &&
+ ((c = getopt_long((int) argc, argv,
+ "b::d:e:f:g::hH::I::il:m:n:o:p:qrs:t::v::V::w:Wx::",
+ long_options,
+ &option_index)) != EOF))
+ {
+ while(c) {
+ nextc = 0;
+ switch(c)
+ {
+ case 's':
+ ifn(Delimit = strdup(optarg)) {
+ PrintPrgErr(pmStrDupErr);
+ ArgErr = aeMem;
+ }
+
+ break;
+ case 'p':
+ ifn(PseudoInName = strdup(optarg)) {
+ PrintPrgErr(pmStrDupErr);
+ ArgErr = aeMem;
+ }
+
+ break;
+
+ case 'd':
+#ifdef STRIP_DEBUG
+ PrintPrgErr(pmNoDebugFlag);
+#else
+ nextc = ParseNumArg(&DebugLevel, 0xffff, &optarg);
+#endif
+ break;
+ case 'i':
+ LicenseOnly = TRUE;
+
+ nextc = ShiftArg(&optarg);
+ break;
+ case 'q':
+ Quiet = TRUE;
+
+ nextc = ShiftArg(&optarg);
+ break;
+
+ LOOP(warntype,
+ case 'w':
+ ErrType = etWarn;
+ InUse = iuOK;
+ LAST(warntype);
+ case 'e':
+ ErrType = etErr;
+ InUse = iuOK;
+ LAST(warntype);
+ case 'm':
+ ErrType = etMsg;
+ InUse = iuOK;
+ LAST(warntype);
+ case 'n':
+ ErrType = etMsg;
+ InUse = iuNotUser;
+ LAST(warntype);
+ )
+
+ if(isdigit(*optarg))
+ {
+ nextc = ParseNumArg(&Err, -1, &optarg);
+ if(betw(emMinFault, Err, emMaxFault))
+ {
+ LaTeXMsgs[Err].Type = ErrType;
+ LaTeXMsgs[Err].InUse = InUse;
+ }
+ else
+ {
+ ArgErr = aeOpt;
+ PrintPrgErr(pmWarnNumErr);
+ }
+ }
+ else if(!strcasecmp(optarg, "all"))
+ {
+ for(i = emMinFault + 1; i < emMaxFault; i++)
+ {
+ LaTeXMsgs[i].Type = ErrType;
+ LaTeXMsgs[i].InUse = InUse;
+ }
+ }
+ else
+ {
+ ArgErr = aeOpt;
+ PrintPrgErr(pmWarnNumErr);
+ }
+
+ break;
+
+ case 'g':
+ nextc = ParseBoolArg(&GlobalRC, &optarg);
+ if(!GlobalRC) {
+ ResetStacks();
+ }
+ break;
+
+ case 'r':
+ ResetSettings();
+ nextc = ShiftArg(&optarg);
+ break;
+
+ case 'l':
+ if(optarg)
+ ReadRC(optarg);
+ break;
+
+ case 'f':
+ ifn(OutputFormat = strdup(optarg))
+ {
+ PrintPrgErr(pmStrDupErr);
+ ArgErr = aeMem;
+ }
+ break;
+
+ case 'v':
+ nextc = ParseNumArg(&Verb, 2, &optarg);
+
+ if(Verb < (LONG) OutFormat.Stack.Used)
+ OutputFormat = strdup(OutFormat.Stack.Data[Verb]);
+ else
+ {
+ PrintPrgErr(pmVerbLevErr);
+ ArgErr = aeArg;
+ }
+ break;
+ case 'V':
+ nextc = ParseNumArg(&PipeVerb, 1, &optarg);
+
+ if(PipeVerb < (LONG) OutFormat.Stack.Used)
+ PipeOutputFormat = strdup(OutFormat.Stack.Data[PipeVerb]);
+ else
+ {
+ PrintPrgErr(pmVerbLevErr);
+ ArgErr = aeArg;
+ }
+ break;
+
+ case 'o':
+ if(optarg)
+ {
+ if(*OutputName)
+ {
+ PrintPrgErr(pmOutTwice);
+ ArgErr = aeOpt;
+ }
+ else
+ {
+ ifn(OutputName = strdup(optarg))
+ {
+ PrintPrgErr(pmStrDupErr);
+ ArgErr = aeMem;
+ }
+ }
+ }
+
+ break;
+
+ case 't':
+ nextc = ParseBoolArg(&Foo, &optarg);
+ break;
+ case 'x':
+ nextc = ParseBoolArg(&WipeVerb, &optarg);
+ break;
+ case 'b':
+ nextc = ParseBoolArg(&BackupOut, &optarg);
+ break;
+ case 'I':
+ nextc = ParseBoolArg(&InputFiles, &optarg);
+ break;
+ case 'H':
+ nextc = ParseBoolArg(&HeadErrOut, &optarg);
+ break;
+ case 'W':
+ printf(Banner);
+ exit(EXIT_SUCCESS);
+ case '?':
+ default:
+ fputs(Banner, stderr);
+ fputs(HowHelp, stderr);
+ exit(EXIT_FAILURE);
+ break;
+ case 'h':
+ ArgErr = aeHelp;
+ break;
+ }
+ c = nextc;
+ }
+ }
+
+ if((argc > optind) && !strcmp(argv[optind], "?"))
+ ArgErr = aeHelp;
+
+ if(ArgErr)
+ {
+ fputs(Banner, stderr);
+ fputs(BigBanner, stderr);
+ fputs(HelpText, stderr);
+ Success = FALSE;
+ }
+ else
+ Success = TRUE;
+
+ if(Success)
+ Retval = optind;
+
+ return(Retval);
+}
+
+/*
+ * Outputs a program error.
+ */
+
+
+void PrintPrgErr(enum PrgErrNum Error, ...)
+{
+ STRPTR Type;
+ va_list MsgArgs;
+
+ if(betw(pmMinFault, Error, pmMaxFault)) {
+ switch(PrgMsgs[Error].Type) {
+ case etWarn:
+ Type = "WARNING";
+ break;
+ case etMsg:
+ Type = "NOTE";
+ break;
+ default:
+ case etErr:
+ Type = "ERROR";
+ break;
+ }
+ fprintf(stderr, "%s: %s -- ", PrgName, Type);
+
+ va_start(MsgArgs, Error);
+ vfprintf(stderr, PrgMsgs[Error].Message, MsgArgs);
+ va_end(MsgArgs);
+ fputc('\n', stderr);
+
+ if(PrgMsgs[Error].Type == etErr)
+ exit(EXIT_FAILURE);
+ }
+}
+
+void ErrPrintf(const char *fmt, ...)
+{
+ va_list MsgArgs;
+
+ va_start(MsgArgs, fmt);
+ vfprintf(stderr, fmt, MsgArgs);
+ va_end(MsgArgs);
+}
+
+
+
diff --git a/Build/source/texk/chktex/chktex.el b/Build/source/texk/chktex/chktex.el
new file mode 100644
index 00000000000..2e50877d8e4
--- /dev/null
+++ b/Build/source/texk/chktex/chktex.el
@@ -0,0 +1,77 @@
+;;; chktex.el --- quick hack to add ChkTeX capability to AUC-TeX mode
+;;
+;;
+;; Keywords: LaTeX, AUC-TeX, ChkTeX
+;;
+;; ChkTeX v1.5, quick hack to add ChkTeX in LaTeX menu.
+;; Copyright (C) 1995-96 Jens T. Berger Thielemann
+;;
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2 of the License, or
+;; (at your option) any later version.
+;;
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with this program; if not, write to the Free Software
+;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+;;
+;; Contact the author at:
+;; Jens Berger
+;; Spektrumvn. 4
+;; N-0666 Oslo
+;; Norway
+;; E-mail: <jensthi@ifi.uio.no>
+;;
+;;
+;;; Commentary:
+;;
+;; This tiny hack will add a "ChkTeX" item to the command menu of
+;; AUC-TeX, thus making the use of ChkTeX much more comfortable from
+;; within AUC-TeX (`LaTeX-mode').
+;;
+;; INSTALLATION
+;;
+;; 1. Put this file somewhere in your loading path.
+;; 2. Add the line
+;; (require 'chktex)
+;; to your .emacs file
+;;
+;; It is doubtful whether byte-compiling this file gains anything.
+;;
+;;; Code:
+;;
+
+
+
+(require 'tex-site)
+(require 'easymenu)
+
+(setq TeX-command-list
+ (nconc TeX-command-list
+ (list (list "ChkTeX" "chktex -v3 %s" 'TeX-run-compile nil t))))
+
+(add-hook 'LaTeX-mode-hook
+ (function (lambda ()
+(easy-menu-define LaTeX-mode-menu
+ LaTeX-mode-map
+ "Menu used in LaTeX mode."
+ (append '("Command")
+ '(("Command on"
+ [ "Master File" TeX-command-select-master
+ :keys "C-c C-c" :style radio
+ :selected (eq TeX-command-current 'TeX-command-master) ]
+ [ "Buffer" TeX-command-select-buffer
+ :keys "C-c C-b" :style radio
+ :selected (eq TeX-command-current 'TeX-command-buffer) ]
+ [ "Region" TeX-command-select-region
+ :keys "C-c C-r" :style radio
+ :selected (eq TeX-command-current 'TeX-command-region) ]))
+ (let ((file 'TeX-command-on-current))
+ (mapcar 'TeX-command-menu-entry TeX-command-list)))))))
+
+(provide 'chktex) \ No newline at end of file
diff --git a/Build/source/texk/chktex/chktex.h b/Build/source/texk/chktex/chktex.h
new file mode 100644
index 00000000000..7429b0b2c46
--- /dev/null
+++ b/Build/source/texk/chktex/chktex.h
@@ -0,0 +1,375 @@
+/*
+ * ChkTeX v1.5, header file for main program.
+ * Copyright (C) 1995-96 Jens T. Berger Thielemann
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Contact the author at:
+ * Jens Berger
+ * Spektrumvn. 4
+ * N-0666 Oslo
+ * Norway
+ * E-mail: <jensthi@ifi.uio.no>
+ *
+ *
+ */
+
+#ifndef CHKTEX_H
+#define CHKTEX_H 1
+
+#ifdef WIN32
+# include <win32lib.h>
+# include "config.h"
+#else
+
+#if defined(HAVE_CONFIG_H) || defined(CONFIG_H_NAME)
+# ifndef CONFIG_H_NAME
+# define CONFIG_H_NAME "config.h"
+# endif
+# ifndef HAVE_CONFIG_H
+# define HAVE_CONFIG_H 1
+# endif
+# include CONFIG_H_NAME
+#endif
+
+#endif
+
+#include <ctype.h>
+#include <math.h>
+#include <stdio.h>
+#ifdef HAVE_STDARG_H
+# include <stdarg.h>
+#else
+#error Sorry, ChkTeX needs an _ANSI_ compiler w/stdarg.h installed to compile.
+#endif
+#ifndef HAVE_VPRINTF
+#error Sorry, ChkTeX needs an _ANSI_ compiler w/vprintf() to compile.
+#endif
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#ifdef HAVE_LIMITS_H
+# include <limits.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#include "chktypes.h"
+#ifndef __NOPROTO
+# ifndef __PROTO
+# define __PROTO(a) a
+# endif
+#else
+# ifndef __PROTO
+# define __PROTO(a) ()
+# endif
+#endif
+#ifndef LONG_MAX
+# define LONG_MAX (0x7fffffff)
+#endif
+#ifndef CHAR_BIT
+# define CHAR_BIT (8)
+#endif
+#ifndef FINDERRS_H
+# include "FindErrs.h"
+#endif /* FINDERRS_H */
+
+#ifndef CDECL
+#define CDECL
+#endif
+
+/*
+ * Define aliases for preprocessor statements
+ */
+
+#if defined(__unix__) || defined(__unix) || defined(unix)
+#undef __unix__
+#define __unix__ 1
+#elif defined(AMIGA) || defined(__AMIGA) || defined(__amigados__)
+#undef AMIGA
+#define AMIGA 1
+#elif defined(MSDOS) || defined(__MSDOS__) || defined(__msdos__)
+#undef __MSDOS__
+#define __MSDOS__ 1
+#endif
+
+/*
+ * The next macro should contain a list of characters LaTeX (and you?)
+ * considers as an end-of-sentence characters, which should be
+ * detected when whether sentence spacing is correct.
+ *
+ */
+
+#define LATEX_EOSPUNC CHAR('.') CHAR(':') CHAR('?') CHAR('!')
+
+/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */
+
+/*
+ * The next macro should contain general punctuation characters
+ * used on your system.
+ */
+
+#define LATEX_GENPUNC LATEX_EOSPUNC CHAR(',') CHAR(';')
+
+
+/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */
+
+/*
+ * The next macro should contain a list of characters LaTeX (and you?)
+ * considers as an small punctuation characters, which should not be
+ * preceded by a \/.
+ */
+
+#define LATEX_SMALLPUNC CHAR('.') CHAR(',')
+
+/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */
+
+/*
+ * NOTE: All macros below should return FALSE (0) if the input
+ * character is 0.
+ *
+ * The next macro should return TRUE if LaTeX (and you?) considers
+ * the character `c' as a space, which should be detected when
+ * we're checking whether commands are terminated by spaces.
+ *
+ * Note: If you wish to change this macro, you'll have to update
+ * the main loop in FindErrs.c as well.
+ */
+
+#define LATEX_SPACE(c) (c > 0 && c <= ' ')
+
+/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */
+
+
+
+
+
+
+#define betw(a,b,c) ((a < b) && (b < c))
+#define within(a,b,c) ((a <= b) && (b <= c))
+#define elif else if
+
+#ifndef NOT
+# define NOT(a) (!(a))
+#endif
+#define ifn(a) if(NOT(a))
+
+#ifndef min
+# define min(a,b) ((a)<=(b)?(a):(b))
+#endif
+
+#ifndef max
+# define max(a,b) ((a)>(b)?(a):(b))
+#endif
+
+#ifndef abs
+# define abs(a) (a>=0?a:(-a))
+#endif
+
+#define LOOP(name, body) {{body} _end__##name:;}
+#define LAST(name) goto _end__##name
+
+#define NUMBRACKETS 6
+
+#define NEWBUF(name,len) \
+static TEXT _ ## name [len + (WALLBYTES<<1)] = {0}; \
+const STRPTR name = &_ ## name[WALLBYTES]
+
+#define INTFAULTMSG "INTERNAL FAULT OCCURED! PLEASE SUBMIT A BUG REPORT!\n"
+
+#define INTERNFAULT INTFAULTMSG
+
+#define BITDEF1(a) BIT_ ## a
+#define BITDEF2(a) FLG_ ## a = (1<<BIT_ ## a)
+
+/*
+ * Debugging info
+ */
+
+#define DEBUGBITS(a) enum a { \
+ BIT(DbgMsgs), /* Dump messages */ \
+ BIT(DbgListInfo), /* Dump list info */ \
+ BIT(DbgListCont), /* Dump list contents */ \
+ BIT(DbgOtherInfo), /* Dump misc. other info */ \
+ BIT(DbgRunTime) /* Dump runtime info */ \
+};
+
+#undef BIT
+#define BIT BITDEF1
+DEBUGBITS(Debug_BIT)
+#undef BIT
+#define BIT BITDEF2
+DEBUGBITS(Debug_FLG)
+
+#ifdef STRIP_DEBUG
+# define DEBUG(a)
+#else
+# define DEBUG(a) if(DebugLevel & FLG_DbgRunTime) ErrPrintf a
+#endif
+
+#define PRGMSGS \
+ MSG(pmMinFault, etWarn, TRUE, 0, INTERNFAULT)\
+ MSG(pmNoFileMatch, etWarn, TRUE, 0,\
+ "No files matched the pattern `%s'.")\
+ MSG(pmNoTeXOpen, etWarn, TRUE, 0,\
+ "Unable to open the TeX file `%s'.")\
+ MSG(pmRename, etMsg, TRUE, 0,\
+ "Renaming `%s' as `%s'.")\
+ MSG(pmRenameErr, etErr, TRUE, 0,\
+ "Could not rename `%s' to `%s'.")\
+ MSG(pmOutOpen, etErr, TRUE, 0,\
+ "Unable to open output file.")\
+ MSG(pmOutTwice, etErr, TRUE, 0,\
+ "You can specify output file only once.")\
+ MSG(pmStrDupErr, etErr, TRUE, 0,\
+ "Unable to duplicate strings - no memory?")\
+ MSG(pmWordListErr, etErr, TRUE, 0,\
+ "Unable to create wordlist - no memory?")\
+ MSG(pmNoStackMem, etErr, TRUE, 0,\
+ "Unable to create stack - no memory?\n")\
+ MSG(pmWarnNumErr, etErr, TRUE, 0,\
+ "Illegal warning number used.")\
+ MSG(pmVerbLevErr, etErr, TRUE, 0,\
+ "Illegal verbosity level.")\
+ MSG(pmNotPSDigit, etWarn, TRUE, 0,\
+ "`%c' is not a %s digit - ignored!")\
+ MSG(pmEscCode, etWarn, TRUE, 0,\
+ "Unknown escape code `%c%c' - ignored!")\
+ MSG(pmKeyWord, etErr, TRUE, 0,\
+ "Unsupported control word (`%s') encountered in file `%s'.")\
+ MSG(pmFaultFmt, etErr, TRUE, 0,\
+ "\"%s\", line %d: Faulty format - unexpected %s found.")\
+ MSG(pmRsrcOpen, etWarn, TRUE, 0,\
+ "Could not open `%s', may cause unwanted behaviour.")\
+ MSG(pmSlowAbbr, etMsg, FALSE, 0,\
+ "The abbreviation `%s' requires slow abbreviation searching.")\
+ MSG(pmEmptyToken, etWarn, TRUE, 0,\
+ "Empty token isolated in `%s' - probably faulty format")\
+ MSG(pmAssert, etErr, TRUE, 0,\
+ "Assertion failed. Please report bug.")\
+ MSG(pmNoRsrc, etWarn, TRUE, 0,\
+ "Could not find global resource file.")\
+ MSG(pmQuoteStyle, etWarn, TRUE, 0,\
+ "Illegal quotestyle `%s'.")\
+ MSG(pmWrongWipeTemp, etWarn, TRUE, 0,\
+ "Wrong template for wiping arguments, \"%s\"")\
+ MSG(pmSpecifyTerm, etErr, TRUE, 0,\
+ "Specify a terminal type with `setenv TERM <yourtype>'.")\
+ MSG(pmNoTermData, etErr, TRUE, 0,\
+ "Could not access the termcap data base.")\
+ MSG(pmNoTermDefd, etErr, TRUE, 0,\
+ "Terminal type `%s' is not defined.")\
+ MSG(pmNoRegExp, etWarn, TRUE, 0,\
+ "Regular expressions not compiled in. Please recompile.")\
+ MSG(pmNoCommon, etErr, TRUE, 0,\
+ "`%s' can't be a member of both `%s' and `%s'.") \
+ MSG(pmNoOpenDir, etWarn, TRUE, 0, \
+ "Could not open the directory `%s'.") \
+ MSG(pmNoDebugFlag, etWarn, TRUE, 0, \
+ "This version of doesn't support the -d flag. Please recompile.")
+
+
+#undef MSG
+#define MSG(num, type, inuse, ctxt, text) num,
+
+enum PrgErrNum {
+ PRGMSGS
+ pmMaxFault
+};
+#undef MSG
+
+extern struct ErrMsg PrgMsgs [pmMaxFault + 1];
+
+struct ErrInfo {
+ STRPTR Data, LineBuf, File;
+ ULONG Line, Column, ErrLen;
+ enum
+ {
+ efNone = 0x00,
+ efNoItal = 0x01,
+ efItal = 0x02
+ } Flags;
+};
+
+extern const STRPTR
+ ReadBuffer,
+ CmdBuffer,
+ TmpBuffer;
+
+extern const
+ TEXT BrOrder[NUMBRACKETS + 1];
+
+extern
+ ULONG Brackets [NUMBRACKETS];
+
+
+extern FILE *OutputFile, *InputFile;
+
+#define OPTION_DEFAULTS \
+ DEF(BOOL, GlobalRC, TRUE) \
+ DEF(BOOL, WipeVerb, TRUE) \
+ DEF(BOOL, BackupOut, TRUE) \
+ DEF(BOOL, Quiet, FALSE) \
+ DEF(BOOL, LicenseOnly, FALSE) \
+ DEF(BOOL, UsingStdIn, FALSE) \
+ DEF(BOOL, InputFiles, TRUE) \
+ DEF(BOOL, HeadErrOut, TRUE) \
+ DEF(STRPTR, OutputName, "") \
+ DEF(STRPTR, PseudoInName, NULL) \
+ DEF(STRPTR, OutputFormat, VerbNormal) \
+ DEF(STRPTR, PipeOutputFormat, NULL) \
+ DEF(STRPTR, Delimit, ":") \
+ DEF(LONG, DebugLevel, 0)
+
+#define STATE_VARS \
+ DEF(enum ItState, ItState, itOff) /* Are we doing italics? */ \
+ DEF(BOOL, AtLetter, FALSE) /* Whether `@' is a letter or not. */ \
+ DEF(BOOL, InHeader, TRUE) /* Whether we're in the header */ \
+ DEF(BOOL, VerbMode, FALSE) /* Whether we're in complete ignore-mode */ \
+ DEF(LONG, MathMode, 0) /* Whether we're in math mode or not */ \
+ DEF(STRPTR, VerbStr, "") /* String we'll terminate verbmode upon */ \
+ DEF(ULONG, ErrPrint, 0) /* # errors printed */ \
+ DEF(ULONG, WarnPrint, 0) /* # warnings printed */ \
+ DEF(ULONG, UserSupp, 0) /* # user suppressed warnings */
+
+#define DEF(type, name, value) extern type name;
+OPTION_DEFAULTS
+STATE_VARS
+#undef DEF
+
+extern struct Stack
+ CharStack,
+ InputStack,
+ EnvStack;
+
+enum Quote {
+ quLogic,
+ quTrad
+};
+
+extern enum Quote Quote;
+extern BOOL StdInTTY, StdOutTTY, UsingStdIn;
+
+int main __PROTO((int argc, char **argv));
+void PrintPrgErr __PROTO((enum PrgErrNum , ...));
+void ErrPrintf __PROTO((const char *fmt, ...));
+
+extern TEXT LTX_EosPunc[], LTX_GenPunc[], LTX_SmallPunc[];
+extern STRPTR PrgName;
+
+#endif /* CHKTEX_H */
diff --git a/Build/source/texk/chktex/chktexrc b/Build/source/texk/chktex/chktexrc
new file mode 100644
index 00000000000..59b840412d6
--- /dev/null
+++ b/Build/source/texk/chktex/chktexrc
@@ -0,0 +1,670 @@
+##
+## ChkTeX v1.5, example resource file for ChkTeX.
+## Copyright (C) 1995-96 Jens T. Berger Thielemann
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+##
+## Contact the author at:
+## Jens Berger
+## Spektrumvn. 4
+## N-0666 Oslo
+## Norway
+## E-mail: <jensthi@ifi.uio.no>
+##
+
+#####################################################################
+#
+# Note: The format has changed slightly (again). The { ... }
+# syntax does now mean case-sensitive comparing, while [ ... ] means
+# case-insensitive comparing of the keywords. Case-insensitive
+# comparing of the keywords is only supported on a few of the
+# keywords (it's not meaningful in all contexts, and it slows ChkTeX
+# down). Keywords supporting this are marked throughout the file.
+#
+# You may also reset a list by saying "KEYWORD = { ... }"; it will
+# then be set equal to the contents of the list you specify.
+#
+# Comments begin with `#', and continues for the rest of the line.
+# Blank lines plus leading and trailing spaces are of course ignored.
+#
+# The general format of this file is the following:
+#
+# KEYWORD { item item ...} [ item item ... ] /* Adds items */
+#
+# KEYWORD [ item item ...] { item item ... } /* Adds items */
+#
+# KEYWORD = item
+#
+# KEYWORD = { item item ... } /* Clears list before adding */
+#
+# KEYWORD = [ item item ... ] /* Clears list before adding */
+#
+# This does _not_ mean that you may alternate the forms; certain
+# keywords demands a list, other a single value. You thus have to
+# look at the examples of their use.
+#
+# Please also note that if you specify a list-keyword twice, we'll
+# concatenate the lists. If you you specify a item-keyword twice,
+# we'll kill the previous value.
+#
+# We are slightly context-sensitive when detecting tokens like "}"
+# and "]"; they have to be preceded by a space. This generally makes
+# life easier.
+#
+# Items are separated by spaces. Newlines are considered as spaces,
+# but can't be escaped. You may surround items with quotes (`"') to
+# easily put spaces into them.
+#
+# Escape sequences available:
+#
+# Sequence Resulting character
+# ! A space (type `! ', not just a exclamation mark)
+# !" "
+# !# #
+# !! !
+# !{ {
+# !} }
+# ![ [
+# !] ]
+# != =
+# !b Backspace
+# !n New line
+# !r Carriage return
+# !t Tab
+# !f Form feed
+# !xNN NN must be a hexadecimal number (00 - ff),
+# _both_ characters must be included.
+# !dNNN DDD must be a decimal number (000 - 255), all
+# three characters must be included. Unspecified
+# results if DDD > 255.
+# !NNN DDD must be a octal number (000 - 377), all
+# three characters must be included. Unspecified
+# results if DDD > 377.
+#
+# Minor note: As you can see, most of these escape sequences are
+# equal to those in C (with some extensions); however, we use !
+# instead of \ as escape character for obvious reasons.
+#
+#
+# Quick summary of keywords follows. Keywords marked with a * accept
+# keywords accepting case-insensitive lists.
+#
+# Abbrev* - A list of abbreviations not automatically catched.
+# CenterDots - Commands/characters which should have \cdots in
+# between.
+# CmdLine - Default commandline options. These will be
+# processed before the ones you give on the command
+# line.
+# HyphDash \
+# NumDash - No. of dashes allowed in different contexts.
+# WordDash /
+# IJAccent - Commands which puts an accent _over_ their
+# argument.
+# Italic - Commands immediately turning on italic mode.
+# ItalCmd - Commands putting their argument into italic.
+# Linker - Commands which should have a non-breaking space in
+# front.
+# LowDots - Commands/characters which should have \ldots in
+# between.
+# MathEnvir - Environments which turn on math mode.
+# MathRoman - Mathematical operators with LaTeX replacement
+# defined.
+# NoCharNext - Insists on that certain commands aren't followed by
+# certain characters.
+# NonItalic - Commands immediately turning off italic mode.
+# NotPreSpaced- Commands which should not have a space in front of
+# them.
+# Primitives - Primitive TeX commands.
+# PostLink - Commands which generates a page reference.
+# OutFormat - Formats to use for output. See the -f & -v switch
+# in the main doc.
+# QuoteStyle - Either "Traditional" or "Logical". See main doc,
+# warning 38.
+# Silent - These commands do not produce any textual output;
+# and are thus allowed to have a space after them.
+# TabSize - Tab size you are using.
+# TeXInputs - Paths to search \input and \include files for.
+# UserWarn* - These strings will be searched for throughout the
+# text.
+# VerbEnvir - Environments which contents should be ignored.
+# VerbClear - String we will overwrite unwanted data with.
+# WipeArg - Commands (with arguments) which should be ignored
+# in the checking.
+#
+
+
+#####################################################################
+#
+# Enter which type of quote-style you are using here. Currently, we
+# support the following styles:
+#
+# Style Example of use
+# Traditional "An example," he said, "would be great."
+# Logical "An example", he said, "would be great".
+#
+
+QuoteStyle = Logical
+
+#####################################################################
+#
+# Enter here what interval you have between your tabs. Only regular
+# intervals are supported.
+#
+
+TabSize = 8
+
+#####################################################################
+#
+# Here, you can put default commandline options; most users would for
+# instance like to put -v2 here.
+#
+
+CmdLine
+{
+
+}
+
+#####################################################################
+#
+# These patterns will be searched for through the text; no matter
+# whether they appear as normal text, commands or whatever.
+# Currently case-sensitive.
+#
+# I usually define a special command like this:
+#
+# \def\unknown{\large\bf??}
+#
+# which I use whenever there is some information I don't have at the
+# moment of writing. Thus, it makes sense to search for it.
+#
+# You should be able to develop your own uses for this.
+#
+
+UserWarn
+{
+
+ \unknown
+###
+#
+# Another example; one should write \chktex or Chk\TeX - never ChkTeX.
+#
+###
+
+ ChkTeX
+}
+[
+
+###
+#
+# You may put case-insensitive patterns here.
+#
+###
+
+]
+
+#####################################################################
+#
+# Here you can list the path of where ChkTeX should look for files it
+# \inputs. The // postfix is now supported; if you append a double
+# path-separator we'll recursively search that directory directories.
+# MS-DOS users must append \\ instead, e.g. "C:\EMTEX\\".
+#
+# If you under either MS-DOS or UNIX wish to search an entire
+# partition or the complete directory tree, you must use *three*
+# slashes, e.g. "c:\\\" or "///". This may be considered to be a bug.
+#
+# By default, we'll search the current directory (not recursively,
+# put "//" in the list for this); any paths specified below will be
+# searched in addition to this.
+#
+
+TeXInputs
+{
+
+}
+
+#####################################################################
+#
+# Here you may specify more outputformats for use with the -v option,
+# it simply indexes into this list. Remember to use ! instead of \,
+# though.
+#
+# For explanation of how % fields expand; look at ChkTeX.{dvi,ps}.
+#
+# We will by default select entry number _two_ in this list (we count
+# from 0), and -v without any parameter selects entry number _three_.
+#
+
+OutFormat
+{
+
+# -v0; silent mode
+%f%b%l%b%c%b%n%b%m!n
+
+# -v1; normal mode
+"%k %n in %f line %l: %m!n%r%s%t!n%u!n"
+
+# -v2; fancy mode
+"%k %n in %f line %l: %m!n%r%i%s%I%t!n!n"
+
+# -v3; lacheck mode
+"!"%f!", line %l: %m!n"
+
+# -v4; verbose lacheck mode
+"!"%f!", line %l: %m!n%r%s%t!n%u!n"
+
+}
+
+
+
+#####################################################################
+#
+# These commands should be ignored when detecting whether a command
+# is ended by a space.
+#
+
+Silent
+{
+ \rm \em \bf \it \sl \sf \sc \tt \selectfont
+ \rmfamily \sffamily \ttfamily \mdseries \bfseries
+ \slshape \scshape \relax
+ \vskip \pagebreak \nopagebreak
+
+ \textrm \textem \textbf \textit \textsl \textsf \textsc \texttt
+
+ \clearpage \ddots \dotfill \flushbottom \fussy \indent \linebreak
+ \onecolumn \pagebreak \pushtabs \poptabs \scriptsize \sloppy
+ \twocolumn \vdots
+ \today \kill \newline \thicklines \thinlines
+
+ \columnsep \space \item \tiny \footnotesize \small \normalsize
+ \normal \large \Large \LARGE \huge \Huge \printindex
+
+ \newpage \listoffigures \listoftables \tableofcontents
+ \maketitle \makeindex
+
+ \hline \hrule \vrule
+
+ \centering
+
+ \bigskip \medskip \smallskip
+
+ \noindent \expandafter
+
+ \makeatletter \makeatother
+
+ \columnseprule
+
+ \textwidth \textheight \hsize \vsize
+
+ \if \fi
+
+ \csname \endcsname
+
+ \z@ \p@ \@warning \typeout
+
+ \dots \ldots \input \endinput \nextline \leavevmode \cdots
+- \appendix \listfiles \and \quad
+ \vfill \vfil \hfill \hfil \topmargin \oddsidemargin
+ \frenchspacing \nonfrenchspacing
+ \begingroup \endgroup \par
+
+ \vrefwarning \upshape \headheight \headsep \hoffset \voffset
+ \cdot \qquad
+ \left \right
+}
+
+#####################################################################
+#
+# Here, you can specify the length of various dashes. We sort the
+# dash according to which type of characters that are on the left and
+# right of of it. We are only conclusive if they are the same.
+#
+# We associate as follows:
+#
+# Name Type of character on each side
+# HyphDash Alphabetic (foo-bar)
+# NumDash Numeric (2--3)
+# WordDash Space (like this --- see?)
+#
+# Below you specify how many dashes which are legal in each case. We
+# define 0 as an magic constant which always generates an error. You
+# may specify more than one legal dash-length.
+#
+# Let's look at an example. You use the following dash-syntax:
+#
+# foo-bar
+# 2--3
+# like this---see?
+#
+#
+# HYPHDASH { 1 3 } # Either a hyphen, or inter-word
+# NUMDASH { 2 } # Between words
+# WORDDASH { 0 } # We never use this
+#
+
+HyphDash
+{
+ 1
+}
+
+NumDash
+{
+ 2
+}
+
+WordDash
+{
+ 3
+}
+
+#####################################################################
+#
+# This keyword indicates commands which argument isn't LaTeX code,
+# and which thus should be ignored.
+#
+# After the command, you may place arguments that you wish that
+# should be wiped in the process; use [] for optional arguments, {}
+# for required ones and * if the command supports an alternative
+# variant. These should be separated from the command with a colon.
+#
+# For instance, if you would like to wipe the \newcommand command,
+# you would declare it as \newcommand:*[][]{}
+#
+# These commands may be "executed" before they're wiped, so you will
+# typically also wish to list filehandling commands and similar here.
+#
+
+WipeArg
+{
+ \label:{} \ref:{} \vref:{} \pageref:{} \index:{} \cite:[]{}
+ \input:{} \verbatiminput:[]{} \listinginput:[]{}{}
+ \verbatimtabinput:[]{} \include:{} \includeonly:{}
+ \bibitem:[]{}
+}
+
+#####################################################################
+#
+# These environments contains material which will be typeset as
+# mathematics by LaTeX. This turns on/off some warnings.
+#
+# We will automagically append a * to each keyword.
+#
+
+MathEnvir
+{
+ displaymath math eqnarray array equation
+}
+
+#####################################################################
+#
+# These environments contains material which contents should be
+# ignored.
+#
+# We will automagically append a * to each keyword.
+#
+
+VerbEnvir
+{
+ verbatim comment listing verbatimtab rawhtml errexam picture texdraw
+}
+
+#####################################################################
+#
+# ChkTeX does automagically catch most abbreviations; the ones we
+# need to list here, are those which are most likely to be followed
+# by a word with an upper-case letter (that is not the beginning of a
+# new sentence).
+#
+# The case-insensitive abbreviations are not really case-insensitive,
+# it seems to be more practical to only let the first character be
+# case-insensitive, while the remaining are case-sensitive.
+#
+# To speed up the searching process somewhat, we require that these
+# end in a `.', this should not be a problem.
+#
+# Much of this work (both the abbreviations below, and the regexps
+# necessary to catch the remaining automatically) have been provided
+# by Russ Bubley, <russ@scs.leeds.ac.uk>.
+#
+
+
+Abbrev
+{
+# Ordinals
+1st. 2nd. 3rd. 4th.
+# Titles
+Mr. Mrs. Miss. Ms. Dr. Prof. St.
+
+#
+# Days
+# Mon. Tue. Wed. Thu. Fri. Sat. Sun.
+#
+# Months
+# Jan. Feb. Mar. Apr. May. Jun. Jul. Aug. Sep. Oct. Nov. Dec.
+#
+# Letters
+# Kt. Jr.
+#
+# Corporate
+# Co. Ltd.
+#
+# Addresses
+# Rd. Dr. St. Ave. Cres. Gdns. Sq. Circ. Terr. Pl. Arc. La. Clo. Ho. Est. Gn.
+#
+# Misc.
+# oe. pbab. ps. rsvp. Tx.
+}
+[
+###
+#
+# The first letter is case-insensitive in the abbrevs in this
+# list. Due to the nature of the checking algorithm used for
+# this, entries consisting of only one character will be
+# silently ignored.
+#
+##
+
+# Latin
+# cf. "et al." etc. qed. qv. viz.
+#
+# Corporate
+# inc. plc.
+#
+# Misc
+# fax. pcs. qty. tel. misc.
+]
+
+#####################################################################
+#
+# Commands which accent characters, meaning that \i or \j (\imath and
+# \jmath in mathmode) should be used instead of `i' and `j'
+#
+
+IJAccent
+{
+ \hat \check \breve \acute \grave \tilde \bar \vec \dot \ddot
+
+ \' \` \^ \" \~ \= \. \u \v \H \t
+
+###
+#
+# The remaining accent commands (\c,\d,\b) put their accent _under_
+# the character, not above, and should thus be used with normal i's
+# and j's.
+#
+###
+
+}
+
+#####################################################################
+#
+# Commands which, when the group is terminated, needs italic
+# correction.
+#
+
+Italic
+{
+ \it \em \sl
+}
+
+#####################################################################
+#
+# Commands which makes the font non-italic.
+#
+
+NonItalic
+{
+ \bf \rm \sf \tt \sc
+}
+
+#####################################################################
+#
+# Commands which puts their argument into italic (and thus possibly
+# needs italic correction in the end.
+#
+
+ItalCmd
+{
+ \textit \textsl \emph
+}
+
+#####################################################################
+#
+# These commands all have in common that a pagebreak right in front
+# of them is highly undesirable; thus there should be no space in
+# front of them.
+#
+
+PostLink
+{
+ \index \label
+}
+
+#####################################################################
+#
+# These commands should not have a space in front of them for various
+# reasons. I.e. much the same as POSTLINK, but produces another
+# warning.
+#
+
+NotPreSpaced
+{
+ \footnote \footnotemark \/
+}
+
+#####################################################################
+#
+# The commands listed here, should be prepended with a `~', as in
+# "look in table~\ref{foo}", to avoid the references being split
+# across lines.
+#
+
+Linker
+{
+ \ref \vref \pageref \cite
+}
+
+#####################################################################
+#
+# Commands/characters which should have \cdots in between, e.g.
+# $1+2+3+\cdots+n$.
+#
+
+CenterDots
+{
+ = + - \cdot \div & \times \geq \leq < >
+}
+
+#####################################################################
+#
+# Commands/characters which should have \ldots in between, e.g.
+# $1,2,3,\ldots,n$.
+#
+
+LowDots
+{
+ . , ;
+}
+
+#####################################################################
+#
+# In maths mode, there are certain aliases for mathematical operators
+# like sin, cos, etc. Ignore the leading backslash in the commands,
+# and so forth. You should list these below.
+#
+
+MathRoman
+{
+ log lg ln lim limsup liminf sin arcsin sinh cos arccos cosh tan
+ arctan tanh cot coth sec csc max min sup inf arg ker dim hom det
+ exp Pr gcd deg bmod pmod mod
+}
+
+#####################################################################
+#
+# These TeX commands have become unnecessary, as there are LaTeX cmds
+# that does the same. Purists should thus avoid these in their code.
+#
+# (These are a spell-corrected version of those lacheck uses).
+#
+
+Primitives
+{
+ \above \advance \catcode \chardef \closein \closeout \copy \count
+ \countdef \cr \crcr \csname \delcode \dimendef \dimen \divide
+ \expandafter \font \hskip \vskip \openout
+}
+
+#####################################################################
+#
+# Format: \command:characters
+#
+# We'll emit a warning if any of characters are found after the
+# command.
+#
+
+NoCharNext
+{
+ \left:{}$ \right:{}$
+}
+
+#####################################################################
+#
+# We're killing \verb@...@ commands and the arguments of the commands
+# listed above in WIPEARG by overwriting them with a string or a
+# single character.
+#
+# This should not contain an alphabetic character (in case the user
+# writes (\foo\verb@bar@), neither should it contain be one of LaTeX'
+# reserved characters (`#$%&~_^\{}'), or any parenthesis character
+# ('()[]{}'). If possible, don't use a punctuation character,
+# either, or any spacing character.
+#
+# The asterix is also unsuitable, as some commands behave in another
+# way if they are postpended with an asterix. Which more or less
+# leaves us with the pipe.
+#
+# Please note that this may also be a _string_, which will be
+# repeated until the proper length is reached.
+#
+
+VerbClear = "|"
+
+#
+# All for now - have fun.
+#
+#####################################################################
+
diff --git a/Build/source/texk/chktex/chktypes.h b/Build/source/texk/chktex/chktypes.h
new file mode 100644
index 00000000000..2ab6ec4736e
--- /dev/null
+++ b/Build/source/texk/chktex/chktypes.h
@@ -0,0 +1,76 @@
+/*
+ * Clone of <exec/types.h>, which could not be included because it's
+ * (c) Commodore/Escom/Amiga/whatever.
+ *
+ */
+
+#ifndef EXEC_TYPES_H
+#define EXEC_TYPES_H
+
+#define GLOBAL extern /* the declaratory use of an external */
+#define IMPORT extern /* reference to an external */
+#define STATIC static /* a local static variable */
+#define REGISTER register /* a (hopefully) register variable */
+
+#ifndef VOID
+# define VOID void
+#endif
+
+
+typedef void* APTR; /* Address pointer */
+
+#ifndef WIN32
+typedef unsigned long ULONG;
+typedef long LONG;
+#endif
+
+#ifdef AMIGA
+typedef unsigned long LONGBITS; /* Longword accessed bitwise */
+#endif
+
+#ifndef WIN32
+typedef short WORD;
+#endif
+typedef unsigned short UWORD;
+typedef unsigned short WORDBITS;
+
+typedef unsigned char UBYTE;
+typedef unsigned char BYTEBITS;
+
+typedef unsigned short RPTR; /* relative pointer */
+
+
+#ifndef WIN32
+#if __STDC__
+typedef signed char BYTE;
+#else
+typedef char BYTE;
+#endif
+#endif
+
+#if defined(__cplusplus) || defined(AMIGA)
+typedef unsigned char TEXT;
+#else
+typedef char TEXT;
+#endif
+
+typedef TEXT * STRPTR; /* pointer to a string */
+
+#ifndef WIN32
+typedef float FLOAT;
+typedef double DOUBLE;
+typedef short BOOL; /* Boolean value */
+#endif
+
+#ifndef TRUE
+# define TRUE 1L
+#endif
+#ifndef FALSE
+# define FALSE 0L
+#endif
+#ifndef NULL
+# define NULL (void *) 0L
+#endif
+
+
+#endif
diff --git a/Build/source/texk/chktex/chkweb b/Build/source/texk/chktex/chkweb
new file mode 100644
index 00000000000..cbc0caa780d
--- /dev/null
+++ b/Build/source/texk/chktex/chkweb
@@ -0,0 +1,56 @@
+#! /bin/sh
+
+# ChkWEB v1.0, runs the LaTeX parts of a CWEB file through ChkTeX.
+# Copyright (C) 1996 Jens T. Berger Thielemann
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# Contact the author at:
+# Jens Berger
+# Spektrumvn. 4
+# N-0666 Oslo
+# Norway
+# E-mail: <jensthi@ifi.uio.no>
+
+
+params=
+
+for p
+do
+ case $p in
+ --) break
+ ;;
+ -*) params="$params $p"
+ shift
+ ;;
+ *) break
+ ;;
+ esac
+done
+
+
+if test "$1" = ""; then
+ deweb | chktex -v3 $params
+else
+ for file
+ do
+ if test -f $file; then
+ deweb $file | chktex -p $file -v3 $params
+ else
+ deweb $file.w | chktex -p $file.w -v3 $params
+ fi
+ done
+fi
+
diff --git a/Build/source/texk/chktex/config.h.in b/Build/source/texk/chktex/config.h.in
new file mode 100644
index 00000000000..fce5fcaa508
--- /dev/null
+++ b/Build/source/texk/chktex/config.h.in
@@ -0,0 +1,127 @@
+/*
+ * ChkTeX v1.5, configuration file.
+ * Copyright (C) 1995-96 Jens T. Berger Thielemann
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Contact the author at:
+ * Jens Berger
+ * Spektrumvn. 4
+ * N-0666 Oslo
+ * Norway
+ * E-mail: <jensthi@ifi.uio.no>
+ *
+ *
+ */
+
+/* Define to empty if the keyword does not work. */
+#undef const
+
+/* Define to `unsigned' if <sys/types.h> doesn't define. */
+#undef size_t
+
+/* Define if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Define as __inline if that's what the C compiler calls it. */
+#undef inline
+
+/* Define if you don't have vprintf but do have _doprnt. */
+#undef HAVE_DOPRNT
+
+/* Define if you have the vprintf function. */
+#undef HAVE_VPRINTF
+
+/* Define if you have the access function. */
+#undef HAVE_ACCESS
+
+/* Define if you have the closedir function. */
+#undef HAVE_CLOSEDIR
+
+/* Define if you have the fileno function. */
+#undef HAVE_FILENO
+
+/* Define if you have the isatty function. */
+#undef HAVE_ISATTY
+
+/* Define if you have the opendir function. */
+#undef HAVE_OPENDIR
+
+/* Define if you have the readdir function. */
+#undef HAVE_READDIR
+
+/* Define if you have the stat function. */
+#undef HAVE_STAT
+
+/* Define if you have the strcasecmp function. */
+#undef HAVE_STRCASECMP
+
+/* Define if you have the strdup function. */
+#undef HAVE_STRDUP
+
+/* Define if you have the strlwr function. */
+#undef HAVE_STRLWR
+
+/* Define if you have the strtol function. */
+#undef HAVE_STRTOL
+
+/* Define if you have the <dirent.h> header file. */
+#undef HAVE_DIRENT_H
+
+/* Define if you have the <sys/ndir.h> header file. */
+#undef HAVE_SYS_NDIR_H
+
+/* Define if you have the <sys/dir.h> header file. */
+#undef HAVE_SYS_DIR_H
+
+/* Define if you have the <ndir.h> header file. */
+#undef HAVE_NDIR_H
+
+/* Define if you have the <limits.h> header file. */
+#undef HAVE_LIMITS_H
+
+/* Define if you have the <stat.h> header file. */
+#undef HAVE_STAT_H
+
+/* Define if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define if you have the <stdarg.h> header file. */
+#undef HAVE_STDARG_H
+
+/* Define if you have the <sys/dir.h> header file. */
+#undef HAVE_SYS_DIR_H
+
+/* Define if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define if you have the <termcap.h> header file. */
+#undef HAVE_TERMCAP_H
+
+/* Define if you have the <termlib.h> header file. */
+#undef HAVE_TERMLIB_H
+
+/* Define if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define if you have the termcap library (-ltermcap). */
+#undef HAVE_LIBTERMCAP
+
+/* Define if you have the termlib library (-ltermlib). */
+#undef HAVE_LIBTERMLIB
+
+/* Define if you don't want runtime debugging compiled in */
+#undef STRIP_DEBUG
+
diff --git a/Build/source/texk/chktex/configure b/Build/source/texk/chktex/configure
new file mode 100755
index 00000000000..6f2bcd9c57c
--- /dev/null
+++ b/Build/source/texk/chktex/configure
@@ -0,0 +1,2536 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_help="$ac_help
+
+ --enable-lacheck-replace: Installs a lacheck replacement for the
+ AUC-TeX interface. (Default: no)."
+ac_help="$ac_help
+
+ --enable-emacs-hack: Installs a Elisp file, which makes ChkTeX
+ available in Emacs. Must be followed by
+ the path of your elisp files (e.g.
+ "--enable-emacs-hack=/usr/lib/emacs/").
+ (Default: no)."
+ac_help="$ac_help
+
+ --enable-debug-info: Compile in miscellaneous runtime debugging
+ information. (Default: yes)."
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+ac_config_files=
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+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=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) ac_optarg= ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case "$ac_option" in
+
+ -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 ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build="$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" ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir="$ac_optarg" ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ eval "enable_${ac_feature}=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix="$ac_optarg" ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he)
+ # 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 << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+ --cache-file=FILE cache test results in FILE
+ --help print this message
+ --no-create do not create output files
+ --quiet, --silent do not print \`checking...' messages
+ --version print the version of autoconf that created configure
+Directory and file names:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [same as prefix]
+ --bindir=DIR user executables in DIR [EPREFIX/bin]
+ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
+ --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data in DIR
+ [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data in DIR
+ [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
+ --libdir=DIR object code libraries in DIR [EPREFIX/lib]
+ --includedir=DIR C header files in DIR [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
+ --infodir=DIR info documentation in DIR [PREFIX/info]
+ --mandir=DIR man documentation in DIR [PREFIX/man]
+ --srcdir=DIR find the sources in DIR [configure dir or ..]
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM
+ run sed PROGRAM on installed program names
+EOF
+ cat << EOF
+Host type:
+ --build=BUILD configure for building on BUILD [BUILD=HOST]
+ --host=HOST configure for HOST [guessed]
+ --target=TARGET configure for TARGET [TARGET=HOST]
+Features and packages:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+EOF
+ if test -n "$ac_help"; then
+ echo "--enable and --with options recognized:$ac_help"
+ fi
+ exit 0 ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host="$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" ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ 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)
+ 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" ;;
+
+ -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 ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target="$ac_optarg" ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers)
+ echo "configure generated by autoconf version 2.13"
+ exit 0 ;;
+
+ -with-* | --with-*)
+ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_${ac_package}='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ eval "with_${ac_package}=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes="$ac_optarg" ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries="$ac_optarg" ;;
+
+ -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_envvar| sed 's/[_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: invalid variable name: $ac_envvar" 1>&2; exit 1; }
+ fi
+ ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+ eval "$ac_envvar='$ac_optarg'"
+ export $ac_envvar ;;
+
+ *)
+ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+ echo "configure: warning: $ac_option: invalid host type" 1>&2
+ fi
+ if test "x$nonopt" != xNONE; then
+ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+ fi
+ nonopt="$ac_option"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+ exec 6>/dev/null
+else
+ exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+ case "$ac_arg" in
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c) ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+ ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+ esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set. These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=ChkTeX.c
+
+# 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 its parent.
+ ac_prog=$0
+ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+ 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
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+ else
+ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+ fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ echo "loading site script $ac_site_file"
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+
+
+SCRIPTS=
+
+ELISPDIR=
+
+
+# Check whether --enable-lacheck-replace or --disable-lacheck-replace was given.
+if test "${enable_lacheck_replace+set}" = set; then
+ enableval="$enable_lacheck_replace"
+ :
+else
+ enable_lacheck_replace=no
+fi
+
+
+# Check whether --enable-emacs-hack or --disable-emacs-hack was given.
+if test "${enable_emacs_hack+set}" = set; then
+ enableval="$enable_emacs_hack"
+ :
+else
+ enable_emacs_hack=no
+fi
+
+
+# Check whether --enable-debug-info or --disable-debug-info was given.
+if test "${enable_debug_info+set}" = set; then
+ enableval="$enable_debug_info"
+ :
+else
+ enable_debug_info=yes
+fi
+
+
+if test "$silent" != "yes"; then
+cat <<EOF
+
+
+ ##### ### ### ######## ### ##
+ ### ## ## ## ## ## #0
+ @@ @@ @@@ @@ @@ @@ ####### @@ @
+ @@ @@@ @@ @@ @@ @@ ## # @@
+ && && && &&&& && @@ & &&
+ &&& && && && && && && @@@@ & &&
+ %%%%% %%% %%% %%% %%% %% && %%% %%%
+ && &
+ %%%%%%%
+
+ Welcome to the ChkTeX configuration script!
+ Before taking the program in use, please read the
+ COPYING file; it applies to this script as well
+ as the remaining parts of the package. In short:
+
+ *NO WARRANTIES WHATSOEVER*
+
+ Copyright © 1995-96
+ Jens T. Berger Thielemann
+ <jensthi@ifi.uio.no>
+EOF
+sleep 1
+cat <<EOF
+Supported features:
+ --enable-lacheck-replace: Installs a lacheck replacement for the
+ AUC-TeX interface. (Default: no).
+ --enable-debug-info: Compile in miscellaneous runtime debugging
+ information. (Default: yes).
+ --enable-emacs-hack: Installs a Elisp file, which makes ChkTeX
+ available in Emacs. Must be followed by
+ the path of your elisp files (e.g.
+ "--enable-emacs-hack=/usr/lib/emacs/").
+ (Default: no).
+EOF
+sleep 1
+fi
+
+echo $ac_n "checking whether lacheck replacement should be installed""... $ac_c" 1>&6
+echo "configure:626: checking whether lacheck replacement should be installed" >&5
+if test "$enable_lacheck_replace" = "yes"; then
+ SCRIPTS="$SCRIPTS lacheck"
+ echo "$ac_t""yes" 1>&6
+else
+ SCRIPTS=
+ echo "$ac_t""no" 1>&6
+fi
+
+echo $ac_n "checking whether runtime debug info should be used""... $ac_c" 1>&6
+echo "configure:636: checking whether runtime debug info should be used" >&5
+if test "$enable_debug_info" = "yes"; then
+ echo "$ac_t""yes" 1>&6
+else
+ cat >> confdefs.h <<\EOF
+#define STRIP_DEBUG 1
+EOF
+
+ echo "$ac_t""no" 1>&6
+fi
+
+echo $ac_n "checking whether the emacs hack should be installed""... $ac_c" 1>&6
+echo "configure:648: checking whether the emacs hack should be installed" >&5
+case $enable_emacs_hack in
+ no) echo "$ac_t""no" 1>&6
+ ;;
+ /*|*/*) ELISPDIR=$enable_emacs_hack
+ echo "$ac_t""yes" 1>&6
+ ;;
+ *) echo;
+ { echo "configure: error: --enable-emacs-hack needs the *full path* of Elisp files" 1>&2; exit 1; }
+ ;;
+esac
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:663: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ if test -z "$COMSPEC"; then ac_x=-f; else ac_x=-x; fi
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test $ac_x $ac_dir/$ac_word; then
+ ac_cv_prog_CC="gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:694: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_prog_rejected=no
+ if test -z "$COMSPEC"; then ac_x=-f; else ac_x=-x; fi
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test $ac_x $ac_dir/$ac_word; then
+ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ break
+ fi
+ done
+ IFS="$ac_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 $# -gt 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
+ set dummy "$ac_dir/$ac_word" "$@"
+ shift
+ ac_cv_prog_CC="$@"
+ fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ if test -z "$CC"; then
+ case "`uname -s`" in
+ *win32* | *WIN32*)
+ # Extract the first word of "cl", so it can be a program name with args.
+set dummy cl; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:746: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ if test -z "$COMSPEC"; then ac_x=-f; else ac_x=-x; fi
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test $ac_x $ac_dir/$ac_word; then
+ ac_cv_prog_CC="cl"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+ ;;
+ esac
+ fi
+ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:779: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext << EOF
+
+#line 790 "configure"
+#include "confdefs.h"
+
+main(){return(0);}
+EOF
+if { (eval echo configure:795: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ ac_cv_prog_cc_works=yes
+ # If we can't run a trivial program, we are probably using a cross compiler.
+ if (./conftest; exit) 2>/dev/null; then
+ ac_cv_prog_cc_cross=no
+ else
+ ac_cv_prog_cc_cross=yes
+ fi
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_cv_prog_cc_works=no
+fi
+rm -fr conftest*
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+if test $ac_cv_prog_cc_works = no; then
+ { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:821: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:826: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.c <<EOF
+#ifdef __GNUC__
+ yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:835: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ ac_cv_prog_gcc=yes
+else
+ ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+
+ac_test_CFLAGS="${CFLAGS+set}"
+ac_save_CFLAGS="$CFLAGS"
+CFLAGS=
+echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:854: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+ ac_cv_prog_cc_g=yes
+else
+ ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&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
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f $ac_dir/install-sh; then
+ case $ac_dir in
+ /*|[A-z]:/*) ac_aux_dir=$ac_dir;;
+ *) ac_aux_dir=`pwd`/$ac_dir;;
+ esac
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ case $ac_dir in
+ /*|[A-z]:/*) ac_aux_dir=$ac_dir;;
+ *) ac_aux_dir=`pwd`/$ac_dir;;
+ esac
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+# 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
+# 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"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:922: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":"
+ # Hack for MSDOS and descendants.
+ if test -z "$COMSPEC"; then ac_x=-f; else ac_x=-x; fi
+ for ac_dir in $PATH; do
+ # Account for people who put trailing slashes in PATH elements.
+ case "$ac_dir/" in
+ /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/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
+ if test $ac_x $ac_dir/$ac_prog; then
+ if test $ac_prog = install &&
+ grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ else
+ ac_cv_path_install="$ac_dir/$ac_prog -c"
+ break 2
+ fi
+ fi
+ done
+ ;;
+ esac
+ done
+ IFS="$ac_save_IFS"
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL="$ac_cv_path_install"
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL="$ac_install_sh"
+ fi
+fi
+echo "$ac_t""$INSTALL" 1>&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
+echo "configure:977: checking whether ln -s works" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ rm -f conftestdata
+# MS-DOS is a special case, because it sort of pretends that ln -s
+# works for executables.
+if test -z "$COMSPEC" && ln -s X conftestdata 2>/dev/null
+then
+ rm -f conftestdata
+ ac_cv_prog_LN_S="ln -s"
+else
+ ac_cv_prog_LN_S=ln
+fi
+fi
+LN_S="$ac_cv_prog_LN_S"
+if test "$ac_cv_prog_LN_S" = "ln -s"; then
+ echo "$ac_t""yes" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+for ac_prog in perl5 perl
+do
+# Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1004: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_PERL5'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$PERL5" in
+ /*|[A-z]:/*)
+ ac_cv_path_PERL5="$PERL5" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_PERL5="$PERL5" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ if test -z "$COMSPEC"; then ac_x=-f; else ac_x=-x; fi
+ ac_dummy="$PATH:/usr/bin:/usr/local/bin"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test $ac_x $ac_dir/$ac_word; then
+ ac_cv_path_PERL5="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac
+fi
+PERL5="$ac_cv_path_PERL5"
+if test -n "$PERL5"; then
+ echo "$ac_t""$PERL5" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+test -n "$PERL5" && break
+done
+test -n "$PERL5" || PERL5="no"
+
+if test "$PERL5" != no; then
+ echo $ac_n "checking whether perl is v5 or higher""... $ac_c" 1>&6
+echo "configure:1043: checking whether perl is v5 or higher" >&5
+ if $PERL5 -e 'exit($] >= 5)'; then
+ PERL5=no
+ echo "$ac_t""no" 1>&6
+ else
+ echo "$ac_t""yes" 1>&6
+ fi
+fi
+
+if test "$PERL5" != no; then
+ # Pull the hash mark out of the macro call to avoid m4 problems.
+ac_msg="whether #! works in shell scripts"
+echo $ac_n "checking $ac_msg""... $ac_c" 1>&6
+echo "configure:1056: checking $ac_msg" >&5
+if eval "test \"`echo '$''{'ac_cv_sys_interpreter'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo '#! /bin/cat
+exit 69
+' > conftest
+chmod u+x conftest
+(SHELL=/bin/sh; export SHELL; ./conftest >/dev/null)
+if test $? -ne 69; then
+ ac_cv_sys_interpreter=yes
+else
+ ac_cv_sys_interpreter=no
+fi
+rm -f conftest
+fi
+
+echo "$ac_t""$ac_cv_sys_interpreter" 1>&6
+interpval="$ac_cv_sys_interpreter"
+
+ if test "$ac_cv_sys_interpreter" = "yes"; then
+ SCRIPTS="$SCRIPTS chkweb deweb"
+ else
+ echo "configure: warning: deweb will not be installed since your system does" 1>&2
+ echo "configure: warning: not support the pound-bang notation." 1>&2
+ fi
+else
+ echo "configure: warning: deweb will not be installed since you do not have perl5." 1>&2
+fi
+
+for ac_prog in 'groff -man -P-bu -Tlatin1' 'nroff -man'
+do
+# Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1091: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_GROFF'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$GROFF"; then
+ ac_cv_prog_GROFF="$GROFF" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ if test -z "$COMSPEC"; then ac_x=-f; else ac_x=-x; fi
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test $ac_x $ac_dir/$ac_word; then
+ ac_cv_prog_GROFF="$ac_prog"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+GROFF="$ac_cv_prog_GROFF"
+if test -n "$GROFF"; then
+ echo "$ac_t""$GROFF" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+test -n "$GROFF" && break
+done
+test -n "$GROFF" || GROFF="'nroff -man'"
+
+
+# Extract the first word of "latex", so it can be a program name with args.
+set dummy latex; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1126: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_LATEX'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$LATEX" in
+ /*|[A-z]:/*)
+ ac_cv_path_LATEX="$LATEX" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_LATEX="$LATEX" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ if test -z "$COMSPEC"; then ac_x=-f; else ac_x=-x; fi
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test $ac_x $ac_dir/$ac_word; then
+ ac_cv_path_LATEX="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac
+fi
+LATEX="$ac_cv_path_LATEX"
+if test -n "$LATEX"; then
+ echo "$ac_t""$LATEX" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+# Extract the first word of "dvips", so it can be a program name with args.
+set dummy dvips; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1162: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_DVIPS'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$DVIPS" in
+ /*|[A-z]:/*)
+ ac_cv_path_DVIPS="$DVIPS" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_DVIPS="$DVIPS" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ if test -z "$COMSPEC"; then ac_x=-f; else ac_x=-x; fi
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test $ac_x $ac_dir/$ac_word; then
+ ac_cv_path_DVIPS="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac
+fi
+DVIPS="$ac_cv_path_DVIPS"
+if test -n "$DVIPS"; then
+ echo "$ac_t""$DVIPS" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+# Extract the first word of "lynx", so it can be a program name with args.
+set dummy lynx; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1199: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_LYNX'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$LYNX" in
+ /*|[A-z]:/*)
+ ac_cv_path_LYNX="$LYNX" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_LYNX="$LYNX" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ if test -z "$COMSPEC"; then ac_x=-f; else ac_x=-x; fi
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test $ac_x $ac_dir/$ac_word; then
+ ac_cv_path_LYNX="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac
+fi
+LYNX="$ac_cv_path_LYNX"
+if test -n "$LYNX"; then
+ echo "$ac_t""$LYNX" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+# Extract the first word of "latex2html", so it can be a program name with args.
+set dummy latex2html; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1235: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_LATEX2HTML'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$LATEX2HTML" in
+ /*|[A-z]:/*)
+ ac_cv_path_LATEX2HTML="$LATEX2HTML" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_LATEX2HTML="$LATEX2HTML" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ if test -z "$COMSPEC"; then ac_x=-f; else ac_x=-x; fi
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test $ac_x $ac_dir/$ac_word; then
+ ac_cv_path_LATEX2HTML="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac
+fi
+LATEX2HTML="$ac_cv_path_LATEX2HTML"
+if test -n "$LATEX2HTML"; then
+ echo "$ac_t""$LATEX2HTML" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+echo $ac_n "checking for tgetent in -ltermlib""... $ac_c" 1>&6
+echo "configure:1270: checking for tgetent in -ltermlib" >&5
+ac_lib_var=`echo termlib'_'tgetent | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-ltermlib $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1278 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char tgetent();
+
+int main() {
+tgetent()
+; return 0; }
+EOF
+if { (eval echo configure:1289: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_lib=HAVE_LIB`echo termlib | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+ LIBS="-ltermlib $LIBS"
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+echo $ac_n "checking for tgetent in -ltermcap""... $ac_c" 1>&6
+echo "configure:1317: checking for tgetent in -ltermcap" >&5
+ac_lib_var=`echo termcap'_'tgetent | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-ltermcap $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1325 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char tgetent();
+
+int main() {
+tgetent()
+; return 0; }
+EOF
+if { (eval echo configure:1336: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_lib=HAVE_LIB`echo termcap | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+ LIBS="-ltermcap $LIBS"
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:1365: checking how to run the C preprocessor" >&5
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ # This must be in double quotes, not single quotes, because CPP may get
+ # substituted into the Makefile and "${CC-cc}" will confuse make.
+ CPP="${CC-cc} -E"
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp.
+ cat > conftest.$ac_ext <<EOF
+#line 1380 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1386: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -E -traditional-cpp"
+ cat > conftest.$ac_ext <<EOF
+#line 1397 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1403: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -nologo -E"
+ cat > conftest.$ac_ext <<EOF
+#line 1414 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1420: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP=/lib/cpp
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+ ac_cv_prog_CPP="$CPP"
+fi
+ CPP="$ac_cv_prog_CPP"
+else
+ ac_cv_prog_CPP="$CPP"
+fi
+echo "$ac_t""$CPP" 1>&6
+
+echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
+echo "configure:1445: checking for ANSI C header files" >&5
+if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1450 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1458: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ ac_cv_header_stdc=yes
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 1475 "configure"
+#include "confdefs.h"
+#include <string.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "memchr" >/dev/null 2>&1; then
+ :
+else
+ rm -rf conftest*
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 1493 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "free" >/dev/null 2>&1; then
+ :
+else
+ rm -rf conftest*
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+if test "$cross_compiling" = yes; then
+ :
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1514 "configure"
+#include "confdefs.h"
+#include <ctype.h>
+#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#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)) exit(2);
+exit (0); }
+
+EOF
+if { (eval echo configure:1525: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ :
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_header_stdc=no
+fi
+rm -fr conftest*
+fi
+
+fi
+fi
+
+echo "$ac_t""$ac_cv_header_stdc" 1>&6
+if test $ac_cv_header_stdc = yes; then
+ cat >> confdefs.h <<\EOF
+#define STDC_HEADERS 1
+EOF
+
+fi
+
+ac_header_dirent=no
+for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6
+echo "configure:1553: checking for $ac_hdr that defines DIR" >&5
+if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1558 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <$ac_hdr>
+int main() {
+DIR *dirp = 0;
+; return 0; }
+EOF
+if { (eval echo configure:1566: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ eval "ac_cv_header_dirent_$ac_safe=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_dirent_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_dirent_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+ ac_header_dirent=$ac_hdr; break
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
+if test $ac_header_dirent = dirent.h; then
+echo $ac_n "checking for opendir in -ldir""... $ac_c" 1>&6
+echo "configure:1591: checking for opendir in -ldir" >&5
+ac_lib_var=`echo dir'_'opendir | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-ldir $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1599 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char opendir();
+
+int main() {
+opendir()
+; return 0; }
+EOF
+if { (eval echo configure:1610: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ LIBS="$LIBS -ldir"
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+else
+echo $ac_n "checking for opendir in -lx""... $ac_c" 1>&6
+echo "configure:1632: checking for opendir in -lx" >&5
+ac_lib_var=`echo x'_'opendir | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lx $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1640 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char opendir();
+
+int main() {
+opendir()
+; return 0; }
+EOF
+if { (eval echo configure:1651: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ LIBS="$LIBS -lx"
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+fi
+
+
+
+for ac_hdr in limits.h stat.h strings.h stdarg.h sys/stat.h termcap.h termlib.h unistd.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:1679: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1684 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1689: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+
+echo $ac_n "checking for working const""... $ac_c" 1>&6
+echo "configure:1717: checking for working const" >&5
+if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1722 "configure"
+#include "confdefs.h"
+
+int main() {
+
+/* Ultrix mips cc rejects this. */
+typedef int charset[2]; const charset x;
+/* SunOS 4.1.1 cc rejects this. */
+char const *const *ccp;
+char **p;
+/* 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";
+ccp = &g + (g ? g-g : 0);
+/* HPUX 7.0 cc rejects these. */
+++ccp;
+p = (char**) ccp;
+ccp = (char const *const *) p;
+{ /* SCO 3.2v4 cc rejects this. */
+ char *t;
+ char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+ *t++ = 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;
+}
+
+; return 0; }
+EOF
+if { (eval echo configure:1771: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_c_const=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_c_const=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_c_const" 1>&6
+if test $ac_cv_c_const = no; then
+ cat >> confdefs.h <<\EOF
+#define const
+EOF
+
+fi
+
+echo $ac_n "checking for inline""... $ac_c" 1>&6
+echo "configure:1792: checking for inline" >&5
+if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+ cat > conftest.$ac_ext <<EOF
+#line 1799 "configure"
+#include "confdefs.h"
+
+int main() {
+} $ac_kw foo() {
+; return 0; }
+EOF
+if { (eval echo configure:1806: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_c_inline=$ac_kw; break
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+done
+
+fi
+
+echo "$ac_t""$ac_cv_c_inline" 1>&6
+case "$ac_cv_c_inline" in
+ inline | yes) ;;
+ no) cat >> confdefs.h <<\EOF
+#define inline
+EOF
+ ;;
+ *) cat >> confdefs.h <<EOF
+#define inline $ac_cv_c_inline
+EOF
+ ;;
+esac
+
+echo $ac_n "checking for size_t""... $ac_c" 1>&6
+echo "configure:1832: checking for size_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1837 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+ rm -rf conftest*
+ ac_cv_type_size_t=yes
+else
+ rm -rf conftest*
+ ac_cv_type_size_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_type_size_t" 1>&6
+if test $ac_cv_type_size_t = no; then
+ cat >> confdefs.h <<\EOF
+#define size_t unsigned
+EOF
+
+fi
+
+
+echo $ac_n "checking for vprintf""... $ac_c" 1>&6
+echo "configure:1866: checking for vprintf" >&5
+if eval "test \"`echo '$''{'ac_cv_func_vprintf'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1871 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char vprintf(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char vprintf();
+
+int main() {
+
+/* 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_vprintf) || defined (__stub___vprintf)
+choke me
+#else
+vprintf();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:1894: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_vprintf=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_vprintf=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'vprintf`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ cat >> confdefs.h <<\EOF
+#define HAVE_VPRINTF 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+if test "$ac_cv_func_vprintf" != yes; then
+echo $ac_n "checking for _doprnt""... $ac_c" 1>&6
+echo "configure:1918: checking for _doprnt" >&5
+if eval "test \"`echo '$''{'ac_cv_func__doprnt'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1923 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char _doprnt(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char _doprnt();
+
+int main() {
+
+/* 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__doprnt) || defined (__stub____doprnt)
+choke me
+#else
+_doprnt();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:1946: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func__doprnt=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func__doprnt=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'_doprnt`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ cat >> confdefs.h <<\EOF
+#define HAVE_DOPRNT 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+fi
+
+for ac_func in access closedir fileno isatty opendir readdir stat strcasecmp strdup strlwr strtol
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:1973: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1978 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2001: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# 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. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# 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.
+(set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote substitution
+ # turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+DEFS=-DHAVE_CONFIG_H
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+ case "\$ac_option" in
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+ -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+ echo "$CONFIG_STATUS generated by autoconf version 2.13"
+ exit 0 ;;
+ -help | --help | --hel | --he | --h)
+ echo "\$ac_cs_usage"; exit 0 ;;
+ *) echo "\$ac_cs_usage"; exit 1 ;;
+ esac
+done
+
+ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
+
+ac_config_files="$ac_config_files Makefile deweb MakeHTML"
+
+trap 'rm -fr `echo "$ac_config_files config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@SCRIPTS@%$SCRIPTS%g
+s%@ELISPDIR@%$ELISPDIR%g
+s%@CC@%$CC%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@LN_S@%$LN_S%g
+s%@PERL5@%$PERL5%g
+s%@GROFF@%$GROFF%g
+s%@LATEX@%$LATEX%g
+s%@DVIPS@%$DVIPS%g
+s%@LYNX@%$LYNX%g
+s%@LATEX2HTML@%$LATEX2HTML%g
+s%@CPP@%$CPP%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+ else
+ sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+ fi
+ if test ! -s conftest.s$ac_file; then
+ ac_more_lines=false
+ rm -f conftest.s$ac_file
+ else
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f conftest.s$ac_file"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+ fi
+ ac_file=`expr $ac_file + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_cmds`
+ fi
+done
+if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"$ac_config_files"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+ else
+ ac_dir_suffix= ac_dots=
+ fi
+
+ case "$ac_given_srcdir" in
+ .) srcdir=.
+ if test -z "$ac_dots"; then top_srcdir=.
+ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+ /*|[A-z]:/*) # Absolute path.
+ srcdir="$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_given_srcdir" ;;
+ *) # Relative path.
+ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+ case "$ac_given_INSTALL" in
+ "") ;;
+ [/$]*|[A-z]:/*) INSTALL="$ac_given_INSTALL" ;;
+ *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+ esac
+
+ echo creating "$ac_file"
+ rm -f "$ac_file"
+ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+ case "$ac_file" in
+ *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+ *) ac_comsub= ;;
+ esac
+
+ rm -f conftest.in
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%:% $ac_given_srcdir/%g" -e "s%^%$ac_given_srcdir/%"`
+ cat $ac_file_inputs > conftest.in
+ #
+ # Replace lines of the form ac_include foo with the contents of foo:
+ # first, from the ac_include lines construct a list of file names.
+ # From that list, we construct a second list of those files that exist.
+ # Then we construct lists of sed commands for including those files,
+ # and a sed command that removes the ac_include lines. We don't attempt
+ # to read non-existent files because some (buggy) versions of sed choke
+ # on this. Have to use sed because old (Ultrix, SunOS) awk does not support
+ # getline or system. (Anyway, configure scripts aren't supposed to use awk.)
+ # Can't use only one -e and commands {dr foo} because foo has to be last.
+ # Be careful, because the filename may contain /. Be careful with
+ # whitespace; we need to use echo.
+ #
+ file_substs=`sed -n '/^ac_include/s%ac_include[ ]*\(.*\)%\1%p' conftest.in`
+ # Create the sed command line ...
+ if test -n "$file_substs"; then
+ echo "configure: warning: ac_include is obsolete; instead use kpse_include" 1>&2
+ file_subst_cmd="sed -e 's/^ac_include/kpse_include/'"
+ else
+ file_subst_cmd='sed'
+ fi
+ kpse_substs=`sed -n '/^kpse_include/s%kpse_include[ ]*\(.*\)%\1%p' conftest.in`
+ for ac_inc in $file_substs $kpse_substs; do
+ if test -f "$ac_given_srcdir/$ac_inc"; then
+ ac_mung=`echo $ac_inc | sed 's,/,%,g'`
+ file_subst_cmd="$file_subst_cmd -e '/^kpse_include $ac_mung$/r $ac_given_srcdir/$ac_inc'"
+ fi
+ done
+ file_subst_cmd="$file_subst_cmd -e '/^kpse_include/d'"
+ # ... and fix the whitespace and escaped slashes.
+ file_subst_cmd=`echo "$file_subst_cmd" | sed -e 's,%,\\\/,g' \
+-e 's/kpse_include /kpse_include[ ]*/g'`
+ # I can't find any way to do variable substitution in the sed commands
+ # (so the user could have, e.g., $top_srcdir in their ac_include line).
+ (eval $file_subst_cmd conftest.in) \
+ | sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
+" | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s* conftest.in
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)'
+ac_dB='\([ ][ ]*\)[^ ].*$%\1#\2'
+ac_dC='\3'
+ac_dD='%g'
+# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='\([ ]\)%\1#\2define\3'
+ac_uC=' '
+ac_uD='\4%g'
+# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_eB='$%\1#\2define\3'
+ac_eC=' '
+ac_eD='%g'
+
+if test "${CONFIG_HEADERS+set}" != set; then
+EOF
+cat >> $CONFIG_STATUS <<EOF
+ CONFIG_HEADERS=" config.h"
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+fi
+for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ echo creating $ac_file
+
+ rm -f conftest.frag conftest.in conftest.out
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%:% $ac_given_srcdir/%g" -e "s%^%$ac_given_srcdir/%"`
+ cat $ac_file_inputs > conftest.in
+
+EOF
+
+# Transform confdefs.h into a sed script conftest.vals that substitutes
+# the proper values into config.h.in to produce config.h. And first:
+# Protect against being on the right side of a sed subst in config.status.
+# Protect against being in an unquoted here document in config.status.
+rm -f conftest.vals
+cat > conftest.hdr <<\EOF
+s/[\\&%]/\\&/g
+s%[\\$`]%\\&%g
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
+s%ac_d%ac_u%gp
+s%ac_u%ac_e%gp
+EOF
+sed -n -f conftest.hdr confdefs.h > conftest.vals
+rm -f conftest.hdr
+
+# This sed command replaces #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.
+cat >> conftest.vals <<\EOF
+s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
+EOF
+
+# Break up conftest.vals because some shells have a limit on
+# the size of here documents, and old seds have small limits too.
+
+rm -f conftest.tail
+while :
+do
+ ac_lines=`grep -c . conftest.vals`
+ # grep -c gives empty output for an empty file on some AIX systems.
+ if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
+ # Write a limited-size here document to conftest.frag.
+ echo ' cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
+ echo 'CEOF
+ sed -f conftest.frag conftest.in > conftest.out
+ rm -f conftest.in
+ mv conftest.out conftest.in
+' >> $CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
+ rm -f conftest.vals
+ mv conftest.tail conftest.vals
+done
+rm -f conftest.vals
+
+cat >> $CONFIG_STATUS <<\EOF
+ rm -f conftest.frag conftest.h
+ echo "/* $ac_file. Generated automatically by configure. */" > conftest.h
+ cat conftest.in >> conftest.h
+ rm -f conftest.in
+ if cmp -s $ac_file conftest.h 2>/dev/null; then
+ echo "$ac_file is unchanged"
+ rm -f conftest.h
+ else
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ fi
+ rm -f $ac_file
+ mv conftest.h $ac_file
+ fi
+fi; done
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+
+
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
+if test "$no_recursion" != yes; then
+
+ # Remove --cache-file and --srcdir arguments so they do not pile up.
+ ac_sub_configure_args=
+ ac_prev=
+ for ac_arg in $ac_configure_args; do
+ if test -n "$ac_prev"; then
+ ac_prev=
+ continue
+ fi
+ case "$ac_arg" in
+ -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=*)
+ ;;
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ ;;
+ *) ac_sub_configure_args="$ac_sub_configure_args $ac_arg" ;;
+ esac
+ done
+
+ for ac_config_dir in : $subdirs; do
+
+ # Do not complain, so a configure script can configure whichever
+ # parts of a large source tree are present.
+ if test ! -d $srcdir/$ac_config_dir; then
+ continue
+ fi
+
+ echo configuring in $ac_config_dir
+
+ case "$srcdir" in
+ .) ;;
+ *)
+ if test -d ./$ac_config_dir || mkdir ./$ac_config_dir; then :;
+ else
+ { echo "configure: error: can not create `pwd`/$ac_config_dir" 1>&2; exit 1; }
+ fi
+ ;;
+ esac
+
+ ac_popdir=`pwd`
+ cd $ac_config_dir
+
+ # A "../" for each directory in /$ac_config_dir.
+ ac_dots=`echo $ac_config_dir|sed -e 's%^\./%%' -e 's%[^/]$%&/%' -e 's%[^/]*/%../%g'`
+
+ case "$srcdir" in
+ .) # No --srcdir option. We are building in place.
+ ac_sub_srcdir=$srcdir ;;
+ /*|[A-z]:/*) # Absolute path.
+ ac_sub_srcdir=$srcdir/$ac_config_dir ;;
+ *) # Relative path.
+ ac_sub_srcdir=$ac_dots$srcdir/$ac_config_dir ;;
+ esac
+
+ # Check for guested configure; otherwise get Cygnus style configure.
+ if test -f ./configure; then
+ ac_sub_configure=./configure
+ elif test -f $ac_sub_srcdir/configure; then
+ ac_sub_configure=$ac_sub_srcdir/configure
+ elif test -f $ac_sub_srcdir/configure.in; then
+ ac_sub_configure=$ac_configure
+ else
+ echo "configure: warning: no configuration information is in $ac_config_dir" 1>&2
+ ac_sub_configure=
+ fi
+
+ # The recursion is here.
+ if test -n "$ac_sub_configure"; then
+
+ # Make the cache file name correct relative to the subdirectory.
+ case "$cache_file" in
+ /*|[A-z]:/*) ac_sub_cache_file=$cache_file ;;
+ *) # Relative path.
+ ac_sub_cache_file="$ac_dots$cache_file" ;;
+ esac
+ case "$ac_given_INSTALL" in
+ "") ;;
+ [/$]*|[A-z]:/*) INSTALL="$ac_given_INSTALL" ;;
+ *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+ esac
+
+ echo "running ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_sub_srcdir"
+ # The eval makes quoting arguments work.
+ if eval ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_sub_srcdir
+ then :
+ else
+ { echo "configure: error: $ac_sub_configure failed for $ac_config_dir" 1>&2; exit 1; }
+ fi
+ fi
+
+ cd $ac_popdir
+ done
+fi
+
diff --git a/Build/source/texk/chktex/configure.in b/Build/source/texk/chktex/configure.in
new file mode 100644
index 00000000000..ced6ef94ceb
--- /dev/null
+++ b/Build/source/texk/chktex/configure.in
@@ -0,0 +1,181 @@
+dnl
+dnl ChkTeX v1.5, configuration file.
+dnl Copyright (C) 1995-96 Jens T. Berger Thielemann
+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 2 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, write to the Free Software
+dnl Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+dnl
+dnl Contact the author at:
+dnl Jens Berger
+dnl Spektrumvn. 4
+dnl N-0666 Oslo
+dnl Norway
+dnl E-mail: <jensthi@ifi.uio.no>
+dnl
+dnl
+
+
+dnl Process this file with autoconf to produce a configure script.
+AC_INIT(ChkTeX.c)
+AC_SUBST(SCRIPTS)
+SCRIPTS=
+AC_SUBST(ELISPDIR)
+ELISPDIR=
+
+
+AC_ARG_ENABLE(lacheck-replace,[
+ --enable-lacheck-replace: Installs a lacheck replacement for the
+ AUC-TeX interface. (Default: no).],,
+enable_lacheck_replace=no)
+
+AC_ARG_ENABLE(emacs-hack,[
+ --enable-emacs-hack: Installs a Elisp file, which makes ChkTeX
+ available in Emacs. Must be followed by
+ the path of your elisp files (e.g.
+ "--enable-emacs-hack=/usr/lib/emacs/").
+ (Default: no).],,
+enable_emacs_hack=no)
+
+AC_ARG_ENABLE(debug-info,[
+ --enable-debug-info: Compile in miscellaneous runtime debugging
+ information. (Default: yes).],,
+enable_debug_info=yes)
+
+if test "$silent" != "yes"; then
+cat <<EOF
+
+
+ ##### ### ### ######## ### ##
+ ### ## ## ## ## ## #0
+ @@ @@ @@@ @@ @@ @@ ####### @@ @
+ @@ @@@ @@ @@ @@ @@ ## # @@
+ && && && &&&& && @@ & &&
+ &&& && && && && && && @@@@ & &&
+ %%%%% %%% %%% %%% %%% %% && %%% %%%
+ && &
+ %%%%%%%
+
+ Welcome to the ChkTeX configuration script!
+ Before taking the program in use, please read the
+ COPYING file; it applies to this script as well
+ as the remaining parts of the package. In short:
+
+ *NO WARRANTIES WHATSOEVER*
+
+ Copyright © 1995-96
+ Jens T. Berger Thielemann
+ <jensthi@ifi.uio.no>
+EOF
+sleep 1
+cat <<EOF
+Supported features:
+ --enable-lacheck-replace: Installs a lacheck replacement for the
+ AUC-TeX interface. (Default: no).
+ --enable-debug-info: Compile in miscellaneous runtime debugging
+ information. (Default: yes).
+ --enable-emacs-hack: Installs a Elisp file, which makes ChkTeX
+ available in Emacs. Must be followed by
+ the path of your elisp files (e.g.
+ "--enable-emacs-hack=/usr/lib/emacs/").
+ (Default: no).
+EOF
+sleep 1
+fi
+
+AC_MSG_CHECKING(whether lacheck replacement should be installed)
+if test "$enable_lacheck_replace" = "yes"; then
+ SCRIPTS="$SCRIPTS lacheck"
+ AC_MSG_RESULT(yes)
+else
+ SCRIPTS=
+ AC_MSG_RESULT(no)
+fi
+
+AC_MSG_CHECKING(whether runtime debug info should be used)
+if test "$enable_debug_info" = "yes"; then
+ AC_MSG_RESULT(yes)
+else
+ AC_DEFINE(STRIP_DEBUG, 1)
+ AC_MSG_RESULT(no)
+fi
+
+AC_MSG_CHECKING(whether the emacs hack should be installed)
+case $enable_emacs_hack in
+ no) AC_MSG_RESULT(no)
+ ;;
+ /*|*/*) ELISPDIR=$enable_emacs_hack
+ AC_MSG_RESULT(yes)
+ ;;
+ *) echo;
+ AC_MSG_ERROR(--enable-emacs-hack needs the *full path* of Elisp files)
+ ;;
+esac
+
+dnl Checks for programs.
+AC_PROG_CC
+AC_PROG_INSTALL
+AC_PROG_LN_S
+AC_PATH_PROGS(PERL5, perl5 perl, no, $PATH:/usr/bin:/usr/local/bin)
+if test "$PERL5" != no; then
+ AC_MSG_CHECKING(whether perl is v5 or higher)
+ if $PERL5 -e 'exit($] >= 5)'; then
+ PERL5=no
+ AC_MSG_RESULT(no)
+ else
+ AC_MSG_RESULT(yes)
+ fi
+fi
+
+if test "$PERL5" != no; then
+ AC_SYS_INTERPRETER
+ if test "$ac_cv_sys_interpreter" = "yes"; then
+ SCRIPTS="$SCRIPTS chkweb deweb"
+ else
+ AC_MSG_WARN(deweb will not be installed since your system does)
+ AC_MSG_WARN(not support the pound-bang notation.)
+ fi
+else
+ AC_MSG_WARN(deweb will not be installed since you do not have perl5.)
+fi
+
+AC_CHECK_PROGS(GROFF, 'groff -man -P-bu -Tlatin1' 'nroff -man', 'nroff -man')
+
+AC_PATH_PROG(LATEX, latex)
+AC_PATH_PROG(DVIPS, dvips)
+
+AC_PATH_PROG(LYNX, lynx)
+AC_PATH_PROG(LATEX2HTML, latex2html)
+
+dnl Checks for libraries.
+AC_CHECK_LIB(termlib, tgetent)
+AC_CHECK_LIB(termcap, tgetent)
+
+dnl Checks for header files.
+AC_HEADER_STDC
+AC_HEADER_DIRENT
+AC_CONFIG_HEADER(config.h)
+AC_CHECK_HEADERS(limits.h stat.h strings.h stdarg.h dnl
+sys/stat.h termcap.h termlib.h unistd.h)
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+AC_C_CONST
+AC_C_INLINE
+AC_TYPE_SIZE_T
+
+dnl Checks for library functions.
+AC_FUNC_VPRINTF
+AC_CHECK_FUNCS(access closedir fileno isatty opendir readdir stat dnl
+strcasecmp strdup strlwr strtol)
+
+AC_OUTPUT(Makefile deweb MakeHTML)
diff --git a/Build/source/texk/chktex/depend.mak b/Build/source/texk/chktex/depend.mak
new file mode 100644
index 00000000000..9f6f43f3d01
--- /dev/null
+++ b/Build/source/texk/chktex/depend.mak
@@ -0,0 +1,88 @@
+$(objdir)/FindErrs.obj: \
+ ChkTeX.h \
+ $(gnuw32dir)/win32lib.h \
+ config.h \
+ chktypes.h \
+ FindErrs.h \
+ OpSys.h \
+ Utility.h \
+ Resource.h
+
+$(objdir)/chktex.obj: \
+ getopt.h \
+ ChkTeX.h \
+ $(gnuw32dir)/win32lib.h \
+ config.h \
+ chktypes.h \
+ FindErrs.h \
+ OpSys.h \
+ Utility.h \
+ Resource.h \
+ $(kpathseadir)/config.h \
+ $(kpathseadir)/c-auto.h \
+ $(kpathseadir)/c-std.h \
+ $(kpathseadir)/c-unistd.h \
+ $(kpathseadir)/systypes.h \
+ $(kpathseadir)/c-memstr.h \
+ $(kpathseadir)/c-errno.h \
+ $(kpathseadir)/c-minmax.h \
+ $(kpathseadir)/c-limits.h \
+ $(kpathseadir)/c-proto.h \
+ $(kpathseadir)/debug.h \
+ $(kpathseadir)/types.h \
+ $(kpathseadir)/lib.h \
+ $(kpathseadir)/progname.h
+
+$(objdir)/Utility.obj: \
+ ChkTeX.h \
+ $(gnuw32dir)/win32lib.h \
+ config.h \
+ chktypes.h \
+ FindErrs.h \
+ Utility.h \
+ Resource.h \
+ OpSys.h
+
+$(objdir)/getopt1.obj: \
+ config.h \
+ getopt.h
+
+$(objdir)/OpSys.obj: \
+ $(kpathseadir)/config.h \
+ $(kpathseadir)/c-auto.h \
+ $(kpathseadir)/c-std.h \
+ $(kpathseadir)/c-unistd.h \
+ $(kpathseadir)/systypes.h \
+ $(kpathseadir)/c-memstr.h \
+ $(kpathseadir)/c-errno.h \
+ $(kpathseadir)/c-minmax.h \
+ $(kpathseadir)/c-limits.h \
+ $(kpathseadir)/c-proto.h \
+ $(gnuw32dir)/win32lib.h \
+ $(kpathseadir)/debug.h \
+ $(kpathseadir)/types.h \
+ $(kpathseadir)/lib.h \
+ $(kpathseadir)/progname.h \
+ $(kpathseadir)/expand.h \
+ $(kpathseadir)/tex-file.h \
+ $(kpathseadir)/c-vararg.h \
+ ChkTeX.h \
+ config.h \
+ chktypes.h \
+ FindErrs.h \
+ OpSys.h \
+ Utility.h
+
+$(objdir)/getopt.obj: \
+ config.h
+
+$(objdir)/Resource.obj: \
+ ChkTeX.h \
+ $(gnuw32dir)/win32lib.h \
+ config.h \
+ chktypes.h \
+ FindErrs.h \
+ OpSys.h \
+ Utility.h \
+ Resource.h
+
diff --git a/Build/source/texk/chktex/deweb.1 b/Build/source/texk/chktex/deweb.1
new file mode 100644
index 00000000000..a84036a8466
--- /dev/null
+++ b/Build/source/texk/chktex/deweb.1
@@ -0,0 +1,116 @@
+.TH deweb 1 "June 8, 1996"
+.AT 3
+.SH NAME
+deweb \- strips away C & CWEB commands from CWEB sources
+.SH SYNOPSIS
+.B deweb
+[
+.B file1 file2 ...
+]
+.SH DESCRIPTION
+.I deweb
+filters away all C & CWEB commands from a CWEB source code. This
+leaves only the
+.I LaTeX
+code. This stripped code, in turn, may then
+be passed to a suitable syntax checker for LaTeX, like
+.I ChkTeX
+and
+.I lacheck,
+or spell-checkers like
+.I ispell.
+.PP
+The
+.I chkweb
+tool, included in the
+.I ChkTeX
+distribution will do just this; writing similar scripts should be
+trivial.
+.PP
+When
+.I deweb
+strips away the C code from your CWEB source, it tries to preserve line breaks.
+This means that the error reports from
+.I <your favorite tool>
+will be correct regarding to line numbers. In most cases,
+the column position
+will also be correct. This significantly simplifies
+finding the errors in the
+.I LaTeX
+source (in contrast to the output from
+.I cweave,
+which output is truly difficult to figure anything out from).
+.PP
+.I deweb
+accepts a list of filenames on the argument line, and will send its output
+to
+.I stdout.
+If no filenames are given, it will read from stdin, acting as
+a filter. No options are currently accepted.
+.PP
+Macho users may try to pipe the output from
+.I deweb
+directly into
+.I LaTeX,
+theoretically, this should work. This would ease the debugging
+of the
+.I LaTeX
+code significantly, as when
+.I LaTeX
+complains about wrong syntax, you'll be able to find the erroneous
+line much more easily. Don't expect that the output looks very much
+like the final one, though.
+.PP
+.I deweb
+should now understand all correct
+.I CWEB
+opcodes. If it complains about not understanding a correct opcode,
+please inform the author.
+.SH DISTRIBUTION
+Copyright (C) 1996 Jens T. Berger Thielemann
+.PP
+This program is free software; you can redistribute it and/or modify
+it under the terms of the
+.I GNU General Public License
+as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+.PP
+This program is distributed in the hope that it will be useful,
+but
+.B WITHOUT ANY WARRANTY;
+without even the implied warranty of
+.B MERCHANTABILITY
+or
+.B FITNESS FOR A PARTICULAR PURPOSE.
+See the
+.I GNU General Public License
+for more details.
+.PP
+You should have received a copy of the
+.B GNU General Public License
+along with this program; if not, write to the
+.I Free Software Foundation, Inc.,
+675 Mass Ave, Cambridge, MA 02139, USA.
+.SH ENVIRONMENT
+No environment variables are used.
+.SH FILES
+None.
+.SH AUTHOR
+Jens T. Berger Thielemann,
+.I <jensthi@ifi.uio.no>
+.SH "SEE ALSO"
+.B cweave(1), perl(1), chktex, lacheck(1), ispell(1)
+.SH BUGS
+Doesn't even
+.B compile
+under
+.I Perl
+versions before perl v5. Unfortunately, this means that we can't even
+tell the user why we failed;
+.I Perl
+will just complain about not being able to compile the regexps.
+.PP
+The program will try to swallow the whole input file at once, instead of
+processing it on a line\-by\-line basis.
+.ex
diff --git a/Build/source/texk/chktex/deweb.doc b/Build/source/texk/chktex/deweb.doc
new file mode 100644
index 00000000000..2636687602d
--- /dev/null
+++ b/Build/source/texk/chktex/deweb.doc
@@ -0,0 +1,132 @@
+
+
+
+deweb(1) deweb(1)
+
+
+NAME
+ deweb - strips away C & CWEB commands from CWEB sources
+
+SYNOPSIS
+ deweb [ file1 file2 ... ]
+
+DESCRIPTION
+ deweb filters away all C & CWEB commands from a CWEB
+ source code. This leaves only the LaTeX code. This
+ stripped code, in turn, may then be passed to a suitable
+ syntax checker for LaTeX, like ChkTeX and lacheck, or
+ spell-checkers like ispell.
+
+ The chkweb tool, included in the ChkTeX distribution will
+ do just this; writing similar scripts should be trivial.
+
+ When deweb strips away the C code from your CWEB source,
+ it tries to preserve line breaks. This means that the
+ error reports from <your favorite tool> will be correct
+ regarding to line numbers. In most cases, the column posi­
+ tion will also be correct. This significantly simplifies
+ finding the errors in the LaTeX source (in contrast to the
+ output from cweave, which output is truly difficult to
+ figure anything out from).
+
+ deweb accepts a list of filenames on the argument line,
+ and will send its output to stdout. If no filenames are
+ given, it will read from stdin, acting as a filter. No
+ options are currently accepted.
+
+ Macho users may try to pipe the output from deweb directly
+ into LaTeX, theoretically, this should work. This would
+ ease the debugging of the LaTeX code significantly, as
+ when LaTeX complains about wrong syntax, you'll be able to
+ find the erroneous line much more easily. Don't expect
+ that the output looks very much like the final one,
+ though.
+
+ deweb should now understand all correct CWEB opcodes. If
+ it complains about not understanding a correct opcode,
+ please inform the author.
+
+DISTRIBUTION
+ Copyright (C) 1996 Jens T. Berger Thielemann
+
+ This program is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation;
+ either version 2 of the License, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied
+ warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+
+
+
+ June 8, 1996 1
+
+
+
+
+
+deweb(1) deweb(1)
+
+
+ PURPOSE. See the GNU General Public License for more
+ details.
+
+ You should have received a copy of the GNU General Public
+ License along with this program; if not, write to the Free
+ Software Foundation, Inc., 675 Mass Ave, Cambridge, MA
+ 02139, USA.
+
+ENVIRONMENT
+ No environment variables are used.
+
+FILES
+ None.
+
+AUTHOR
+ Jens T. Berger Thielemann, <jensthi@ifi.uio.no>
+
+SEE ALSO
+ cweave(1), perl(1), chktex, lacheck(1), ispell(1)
+
+BUGS
+ Doesn't even compile under Perl versions before perl v5.
+ Unfortunately, this means that we can't even tell the user
+ why we failed; Perl will just complain about not being
+ able to compile the regexps.
+
+ The program will try to swallow the whole input file at
+ once, instead of processing it on a line-by-line basis.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ June 8, 1996 2
+
+
diff --git a/Build/source/texk/chktex/deweb.in b/Build/source/texk/chktex/deweb.in
new file mode 100644
index 00000000000..b40f2e0b57b
--- /dev/null
+++ b/Build/source/texk/chktex/deweb.in
@@ -0,0 +1,122 @@
+#! @PERL5@
+# deweb v1.2, kills the C sections of a CWEB file, for passing to ChkTeX.
+# Copyright (C) 1996 Jens T. Berger Thielemann
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# Contact the author at:
+# Jens Berger
+# Spektrumvn. 4
+# N-0666 Oslo
+# Norway
+# E-mail: <jensthi@ifi.uio.no>
+#
+#
+#
+
+print STDERR "DeWEB v1.2 - Copyright 1996 Jens T. Berger Thielemann\n";
+
+undef $/;
+$texmode = 1;
+$_ = <>;
+
+while(/\@/)
+{
+ &out($`);
+ $_ = $';
+
+ if(/^@/) {
+ $_ = $';
+ &out('@');
+ next;
+ }
+
+ if(/^([\s\n])/) {
+ $_ = $';
+ print "\n" if $1 eq "\n";
+ $texmode = 1;
+ next;
+ }
+
+ if(/^[cpd]/i) {
+ $_ = $';
+ $texmode = 0;
+ next;
+ }
+
+ if(/^\,/i) {
+ $_ = $';
+ print '\,';
+ next;
+ }
+
+ if(m!^/!) {
+ $_ = $';
+ print '\\\\';
+ next;
+ }
+
+ if(/^[h\&\|\;\#\+]/i || /^i.*/i) {
+ $_ = $';
+ next;
+ }
+
+ if(/^\*[0-9\*]?((.|\n)*?\.)/) {
+ $_ = $';
+ print $1;
+ $texmode = 1;
+ next;
+ }
+
+ if(/^[<(^.t!]((.|\n)*?)\@\>/i) {
+ $_ = $';
+ print '{'.$1.'}';
+ $texmode = 0;
+ next;
+ }
+
+ if(/^[=]((.|\n)*?)\@\>/) {
+ $_ = $';
+ print &printnl($1);
+ next;
+ }
+
+ if(/^[fsl](\s+\S+\s+\S+)|^\'(.|\n)*?\'|^\[((.|\n)*?)\@\]/i) {
+ $_ = $';
+ print &printnl($+);
+ next;
+ }
+
+ @line = split(/\n/, $_, 2);
+ print STDERR "Unknown opcode, ignored. Buffer:\n$line[0]\n";
+
+}
+
+print $_;
+
+sub printnl {
+ my($foo);
+ if(defined $_[0]) {
+ $foo = $_[0];
+ $foo =~ s/.//g;
+ } else {
+ $foo = "";
+ }
+ $foo;
+}
+
+sub out {
+ print $texmode? $_[0] : &printnl($_[0]);
+}
diff --git a/Build/source/texk/chktex/getopt.c b/Build/source/texk/chktex/getopt.c
new file mode 100644
index 00000000000..6a083c7e9f0
--- /dev/null
+++ b/Build/source/texk/chktex/getopt.c
@@ -0,0 +1,756 @@
+/* Getopt for GNU.
+ NOTE: getopt is now part of the C library, so if you don't know what
+ "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu
+ before changing it!
+
+ Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94
+ Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.
+ Ditto for AIX 3.2 and <stdlib.h>. */
+#ifndef _NO_PROTO
+#define _NO_PROTO
+#endif
+
+#ifdef HAVE_CONFIG_H
+#if defined (emacs) || defined (CONFIG_BROKETS)
+/* We use <config.h> instead of "config.h" so that a compilation
+ using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h
+ (which it would do because it found this file in $srcdir). */
+#include <config.h>
+#else
+#include "config.h"
+#endif
+#endif
+
+#ifndef __STDC__
+/* This is a separate conditional since some stdc systems
+ reject `defined (const)'. */
+#ifndef const
+#define const
+#endif
+#endif
+
+#include <stdio.h>
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+ actually compiling the library itself. This code is part of the GNU C
+ Library, but also included in many other GNU distributions. Compiling
+ and linking in this code is a waste when using the GNU C library
+ (especially if it is a shared library). Rather than having every GNU
+ program understand `configure --with-gnu-libc' and omit the object files,
+ it is simpler to just do this in the source for each such file. */
+
+#if defined (_LIBC) || !defined (__GNU_LIBRARY__)
+
+
+/* This needs to come after some library #include
+ to get __GNU_LIBRARY__ defined. */
+#ifdef __GNU_LIBRARY__
+/* Don't include stdlib.h for non-GNU C libraries because some of them
+ contain conflicting prototypes for getopt. */
+#include <stdlib.h>
+#endif /* GNU C library. */
+
+/* This version of `getopt' appears to the caller like standard Unix `getopt'
+ but it behaves differently for the user, since it allows the user
+ to intersperse the options with the other arguments.
+
+ As `getopt' works, it permutes the elements of ARGV so that,
+ when it is done, all the options precede everything else. Thus
+ all application programs are extended to handle flexible argument order.
+
+ Setting the environment variable POSIXLY_CORRECT disables permutation.
+ Then the behavior is completely standard.
+
+ GNU application programs can use a third alternative mode in which
+ they can distinguish the relative order of options and other arguments. */
+
+#include "getopt.h"
+
+/* For communication from `getopt' to the caller.
+ When `getopt' finds an option that takes an argument,
+ the argument value is returned here.
+ Also, when `ordering' is RETURN_IN_ORDER,
+ each non-option ARGV-element is returned here. */
+
+char *optarg = NULL;
+
+/* Index in ARGV of the next element to be scanned.
+ This is used for communication to and from the caller
+ and for communication between successive calls to `getopt'.
+
+ On entry to `getopt', zero means this is the first call; initialize.
+
+ When `getopt' returns EOF, this is the index of the first of the
+ non-option elements that the caller should itself scan.
+
+ Otherwise, `optind' communicates from one call to the next
+ how much of ARGV has been scanned so far. */
+
+/* XXX 1003.2 says this must be 1 before any call. */
+int optind = 0;
+
+/* The next char to be scanned in the option-element
+ in which the last option character we returned was found.
+ This allows us to pick up the scan where we left off.
+
+ If this is zero, or a null string, it means resume the scan
+ by advancing to the next ARGV-element. */
+
+static char *nextchar;
+
+/* Callers store zero here to inhibit the error message
+ for unrecognized options. */
+
+int opterr = 1;
+
+/* Set to an option character which was unrecognized.
+ This must be initialized on some systems to avoid linking in the
+ system's own getopt implementation. */
+
+int optopt = '?';
+
+/* Describe how to deal with options that follow non-option ARGV-elements.
+
+ If the caller did not specify anything,
+ the default is REQUIRE_ORDER if the environment variable
+ POSIXLY_CORRECT is defined, PERMUTE otherwise.
+
+ REQUIRE_ORDER means don't recognize them as options;
+ stop option processing when the first non-option is seen.
+ This is what Unix does.
+ This mode of operation is selected by either setting the environment
+ variable POSIXLY_CORRECT, or using `+' as the first character
+ of the list of option characters.
+
+ PERMUTE is the default. We permute the contents of ARGV as we scan,
+ so that eventually all the non-options are at the end. This allows options
+ to be given in any order, even with programs that were not written to
+ expect this.
+
+ RETURN_IN_ORDER is an option available to programs that were written
+ to expect options and other ARGV-elements in any order and that care about
+ the ordering of the two. We describe each non-option ARGV-element
+ as if it were the argument of an option with character code 1.
+ Using `-' as the first character of the list of option characters
+ selects this mode of operation.
+
+ The special argument `--' forces an end of option-scanning regardless
+ of the value of `ordering'. In the case of RETURN_IN_ORDER, only
+ `--' can cause `getopt' to return EOF with `optind' != ARGC. */
+
+static enum
+{
+ REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
+} ordering;
+
+/* Value of POSIXLY_CORRECT environment variable. */
+static char *posixly_correct;
+
+#ifdef __GNU_LIBRARY__
+/* We want to avoid inclusion of string.h with non-GNU libraries
+ because there are many ways it can cause trouble.
+ On some systems, it contains special magic macros that don't work
+ in GCC. */
+#include <string.h>
+#define my_index strchr
+#else
+
+/* Avoid depending on library functions or files
+ whose names are inconsistent. */
+
+char *getenv ();
+
+static char *
+my_index (str, chr)
+ const char *str;
+ int chr;
+{
+ while (*str)
+ {
+ if (*str == chr)
+ return (char *) str;
+ str++;
+ }
+ return 0;
+}
+
+/* If using GCC, we can safely declare strlen this way.
+ If not using GCC, it is ok not to declare it. */
+#ifdef __GNUC__
+/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h.
+ That was relevant to code that was here before. */
+#ifndef __STDC__
+/* gcc with -traditional declares the built-in strlen to return int,
+ and has done so at least since version 2.4.5. -- rms. */
+extern int strlen (const char *);
+#endif /* not __STDC__ */
+#endif /* __GNUC__ */
+
+#endif /* not __GNU_LIBRARY__ */
+
+/* Handle permutation of arguments. */
+
+/* Describe the part of ARGV that contains non-options that have
+ been skipped. `first_nonopt' is the index in ARGV of the first of them;
+ `last_nonopt' is the index after the last of them. */
+
+static int first_nonopt;
+static int last_nonopt;
+
+/* Exchange two adjacent subsequences of ARGV.
+ One subsequence is elements [first_nonopt,last_nonopt)
+ which contains all the non-options that have been skipped so far.
+ The other is elements [last_nonopt,optind), which contains all
+ the options processed since those non-options were skipped.
+
+ `first_nonopt' and `last_nonopt' are relocated so that they describe
+ the new indices of the non-options in ARGV after they are moved. */
+
+static void
+exchange (argv)
+ char **argv;
+{
+ int bottom = first_nonopt;
+ int middle = last_nonopt;
+ int top = optind;
+ char *tem;
+
+ /* Exchange the shorter segment with the far end of the longer segment.
+ That puts the shorter segment into the right place.
+ It leaves the longer segment in the right place overall,
+ but it consists of two parts that need to be swapped next. */
+
+ while (top > middle && middle > bottom)
+ {
+ if (top - middle > middle - bottom)
+ {
+ /* Bottom segment is the short one. */
+ int len = middle - bottom;
+ register int i;
+
+ /* Swap it with the top part of the top segment. */
+ for (i = 0; i < len; i++)
+ {
+ tem = argv[bottom + i];
+ argv[bottom + i] = argv[top - (middle - bottom) + i];
+ argv[top - (middle - bottom) + i] = tem;
+ }
+ /* Exclude the moved bottom segment from further swapping. */
+ top -= len;
+ }
+ else
+ {
+ /* Top segment is the short one. */
+ int len = top - middle;
+ register int i;
+
+ /* Swap it with the bottom part of the bottom segment. */
+ for (i = 0; i < len; i++)
+ {
+ tem = argv[bottom + i];
+ argv[bottom + i] = argv[middle + i];
+ argv[middle + i] = tem;
+ }
+ /* Exclude the moved top segment from further swapping. */
+ bottom += len;
+ }
+ }
+
+ /* Update records for the slots the non-options now occupy. */
+
+ first_nonopt += (optind - last_nonopt);
+ last_nonopt = optind;
+}
+
+/* Initialize the internal data when the first call is made. */
+
+static const char *
+_getopt_initialize (optstring)
+ const char *optstring;
+{
+ /* Start processing options with ARGV-element 1 (since ARGV-element 0
+ is the program name); the sequence of previously skipped
+ non-option ARGV-elements is empty. */
+
+ first_nonopt = last_nonopt = optind = 1;
+
+ nextchar = NULL;
+
+ posixly_correct = getenv ("POSIXLY_CORRECT");
+
+ /* Determine how to handle the ordering of options and nonoptions. */
+
+ if (optstring[0] == '-')
+ {
+ ordering = RETURN_IN_ORDER;
+ ++optstring;
+ }
+ else if (optstring[0] == '+')
+ {
+ ordering = REQUIRE_ORDER;
+ ++optstring;
+ }
+ else if (posixly_correct != NULL)
+ ordering = REQUIRE_ORDER;
+ else
+ ordering = PERMUTE;
+
+ return optstring;
+}
+
+/* Scan elements of ARGV (whose length is ARGC) for option characters
+ given in OPTSTRING.
+
+ If an element of ARGV starts with '-', and is not exactly "-" or "--",
+ then it is an option element. The characters of this element
+ (aside from the initial '-') are option characters. If `getopt'
+ is called repeatedly, it returns successively each of the option characters
+ from each of the option elements.
+
+ If `getopt' finds another option character, it returns that character,
+ updating `optind' and `nextchar' so that the next call to `getopt' can
+ resume the scan with the following option character or ARGV-element.
+
+ If there are no more option characters, `getopt' returns `EOF'.
+ Then `optind' is the index in ARGV of the first ARGV-element
+ that is not an option. (The ARGV-elements have been permuted
+ so that those that are not options now come last.)
+
+ OPTSTRING is a string containing the legitimate option characters.
+ If an option character is seen that is not listed in OPTSTRING,
+ return '?' after printing an error message. If you set `opterr' to
+ zero, the error message is suppressed but we still return '?'.
+
+ If a char in OPTSTRING is followed by a colon, that means it wants an arg,
+ so the following text in the same ARGV-element, or the text of the following
+ ARGV-element, is returned in `optarg'. Two colons mean an option that
+ wants an optional arg; if there is text in the current ARGV-element,
+ it is returned in `optarg', otherwise `optarg' is set to zero.
+
+ If OPTSTRING starts with `-' or `+', it requests different methods of
+ handling the non-option ARGV-elements.
+ See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
+
+ Long-named options begin with `--' instead of `-'.
+ Their names may be abbreviated as long as the abbreviation is unique
+ or is an exact match for some defined option. If they have an
+ argument, it follows the option name in the same ARGV-element, separated
+ from the option name by a `=', or else the in next ARGV-element.
+ When `getopt' finds a long-named option, it returns 0 if that option's
+ `flag' field is nonzero, the value of the option's `val' field
+ if the `flag' field is zero.
+
+ The elements of ARGV aren't really const, because we permute them.
+ But we pretend they're const in the prototype to be compatible
+ with other systems.
+
+ LONGOPTS is a vector of `struct option' terminated by an
+ element containing a name which is zero.
+
+ LONGIND returns the index in LONGOPT of the long-named option found.
+ It is only valid when a long-named option has been found by the most
+ recent call.
+
+ If LONG_ONLY is nonzero, '-' as well as '--' can introduce
+ long-named options. */
+
+int
+_getopt_internal (argc, argv, optstring, longopts, longind, long_only)
+ int argc;
+ char *const *argv;
+ const char *optstring;
+ const struct option *longopts;
+ int *longind;
+ int long_only;
+{
+ optarg = NULL;
+
+ if (optind == 0)
+ optstring = _getopt_initialize (optstring);
+
+ if (nextchar == NULL || *nextchar == '\0')
+ {
+ /* Advance to the next ARGV-element. */
+
+ if (ordering == PERMUTE)
+ {
+ /* If we have just processed some options following some non-options,
+ exchange them so that the options come first. */
+
+ if (first_nonopt != last_nonopt && last_nonopt != optind)
+ exchange ((char **) argv);
+ else if (last_nonopt != optind)
+ first_nonopt = optind;
+
+ /* Skip any additional non-options
+ and extend the range of non-options previously skipped. */
+
+ while (optind < argc
+ && (argv[optind][0] != '-' || argv[optind][1] == '\0'))
+ optind++;
+ last_nonopt = optind;
+ }
+
+ /* The special ARGV-element `--' means premature end of options.
+ Skip it like a null option,
+ then exchange with previous non-options as if it were an option,
+ then skip everything else like a non-option. */
+
+ if (optind != argc && !strcmp (argv[optind], "--"))
+ {
+ optind++;
+
+ if (first_nonopt != last_nonopt && last_nonopt != optind)
+ exchange ((char **) argv);
+ else if (first_nonopt == last_nonopt)
+ first_nonopt = optind;
+ last_nonopt = argc;
+
+ optind = argc;
+ }
+
+ /* If we have done all the ARGV-elements, stop the scan
+ and back over any non-options that we skipped and permuted. */
+
+ if (optind == argc)
+ {
+ /* Set the next-arg-index to point at the non-options
+ that we previously skipped, so the caller will digest them. */
+ if (first_nonopt != last_nonopt)
+ optind = first_nonopt;
+ return EOF;
+ }
+
+ /* If we have come to a non-option and did not permute it,
+ either stop the scan or describe it to the caller and pass it by. */
+
+ if ((argv[optind][0] != '-' || argv[optind][1] == '\0'))
+ {
+ if (ordering == REQUIRE_ORDER)
+ return EOF;
+ optarg = argv[optind++];
+ return 1;
+ }
+
+ /* We have found another option-ARGV-element.
+ Skip the initial punctuation. */
+
+ nextchar = (argv[optind] + 1
+ + (longopts != NULL && argv[optind][1] == '-'));
+ }
+
+ /* Decode the current option-ARGV-element. */
+
+ /* Check whether the ARGV-element is a long option.
+
+ If long_only and the ARGV-element has the form "-f", where f is
+ a valid short option, don't consider it an abbreviated form of
+ a long option that starts with f. Otherwise there would be no
+ way to give the -f short option.
+
+ On the other hand, if there's a long option "fubar" and
+ the ARGV-element is "-fu", do consider that an abbreviation of
+ the long option, just like "--fu", and not "-f" with arg "u".
+
+ This distinction seems to be the most useful approach. */
+
+ if (longopts != NULL
+ && (argv[optind][1] == '-'
+ || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1])))))
+ {
+ char *nameend;
+ const struct option *p;
+ const struct option *pfound = NULL;
+ int exact = 0;
+ int ambig = 0;
+ int indfound;
+ int option_index;
+
+ for (nameend = nextchar; *nameend && *nameend != '='; nameend++)
+ /* Do nothing. */ ;
+
+ /* Test all long options for either exact match
+ or abbreviated matches. */
+ for (p = longopts, option_index = 0; p->name; p++, option_index++)
+ if (!strncmp (p->name, nextchar, nameend - nextchar))
+ {
+ if (nameend - nextchar == strlen (p->name))
+ {
+ /* Exact match found. */
+ pfound = p;
+ indfound = option_index;
+ exact = 1;
+ break;
+ }
+ else if (pfound == NULL)
+ {
+ /* First nonexact match found. */
+ pfound = p;
+ indfound = option_index;
+ }
+ else
+ /* Second or later nonexact match found. */
+ ambig = 1;
+ }
+
+ if (ambig && !exact)
+ {
+ if (opterr)
+ fprintf (stderr, "%s: option `%s' is ambiguous\n",
+ argv[0], argv[optind]);
+ nextchar += strlen (nextchar);
+ optind++;
+ return '?';
+ }
+
+ if (pfound != NULL)
+ {
+ option_index = indfound;
+ optind++;
+ if (*nameend)
+ {
+ /* Don't test has_arg with >, because some C compilers don't
+ allow it to be used on enums. */
+ if (pfound->has_arg)
+ optarg = nameend + 1;
+ else
+ {
+ if (opterr)
+ {
+ if (argv[optind - 1][1] == '-')
+ /* --option */
+ fprintf (stderr,
+ "%s: option `--%s' doesn't allow an argument\n",
+ argv[0], pfound->name);
+ else
+ /* +option or -option */
+ fprintf (stderr,
+ "%s: option `%c%s' doesn't allow an argument\n",
+ argv[0], argv[optind - 1][0], pfound->name);
+ }
+ nextchar += strlen (nextchar);
+ return '?';
+ }
+ }
+ else if (pfound->has_arg == 1)
+ {
+ if (optind < argc)
+ optarg = argv[optind++];
+ else
+ {
+ if (opterr)
+ fprintf (stderr, "%s: option `%s' requires an argument\n",
+ argv[0], argv[optind - 1]);
+ nextchar += strlen (nextchar);
+ return optstring[0] == ':' ? ':' : '?';
+ }
+ }
+ nextchar += strlen (nextchar);
+ if (longind != NULL)
+ *longind = option_index;
+ if (pfound->flag)
+ {
+ *(pfound->flag) = pfound->val;
+ return 0;
+ }
+ return pfound->val;
+ }
+
+ /* Can't find it as a long option. If this is not getopt_long_only,
+ or the option starts with '--' or is not a valid short
+ option, then it's an error.
+ Otherwise interpret it as a short option. */
+ if (!long_only || argv[optind][1] == '-'
+ || my_index (optstring, *nextchar) == NULL)
+ {
+ if (opterr)
+ {
+ if (argv[optind][1] == '-')
+ /* --option */
+ fprintf (stderr, "%s: unrecognized option `--%s'\n",
+ argv[0], nextchar);
+ else
+ /* +option or -option */
+ fprintf (stderr, "%s: unrecognized option `%c%s'\n",
+ argv[0], argv[optind][0], nextchar);
+ }
+ nextchar = (char *) "";
+ optind++;
+ return '?';
+ }
+ }
+
+ /* Look at and handle the next short option-character. */
+
+ {
+ char c = *nextchar++;
+ char *temp = my_index (optstring, c);
+
+ /* Increment `optind' when we start to process its last character. */
+ if (*nextchar == '\0')
+ ++optind;
+
+ if (temp == NULL || c == ':')
+ {
+ if (opterr)
+ {
+ if (posixly_correct)
+ /* 1003.2 specifies the format of this message. */
+ fprintf (stderr, "%s: illegal option -- %c\n", argv[0], c);
+ else
+ fprintf (stderr, "%s: invalid option -- %c\n", argv[0], c);
+ }
+ optopt = c;
+ return '?';
+ }
+ if (temp[1] == ':')
+ {
+ if (temp[2] == ':')
+ {
+ /* This is an option that accepts an argument optionally. */
+ if (*nextchar != '\0')
+ {
+ optarg = nextchar;
+ optind++;
+ }
+ else
+ optarg = NULL;
+ nextchar = NULL;
+ }
+ else
+ {
+ /* This is an option that requires an argument. */
+ if (*nextchar != '\0')
+ {
+ optarg = nextchar;
+ /* If we end this ARGV-element by taking the rest as an arg,
+ we must advance to the next element now. */
+ optind++;
+ }
+ else if (optind == argc)
+ {
+ if (opterr)
+ {
+ /* 1003.2 specifies the format of this message. */
+ fprintf (stderr, "%s: option requires an argument -- %c\n",
+ argv[0], c);
+ }
+ optopt = c;
+ if (optstring[0] == ':')
+ c = ':';
+ else
+ c = '?';
+ }
+ else
+ /* We already incremented `optind' once;
+ increment it again when taking next ARGV-elt as argument. */
+ optarg = argv[optind++];
+ nextchar = NULL;
+ }
+ }
+ return c;
+ }
+}
+
+int
+getopt (argc, argv, optstring)
+ int argc;
+ char *const *argv;
+ const char *optstring;
+{
+ return _getopt_internal (argc, argv, optstring,
+ (const struct option *) 0,
+ (int *) 0,
+ 0);
+}
+
+#endif /* _LIBC or not __GNU_LIBRARY__. */
+
+/*
+
+#ifdef TEST
+
+int
+main (argc, argv)
+ int argc;
+ char **argv;
+{
+ int c;
+ int digit_optind = 0;
+
+ while (1)
+ {
+ int this_option_optind = optind ? optind : 1;
+
+ c = getopt (argc, argv, "abc:d:0123456789");
+ if (c == EOF)
+ break;
+
+ switch (c)
+ {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ if (digit_optind != 0 && digit_optind != this_option_optind)
+ printf ("digits occur in two different argv-elements.\n");
+ digit_optind = this_option_optind;
+ printf ("option %c\n", c);
+ break;
+
+ case 'a':
+ printf ("option a\n");
+ break;
+
+ case 'b':
+ printf ("option b\n");
+ break;
+
+ case 'c':
+ printf ("option c with value `%s'\n", optarg);
+ break;
+
+ case '?':
+ break;
+
+ default:
+ printf ("?? getopt returned character code 0%o ??\n", c);
+ }
+ }
+
+ if (optind < argc)
+ {
+ printf ("non-option ARGV-elements: ");
+ while (optind < argc)
+ printf ("%s ", argv[optind++]);
+ printf ("\n");
+ }
+
+ exit (0);
+}
+
+#endif
+
+*/
diff --git a/Build/source/texk/chktex/getopt.h b/Build/source/texk/chktex/getopt.h
new file mode 100644
index 00000000000..45541f5ac0f
--- /dev/null
+++ b/Build/source/texk/chktex/getopt.h
@@ -0,0 +1,129 @@
+/* Declarations for getopt.
+ Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#ifndef _GETOPT_H
+#define _GETOPT_H 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* For communication from `getopt' to the caller.
+ When `getopt' finds an option that takes an argument,
+ the argument value is returned here.
+ Also, when `ordering' is RETURN_IN_ORDER,
+ each non-option ARGV-element is returned here. */
+
+extern char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+ This is used for communication to and from the caller
+ and for communication between successive calls to `getopt'.
+
+ On entry to `getopt', zero means this is the first call; initialize.
+
+ When `getopt' returns EOF, this is the index of the first of the
+ non-option elements that the caller should itself scan.
+
+ Otherwise, `optind' communicates from one call to the next
+ how much of ARGV has been scanned so far. */
+
+extern int optind;
+
+/* Callers store zero here to inhibit the error message `getopt' prints
+ for unrecognized options. */
+
+extern int opterr;
+
+/* Set to an option character which was unrecognized. */
+
+extern int optopt;
+
+/* Describe the long-named options requested by the application.
+ The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
+ of `struct option' terminated by an element containing a name which is
+ zero.
+
+ The field `has_arg' is:
+ no_argument (or 0) if the option does not take an argument,
+ required_argument (or 1) if the option requires an argument,
+ optional_argument (or 2) if the option takes an optional argument.
+
+ If the field `flag' is not NULL, it points to a variable that is set
+ to the value given in the field `val' when the option is found, but
+ left unchanged if the option is not found.
+
+ To have a long-named option do something other than set an `int' to
+ a compiled-in constant, such as set a value from `optarg', set the
+ option's `flag' field to zero and its `val' field to a nonzero
+ value (the equivalent single-letter option character, if there is
+ one). For long options that have a zero `flag' field, `getopt'
+ returns the contents of the `val' field. */
+
+struct option
+{
+#if __STDC__
+ const char *name;
+#else
+ char *name;
+#endif
+ /* has_arg can't be an enum because some compilers complain about
+ type mismatches in all the code that assumes it is an int. */
+ int has_arg;
+ int *flag;
+ int val;
+};
+
+/* Names for the values of the `has_arg' field of `struct option'. */
+
+#define no_argument 0
+#define required_argument 1
+#define optional_argument 2
+
+#if __STDC__
+#if defined(__GNU_LIBRARY__)
+/* Many other libraries have conflicting prototypes for getopt, with
+ differences in the consts, in stdlib.h. To avoid compilation
+ errors, only prototype getopt for the GNU C library. */
+extern int getopt (int argc, char *const *argv, const char *shortopts);
+#else /* not __GNU_LIBRARY__ */
+extern int getopt ();
+#endif /* not __GNU_LIBRARY__ */
+extern int getopt_long (int argc, char *const *argv, const char *shortopts,
+ const struct option *longopts, int *longind);
+extern int getopt_long_only (int argc, char *const *argv,
+ const char *shortopts,
+ const struct option *longopts, int *longind);
+
+/* Internal only. Users should not call this directly. */
+extern int _getopt_internal (int argc, char *const *argv,
+ const char *shortopts,
+ const struct option *longopts, int *longind,
+ int long_only);
+#else /* not __STDC__ */
+extern int getopt ();
+extern int getopt_long ();
+extern int getopt_long_only ();
+
+extern int _getopt_internal ();
+#endif /* not __STDC__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GETOPT_H */
diff --git a/Build/source/texk/chktex/getopt1.c b/Build/source/texk/chktex/getopt1.c
new file mode 100644
index 00000000000..4e9b7ca9b2b
--- /dev/null
+++ b/Build/source/texk/chktex/getopt1.c
@@ -0,0 +1,189 @@
+/* getopt_long and getopt_long_only entry points for GNU getopt.
+ Copyright (C) 1987, 88, 89, 90, 91, 92, 1993
+ Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#ifdef HAVE_CONFIG_H
+#if defined (emacs) || defined (CONFIG_BROKETS)
+/* We use <config.h> instead of "config.h" so that a compilation
+ using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h
+ (which it would do because it found this file in $srcdir). */
+#include <config.h>
+#else
+#include "config.h"
+#endif
+#endif
+
+#include "getopt.h"
+
+#ifndef __STDC__
+/* This is a separate conditional since some stdc systems
+ reject `defined (const)'. */
+#ifndef const
+#define const
+#endif
+#endif
+
+#include <stdio.h>
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+ actually compiling the library itself. This code is part of the GNU C
+ Library, but also included in many other GNU distributions. Compiling
+ and linking in this code is a waste when using the GNU C library
+ (especially if it is a shared library). Rather than having every GNU
+ program understand `configure --with-gnu-libc' and omit the object files,
+ it is simpler to just do this in the source for each such file. */
+
+#if defined (_LIBC) || !defined (__GNU_LIBRARY__)
+
+
+/* This needs to come after some library #include
+ to get __GNU_LIBRARY__ defined. */
+#ifdef __GNU_LIBRARY__
+#include <stdlib.h>
+#else
+char *getenv ();
+#endif
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+int
+getopt_long (argc, argv, options, long_options, opt_index)
+ int argc;
+ char *const *argv;
+ const char *options;
+ const struct option *long_options;
+ int *opt_index;
+{
+ return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
+}
+
+/* Like getopt_long, but '-' as well as '--' can indicate a long option.
+ If an option that starts with '-' (not '--') doesn't match a long option,
+ but does match a short option, it is parsed as a short option
+ instead. */
+
+int
+getopt_long_only (argc, argv, options, long_options, opt_index)
+ int argc;
+ char *const *argv;
+ const char *options;
+ const struct option *long_options;
+ int *opt_index;
+{
+ return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
+}
+
+
+#endif /* _LIBC or not __GNU_LIBRARY__. */
+
+/*
+#ifdef TEST
+
+#include <stdio.h>
+
+int
+main (argc, argv)
+ int argc;
+ char **argv;
+{
+ int c;
+ int digit_optind = 0;
+
+ while (1)
+ {
+ int this_option_optind = optind ? optind : 1;
+ int option_index = 0;
+ static struct option long_options[] =
+ {
+ {"add", 1, 0, 0},
+ {"append", 0, 0, 0},
+ {"delete", 1, 0, 0},
+ {"verbose", 0, 0, 0},
+ {"create", 0, 0, 0},
+ {"file", 1, 0, 0},
+ {0, 0, 0, 0}
+ };
+
+ c = getopt_long (argc, argv, "abc:d:0123456789",
+ long_options, &option_index);
+ if (c == EOF)
+ break;
+
+ switch (c)
+ {
+ case 0:
+ printf ("option %s", long_options[option_index].name);
+ if (optarg)
+ printf (" with arg %s", optarg);
+ printf ("\n");
+ break;
+
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ if (digit_optind != 0 && digit_optind != this_option_optind)
+ printf ("digits occur in two different argv-elements.\n");
+ digit_optind = this_option_optind;
+ printf ("option %c\n", c);
+ break;
+
+ case 'a':
+ printf ("option a\n");
+ break;
+
+ case 'b':
+ printf ("option b\n");
+ break;
+
+ case 'c':
+ printf ("option c with value `%s'\n", optarg);
+ break;
+
+ case 'd':
+ printf ("option d with value `%s'\n", optarg);
+ break;
+
+ case '?':
+ break;
+
+ default:
+ printf ("?? getopt returned character code 0%o ??\n", c);
+ }
+ }
+
+ if (optind < argc)
+ {
+ printf ("non-option ARGV-elements: ");
+ while (optind < argc)
+ printf ("%s ", argv[optind++]);
+ printf ("\n");
+ }
+
+ exit (0);
+}
+
+#endif
+*/
diff --git a/Build/source/texk/chktex/input.tex b/Build/source/texk/chktex/input.tex
new file mode 100644
index 00000000000..76bc301ff25
--- /dev/null
+++ b/Build/source/texk/chktex/input.tex
@@ -0,0 +1 @@
+\this is a test of whether the file is actually inputted...
diff --git a/Build/source/texk/chktex/win32.mak b/Build/source/texk/chktex/win32.mak
new file mode 100644
index 00000000000..7a92352517d
--- /dev/null
+++ b/Build/source/texk/chktex/win32.mak
@@ -0,0 +1,65 @@
+################################################################################
+#
+# Makefile : ChkTeX
+# Author : Fabrice Popineau <Fabrice.Popineau@supelec.fr>
+# Platform : Win32, Microsoft VC++ 6.0, depends upon fpTeX 0.5 sources
+# Time-stamp: <03/08/23 19:02:50 popineau>
+#
+################################################################################
+root_srcdir = ..\..
+!ifdef DEVELOPMENT
+INCLUDE=$(INCLUDE);$(root_srcdir)\texk.development
+!else
+INCLUDE=$(INCLUDE);$(root_srcdir)\texk
+!endif
+
+USE_KPATHSEA = 1
+USE_GNUW32 = 1
+
+!include <msvc/common.mak>
+
+# We need to get getopt.h from kpathsea, not from the current directory.
+DEFS = -I$(kpathseadir) -I. $(DEFS) -D_MSDOS -DHAVE_CONFIG_H
+
+objects = $(objdir)\ChkTeX.obj $(objdir)\FindErrs.obj $(objdir)\OpSys.obj \
+ $(objdir)\Resource.obj $(objdir)\Utility.obj
+
+programs = $(objdir)\ChkTeX.exe
+
+manfiles =
+#infofiles = ChkTeX.info
+docsubdir = chktex
+pdfdocfiles = ChkTeX.pdf
+htmlfiles =
+
+installdirs = $(bindir) $(texmf)\chktex
+
+default: all
+
+all: $(objdir) $(programs)
+
+$(objdir)\ChkTeX.exe: $(objects) $(kpathsealib)
+ $(link) $(objects) $(kpathsealib) $(conlibs)
+
+!include <msvc/config.mak>
+!include <msvc/install.mak>
+
+install:: install-exec install-data install-man install-doc
+
+install-data::
+ -@echo $(verbose) & ( \
+ echo "Installing data in $(MAKEDIR)" & \
+ $(copy) chktexrc $(texmf)\chktex\.chktexrc $(redir_stdout) \
+ )
+
+distclean::
+ -@$(del) config.h chktex.dvi chktex.pdf
+
+!include <msvc/clean.mak>
+!include <msvc/rdepend.mak>
+!include "./depend.mak"
+
+#
+# Local Variables:
+# mode: makefile
+# End: \ No newline at end of file