summaryrefslogtreecommitdiff
path: root/support/chktex
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/chktex
Initial commit
Diffstat (limited to 'support/chktex')
-rw-r--r--support/chktex/COPYING357
-rw-r--r--support/chktex/ChkTeX.c1087
-rw-r--r--support/chktex/ChkTeX.h363
-rw-r--r--support/chktex/ChkTeX.tex.in1842
-rw-r--r--support/chktex/ChkTeX.texrc6
-rw-r--r--support/chktex/FindErrs.c2082
-rw-r--r--support/chktex/FindErrs.h200
-rw-r--r--support/chktex/MakeHTML.pl20
-rw-r--r--support/chktex/Makefile.in326
-rw-r--r--support/chktex/NEWS189
-rw-r--r--support/chktex/OpSys.c492
-rw-r--r--support/chktex/OpSys.h207
-rw-r--r--support/chktex/README22
-rw-r--r--support/chktex/Resource.c514
-rw-r--r--support/chktex/Resource.h67
-rw-r--r--support/chktex/Test.nore.out627
-rw-r--r--support/chktex/Test.pcre.out636
-rw-r--r--support/chktex/Test.posix-ere.out636
-rw-r--r--support/chktex/Test.tex237
-rw-r--r--support/chktex/Utility.c993
-rw-r--r--support/chktex/Utility.h184
-rw-r--r--support/chktex/aclocal.m416
-rwxr-xr-xsupport/chktex/autogen.sh49
-rw-r--r--support/chktex/chktex.1143
-rw-r--r--support/chktex/chktexrc802
-rwxr-xr-xsupport/chktex/chkweb56
-rw-r--r--support/chktex/chkweb.1132
-rw-r--r--support/chktex/config.h.in158
-rwxr-xr-xsupport/chktex/configure6044
-rw-r--r--support/chktex/configure.in193
-rw-r--r--support/chktex/deweb.1116
-rw-r--r--support/chktex/deweb.in133
-rw-r--r--support/chktex/input.tex1
-rwxr-xr-xsupport/chktex/install-sh501
-rwxr-xr-xsupport/chktex/lacheck27
-rw-r--r--support/chktex/m4/ax_cflags_strict_prototypes.m4170
-rw-r--r--support/chktex/m4/vl_prog_cc_warnings.m4111
-rw-r--r--support/chktex/rmeheader.in19
-rw-r--r--support/chktex/stamp-h.in1
-rw-r--r--support/chktex/types.h17
40 files changed, 19776 insertions, 0 deletions
diff --git a/support/chktex/COPYING b/support/chktex/COPYING
new file mode 100644
index 0000000000..d4e8cec112
--- /dev/null
+++ b/support/chktex/COPYING
@@ -0,0 +1,357 @@
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ The GNU General Public License version 2 is included below for your reference.
+
+------------------------------------------------------------------------
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ 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/support/chktex/ChkTeX.c b/support/chktex/ChkTeX.c
new file mode 100644
index 0000000000..fd7812401a
--- /dev/null
+++ b/support/chktex/ChkTeX.c
@@ -0,0 +1,1087 @@
+/*
+ * ChkTeX, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contact the author at:
+ * Jens Berger
+ * Spektrumvn. 4
+ * N-0666 Oslo
+ * Norway
+ * E-mail: <jensthi@ifi.uio.no>
+ *
+ *
+ */
+
+
+#include "ChkTeX.h"
+#ifdef KPATHSEA
+#include <kpathsea/getopt.h>
+#else
+#include <getopt.h>
+#endif
+#include "OpSys.h"
+#include "Utility.h"
+#include "FindErrs.h"
+#include "Resource.h"
+#include <string.h>
+
+#undef MSG
+#define MSG(num, type, inuse, ctxt, text) {(enum ErrNum)num, type, inuse, ctxt, text},
+
+struct ErrMsg PrgMsgs[pmMaxFault + 1] = {
+ PRGMSGS {(enum ErrNum)pmMaxFault, etErr, TRUE, 0, INTERNFAULT}
+};
+
+struct Stack CharStack = {
+ 0L
+}, InputStack =
+
+{
+0L}, EnvStack =
+
+{
+0L};
+
+/************************************************************************/
+
+const char BrOrder[NUMBRACKETS + 1] = "()[]{}";
+
+unsigned long Brackets[NUMBRACKETS];
+
+/************************************************************************/
+
+
+/*
+ * Have to do things this way, to ease some checking throughout the
+ * program.
+ */
+
+
+NEWBUF(TmpBuffer, BUFSIZ);
+NEWBUF(ReadBuffer, BUFSIZ);
+
+static const char *Banner =
+ "ChkTeX v" PACKAGE_VERSION " - Copyright 1995-96 Jens T. Berger Thielemann.\n"
+#ifdef __OS2__
+ "OS/2 port generated with emx compiler, by Wolfgang Fritsch, <fritsch@hmi.de>\n"
+#elif defined(__MSDOS__)
+ "MS-DOS port by Bj\\o rn Ove Thue, <bjort@ifi.uio.no>\n"
+#endif
+#if HAVE_PCRE
+ "Compiled with PCRE regex support."
+#else
+#if HAVE_POSIX_ERE
+ "Compiled with POSIX extended regex support."
+#else
+ "Compiled with no regex support."
+#endif
+#endif
+ "\n";
+
+static const char *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.\n"
+ "Bug reports: https://savannah.nongnu.org/bugs/?group=chktex\n"
+ " or darthandrus@gmail.com\n"
+ "Press " STDIN_BREAK " to terminate stdin input.\n";
+
+static const char *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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n";
+
+static const char *OnText = "On";
+
+static const char *OffText = "Off";
+
+static const char *HowHelp =
+ "-h or --help gives usage information. See also ChkTeX.{ps,dvi}.\n";
+
+static const char *HelpText =
+ "\n"
+ "\n"
+ " Usage of ChkTeX v" PACKAGE_VERSION "\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"
+ " -L --nolinesupp: Disables per-line suppressions.\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 documentation ChkTeX.dvi, ChkTeX.ps or ChkTeX.pdf.\n";
+
+
+
+
+/*
+ * Options we will set.
+ *
+ */
+
+enum Quote Quote;
+
+char 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;
+
+char *PrgName;
+
+int StdInTTY, StdOutTTY;
+
+/*
+ * End of config params.
+ */
+
+static int ParseArgs(int argc, char **argv);
+static void ShowIntStatus(void);
+static int OpenOut(void);
+static int ShiftArg(char **Argument);
+
+
+/*
+ * Duplicates all arguments, and appends an asterix to each of them.
+ */
+
+static void AddStars(struct WordList *wl)
+{
+ unsigned long Count, CmdLen;
+ char *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)
+{
+ unsigned long i;
+
+ AddStars(&VerbEnvir);
+ AddStars(&MathEnvir);
+
+ MakeLower(&UserWarnCase);
+
+ ListRep(&WipeArg, ':', 0);
+ ListRep(&NoCharNext, ':', 0);
+
+#define ThisItem ((char *) AbbrevCase.Stack.Data[i])
+
+ FORWL(i, AbbrevCase)
+ {
+ if (isalpha((unsigned char)ThisItem[0]))
+ {
+ ThisItem[0] = toupper((unsigned char)ThisItem[0]);
+ InsertWord(ThisItem, &Abbrev);
+ ThisItem[0] = tolower((unsigned char)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 char *aName,
+ struct WordList *b, const char *bName)
+{
+ unsigned long i;
+
+ FORWL(i, *a)
+ {
+ if (HasWord((char *) 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(char *From, char *To, long TSize, long MaxDiff)
+{
+ char *Next;
+ char *Orig;
+ unsigned long Diff;
+ static short HasExpandedTooLong = 0;
+
+ 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;
+
+ /* Make sure we don't expand this buffer out of the memory we
+ * have allocated for it. */
+ if ( Diff > MaxDiff+1 )
+ {
+ Diff = MaxDiff+1;
+ if ( !HasExpandedTooLong )
+ {
+ PrintPrgErr(pmTabExpands, BUFSIZ);
+ }
+ HasExpandedTooLong = 1;
+ }
+ MaxDiff -= (Diff-1);
+
+ memset(To, ' ', Diff);
+ To += Diff;
+
+ From = ++Next;
+ }
+ strcpy(To, From);
+}
+
+
+int main(int argc, char **argv)
+{
+ int retval = EXIT_FAILURE, ret, CurArg;
+ unsigned long Count;
+ int StdInUse = FALSE;
+ long Tab = 8;
+
+#ifdef __LOCALIZED
+
+ InitStrings();
+#endif
+
+ OutputFile = stdout;
+#ifdef KPATHSEA
+ kpse_set_program_name(argv[0], "chktex");
+ PrgName = kpse_program_name;
+#ifdef WIN32
+ setmode(fileno(stdout), _O_BINARY);
+#endif
+#else
+ PrgName = argv[0];
+#endif
+
+#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, (char **) CmdLine.Stack.Data);
+ CmdLine.Stack.Used = 1L;
+ }
+
+ if ((CurArg = ParseArgs((unsigned long) argc, argv)))
+ {
+ retval = EXIT_SUCCESS;
+ if (CmdLine.Stack.Used)
+ {
+ ParseArgs(CmdLine.Stack.Used, (char **) CmdLine.Stack.Data);
+ CmdLine.Stack.Used = 1L;
+ }
+
+ if (!Quiet || LicenseOnly)
+ fprintf(stderr, "%s", 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, "%s", BigBanner);
+ }
+
+ if (!StdOutTTY && PipeOutputFormat)
+ OutputFormat = PipeOutputFormat;
+
+ if (LicenseOnly)
+ {
+ fprintf(stderr, "%s", Distrib);
+ }
+ else
+ {
+ SetupLists();
+ if (QuoteStyle)
+ {
+ if (!strcasecmp(QuoteStyle, "LOGICAL"))
+ Quote = quLogic;
+ else if (!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((unsigned char)*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)
+ {
+ const char *filename = NULL;
+ if (CurArg < argc)
+ filename = argv[CurArg++];
+
+ if (!PushFileName(filename, &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, BUFSIZ - 1 - strlen(ReadBuffer) );
+ strcpy(ReadBuffer, TmpBuffer);
+
+ strcat(ReadBuffer, " ");
+ ret = FindErr(ReadBuffer, CurStkLine(&InputStack));
+ if ( ret != EXIT_SUCCESS ) {
+ retval = ret;
+ }
+ }
+
+ PrintStatus(CurStkLine(&InputStack));
+ }
+ }
+ }
+ }
+ }
+ return retval;
+}
+
+/*
+ * Opens the output file handle & possibly renames
+ */
+
+static int OpenOut(void)
+{
+ int 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)
+ {
+#ifdef KPATHSEA
+ if (!(OutputFile = fopen(OutputName, "wb")))
+#else
+ if (!(OutputFile = fopen(OutputName, "w")))
+#endif
+ {
+ PrintPrgErr(pmOutOpen);
+ Success = FALSE;
+ }
+ }
+ }
+ else
+ OutputFile = stdout;
+
+ return (Success);
+}
+
+#ifndef STRIP_DEBUG
+static void ShowWL(const char *Name, const struct WordList *wl)
+{
+ unsigned long 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", (char *) 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
+ unsigned long Cnt;
+ const char *String;
+ const char *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);
+ BOOLSTAT("No line suppressions", NoLineSupp);
+ }
+#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 */
+ char **Argument) /* optarg or similar */
+{
+ if (Argument && *Argument && isdigit((unsigned char)**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(int *Dest, /* Boolean value */
+ char **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(char **Argument) /* optarg or similar */
+{
+ if (Argument && *Argument && **Argument)
+ return (*((char *) (*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'},
+ {"nolinesupp", no_argument, 0L, 'L'},
+ {"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;
+ int 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:Lo:p:qrs:t::v::V::w:Wx::",
+ long_options, &option_index)) != EOF))
+ {
+ while (c)
+ {
+ nextc = 0;
+ switch (c)
+ {
+ case 's':
+ if (!(Delimit = strdup(optarg)))
+ {
+ PrintPrgErr(pmStrDupErr);
+ ArgErr = aeMem;
+ }
+
+ break;
+ case 'p':
+ if (!(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 'L':
+ NoLineSupp = 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((unsigned char)*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':
+ if (!(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
+ {
+ if (!(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("%s", 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, ...)
+{
+ const char *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/support/chktex/ChkTeX.h b/support/chktex/ChkTeX.h
new file mode 100644
index 0000000000..01275d38b0
--- /dev/null
+++ b/support/chktex/ChkTeX.h
@@ -0,0 +1,363 @@
+/*
+ * ChkTeX, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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
+#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
+
+/* For TeX Live */
+#ifdef KPATHSEA
+#include <kpathsea/config.h>
+#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
+
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+
+#include "types.h"
+
+#ifndef LONG_MAX
+# define LONG_MAX (0x7fffffff)
+#endif
+
+#ifndef CHAR_BIT
+# define CHAR_BIT (8)
+#endif
+
+#include "FindErrs.h"
+
+#if defined(HAVE_FILENO) && defined(HAVE_ISATTY)
+# include <stdio.h>
+#endif
+
+/*
+ * Define aliases for preprocessor statements
+ */
+
+#if defined(__unix__) || defined(__unix) || defined(unix)
+#undef __unix__
+#define __unix__ 1
+#elif defined(__APPLE__) && defined(__MACH__)
+/* OS X should be considered a UNIX */
+#undef __unix__
+#define __unix__ 1
+#elif defined(MSDOS) || defined(__MSDOS__) || defined(__msdos__)
+#undef __MSDOS__
+#define __MSDOS__ 1
+#endif
+
+/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */
+
+/*
+ * 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))
+
+#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 char _ ## name [len + (WALLBYTES<<1)] = {0}; \
+char *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.")\
+ MSG(pmNoRegexMem, etErr, TRUE, 0,\
+ "Unable to allocate regular expressions - no memory?\n")\
+ MSG(pmRegexCompileFailed, etWarn, TRUE, 0,\
+ "Compilation of regular expression %s failed with error %s.\n")\
+ MSG(pmRegexMatchingError, etErr, TRUE, 0,\
+ "PCRE matching error %d.\n") \
+ MSG(pmSuppTooHigh, etWarn, TRUE, 0,\
+ "Warning %d is numbered too high (max %d) and won't be suppressed.\n") \
+MSG(pmLongLines, etWarn, TRUE, 0,\
+ "ChkTeX does not handle lines over %d bytes correctly. Some errors and line numbers may be wrong in this file.") \
+MSG(pmTabExpands, etWarn, TRUE, 0,\
+ "ChkTeX could not fully expand tabs because the resulting line would be more than %d bytes. Some errors and line numbers may be wrong in this file.")
+
+#undef MSG
+#define MSG(num, type, inuse, ctxt, text) num,
+enum PrgErrNum
+{
+ PRGMSGS pmMaxFault
+};
+#undef MSG
+
+extern struct ErrMsg PrgMsgs[pmMaxFault + 1];
+
+struct ErrInfo
+{
+ char *Data;
+ char *LineBuf;
+ char *File;
+ unsigned long Line, Column, ErrLen;
+ enum
+ {
+ efNone = 0x00,
+ efNoItal = 0x01,
+ efItal = 0x02,
+ efNoMath = 0x04,
+ efMath = 0x08
+ } Flags;
+};
+
+extern char *ReadBuffer;
+extern char *CmdBuffer;
+extern char *TmpBuffer;
+
+extern const char BrOrder[NUMBRACKETS + 1];
+
+extern unsigned long Brackets[NUMBRACKETS];
+
+
+extern FILE *OutputFile, *InputFile;
+
+/* We include semicolons on all but the last so that we can include a
+ * semicolon where it's called. This helps with indentation at the
+ * calling location. It also means that DEF must never have a
+ * semicolon. The reason for the care is that isolated semicolons
+ * have been known to break some compilers. */
+/* See also RESOURCE_INFO where the same trick doesn't work, and we
+ * cannot include semicolons at the calling site, regardless of
+ * indentation concerns. */
+#define OPTION_DEFAULTS \
+ DEF(int, GlobalRC, TRUE); \
+ DEF(int, WipeVerb, TRUE); \
+ DEF(int, BackupOut, TRUE); \
+ DEF(int, Quiet, FALSE); \
+ DEF(int, LicenseOnly, FALSE); \
+ DEF(int, UsingStdIn, FALSE); \
+ DEF(int, InputFiles, TRUE); \
+ DEF(int, HeadErrOut, TRUE); \
+ DEF(const char *, OutputName, ""); \
+ DEF(const char *, PseudoInName, NULL); \
+ DEF(char *, OutputFormat, VerbNormal); \
+ DEF(char *, PipeOutputFormat, NULL); \
+ DEF(const char *, Delimit, ":"); \
+ DEF(long, DebugLevel, 0); \
+ DEF(int, NoLineSupp, FALSE)
+
+#define STATE_VARS \
+ DEF(enum ItState, ItState, itOff); /* Are we doing italics? */ \
+ DEF(int, AtLetter, FALSE); /* Whether `@' is a letter or not. */ \
+ DEF(int, InHeader, TRUE); /* Whether we're in the header */ \
+ DEF(int, VerbMode, FALSE); /* Whether we're in complete ignore-mode */ \
+ DEF(long, MathMode, 0); /* Whether we're in math mode or not */ \
+ DEF(const char *, VerbStr, ""); /* String we'll terminate verbmode upon */ \
+ DEF(unsigned long, ErrPrint, 0); /* # errors printed */ \
+ DEF(unsigned long, WarnPrint, 0); /* # warnings printed */ \
+ DEF(unsigned long, UserSupp, 0); /* # user suppressed warnings */ \
+ DEF(unsigned long, LineSupp, 0); /* # warnings suppressed on a single line */ \
+ DEF(uint64_t, FileSuppressions, 0); /* # warnings suppressed in a file */ \
+ DEF(uint64_t, UserFileSuppressions, 0) /* # User warnings suppressed in a file */
+
+#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 int StdInTTY, StdOutTTY, UsingStdIn;
+
+int main(int argc, char **argv);
+void PrintPrgErr(enum PrgErrNum, ...);
+void ErrPrintf(const char *fmt, ...);
+
+extern char *PrgName;
+
+#endif /* CHKTEX_H */
diff --git a/support/chktex/ChkTeX.tex.in b/support/chktex/ChkTeX.tex.in
new file mode 100644
index 0000000000..353322abfc
--- /dev/null
+++ b/support/chktex/ChkTeX.tex.in
@@ -0,0 +1,1842 @@
+%%
+%% ChkTeX v@PACKAGE_VERSION@, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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.
+%%
+
+
+
+\documentclass[a4paper]{article}
+%latex
+\usepackage{array, tabularx, verbatim, multicol}
+\usepackage[T1]{fontenc}
+\nonfrenchspacing
+\newcounter{errornum}
+\setcounter{errornum}{1}
+%endlatex
+\newcommand{\jtbt}{Jens~T. Berger~Thielemann}
+\newcommand{\Cmd}[1]{``\texttt{#1}''}
+\newcommand{\rsrc}{``\texttt{chktexrc}''}
+\newcommand{\chktex}{Chk\TeX}
+
+%latex
+\newcolumntype{Y}{>{\raggedright\arraybackslash}X}
+\newcommand{\fmted}[1]{%
+ {\noindent\large%
+ \begin{tabularx}{\linewidth}{lY}%
+ \bf Warning \theerrornum: & \texttt{#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}}
+\makeatother
+
+
+\newenvironment{errexam}
+{
+\vskip 0pt plus 5pt
+\begin{center}
+}
+{\end{center}}
+\columnseprule 0.1pt
+
+%!\newcommand{\BS}{\verb@\@}
+%!\newcommand{\chktex}{ChkTeX}
+%!\newcommand{\slash}{/}
+%endlatex
+
+
+\title{\chktex\ v@PACKAGE_VERSION@}
+\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
+\emph{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.
+For example, recent versions of AUC\TeX\ (the Emacs mode) interface
+beautifully with \chktex.
+
+The program itself does not have any machine requirements; However compiling
+for other platforms has not been done for a long time now so the code has been
+removed. If interest rises it can be resurrected.
+
+
+\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.
+
+\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.
+ \item Ability to suppress warnings on a single line.
+ \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
+ systems which only support lacheck.
+\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 \emph{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. \\
+ 51 Franklin Street \\
+ Fifth Floor \\
+ Boston \\
+ MA 02110-1301 \\
+ USA
+\end{quote}
+
+
+\section{Availability}
+
+This program is on CTAN\@; thus it can be found at any mirrors of those.
+It is also part of TeX Live 2011.
+
+\section{Installation}
+
+A few words on installation on various platforms:
+
+\begin{description}
+\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.
+
+ 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-pcre}:] Allows using PCRE (perl compatible
+ regular expressions) for use defined warnings. The default is
+ to use PCRE if it is installed on your system as determined by
+ \Cmd{pcre-config}. You can use \Cmd{-{}-disable-pcre} if you
+ plan to distribute this for systems in which you cannot ensure
+ PCRE will be installed.
+
+ User defined regular expressions are defined using
+ \texttt{UserWarnRegex} in the \rsrc\ file. See warning~44 for
+ more information.
+
+ \item[\Cmd{-{}-enable-lacheck-replace}] This enables a quick
+ hack for using \chktex\ instead of lacheck. This is done by
+ installing a stub script which ``overrides'' the original
+ lacheck executable. In this way, tools which support lacheck
+ can be easily made to support chktex instead.
+
+ \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. Do not
+ forget to 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}
+\paragraph{Note:} You \emph{must} install the new \rsrc\ file; \chktex\ will
+fail to function otherwise!
+
+ After doing this, you may enhance \chktex' behaviour by
+reading/editing the \rsrc\ file.
+
+%latex
+\section{Usage}
+
+\subsection{\chktex}
+
+\subsubsection{Synopsis}
+
+A UNIX-compliant template format follows:
+
+\newcommand{\Group}[1]{\mbox{[#1]}}
+\begin{tabularx}{.95\linewidth}{lY}
+ \texttt{chktex} & \ttfamily \Group{-hiqrW} \Group{-v[0-\dots]} \Group{-l
+ <rcfile>} \Group{-[wemn] <[1-42]|all>} \Group{-d[0-\ldots]} \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[\texttt{-h [-{}-help]}] Gives you a command summary.
+ \item[\texttt{-i [-{}-license]}] Shows distribution information.
+ \item[\texttt{-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 \texttt{-g}.
+ \item[\texttt{-r [-{}-reset]}] This will reset all settings to their
+ defaults. This may be useful if you use the \texttt{CMDLINE}
+ directive in your \rsrc\ file, and wish to do something
+ unusual.
+ \item[\texttt{-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[\texttt{-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 \emph{all} warnings.
+ \begin{description}
+ \item[\texttt{-w [-{}-warnon]}] Makes the message number passed as
+ parameter a warning and turns it on.
+ \item[\texttt{-e [-{}-erroron]}] Makes the message number passed as
+ parameter an error and turns it on.
+ \item[\texttt{-m [-{}-msgon]}] Makes the message number passed as
+ parameter a message and turns it on. Messages are not counted.
+ \item[\texttt{-n [-{}-nowarn]}] Turns the warning/error number passed
+ as a parameter off.
+ \item[\texttt{-L [-{}-nolinesupp]}] Turns off suppression of messages
+ on a per line basis. This is meant to be used to ensure that no new
+ errors have crept into a document while editing.
+ \end{description}
+\item[Output control flags:] Determines the appearance and
+ destination of the error reports.
+ \begin{description}
+ \item[\texttt{-q [-{}-quiet]}] Shuts up about copyright information.
+ \item[\texttt{-o [-{}-output]}] Normally, all errors are piped to \texttt{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 \texttt{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[\texttt{-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 \emph{second} entry in the
+ \rsrc\ file), using \texttt{-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 \texttt{awk}, \texttt{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 \texttt{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[\texttt{-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]{\texttt{\%#1} &}
+ \begin{tabularx}{\linewidth}{cX}
+ \bf Code & \bf Description \\
+ \Pf{b} String to print \textbf{b}etween fields (from \texttt{-s}
+ option).\\
+ \Pf{c} \textbf{C}olumn position of error. \\
+ \Pf{d} Length of error (\textbf{d}igit). \\
+ \Pf{f} Current \textbf{f}ilename.\\
+ \Pf{i} Turn on \textbf{i}nverse printing mode.\\
+ \Pf{I} Turn off \textbf{i}nverse printing mode.\\
+ \Pf{k} \textbf{k}ind of error (warning, error, message).\\
+ \Pf{l} \textbf{l}ine number of error.\\
+ \Pf{m} Warning \textbf{m}essage.\\
+ \Pf{n} Warning \textbf{n}umber.\\
+ \Pf{u} An \textbf{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 (\textbf{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 \emph{not} support field lengths (yet).
+ This may come in the future, if I get the time\dots
+
+ The \texttt{-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[\texttt{-V [-{}-pipeverb]}] Which entry we'll use in the \rsrc\
+ file whenever \texttt{stdout} isn't a terminal.
+
+ The default is to use the same mode as specified with the
+ \texttt{-v} switch; using \texttt{-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[\texttt{-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[\texttt{-s [-{}-splitchar]}] String to use instead of the
+ colons when doing \texttt{-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 \texttt{0}, the feature will
+ be disabled, if it is \texttt{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[\texttt{-b [-{}-backup]}] If you use the \texttt{-o} switch, and the
+ named outputfile exists, it will be renamed to \texttt{filename.bak}.
+ \item[\texttt{-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[\texttt{-H [-{}-headererr]}] Show errors found in front of the
+ \verb@\begin{document}@ line. Some people keep \emph{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[\texttt{-g [-{}-globalrc]}] Read in the global resource file. This
+ switch may be useful together with the \texttt{-l} option.
+ \item[\texttt{-t [-{}-tictoc]}] Display a twirling baton, to show that
+ we're working. \texttt{-v0} does an \texttt{-t0}, too, as it assumes
+ that the user then uses the program non-interactively. This is
+ now a no-op.
+ \item[\texttt{-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 \texttt{stdin}. To abort \texttt{stdin} input, press the
+following keycombinations:
+
+\smallskip
+\begin{tabular}{ll}
+ \bf Machine & \bf Key-combination \\
+ UNIX & $\fbox{\texttt{Ctrl}} + \fbox{\texttt{D}}$ \\
+ MS-DOS & $\fbox{\texttt{Ctrl}} + \fbox{Z}$, followed by return.
+\end{tabular}
+\smallskip
+
+By default, we use GNU's \Cmd{getopt()} routine.
+
+\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 it is
+self-documenting, you should be able to get the meaning of each
+keyword by simply reading the file. In fact, since not all options
+are described in this documentation it is necessary that you read
+the \rsrc\ file in order to understand them all. The method for
+\emph{finding it} has grown rather complex. An outline is given below.
+
+If \chktex\ finds multiple files when searching, each and every one
+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. On UNIX boxes, this usually
+ evaluates to something similar to
+ \Cmd{/usr/local/share/chktexrc}, 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 \\
+ 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 \\
+ 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 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{Per Line and File Suppressions}
+
+There are many cases in which \chktex{} will give a warning about a
+construct which, although it usually indicates a mistake, is
+intentional. In these cases it can be extremely annoying to have
+this message appear everytime \chktex{} is run. For this reason you
+can use \LaTeX{} comments to suppress a certain message on a single
+line. This can be done by adding a (case-insensitive) comment at the
+end of the line of the form
+\begin{center}
+ \verb+% chktex ##+
+\end{center}
+where \verb+##+ is the number of the message to be suppressed.
+For example the line
+\begin{center}
+ \verb+$[0,\infty)$+\\*
+\end{center}
+will produce a warning (number 9) about mismatched \verb+]+ and \verb+)+.
+However the lines
+\begin{center}
+ \verb+$[0,\infty)$ % chktex 9+\\*
+ \verb+$[0,\infty)$ % ChkTeX 9+\\*
+\end{center}
+will not produce such a message. In this case, message number 17 will
+still appear at the end, stating that the numbers of \verb+]+ and
+\verb+)+ don't match for the entire file.
+
+To suppress two different errors on the same line you will need two
+instances of \verb+chktex+ in the comment. This format is a little
+cumbersome, but it shouldn't be needed often, and hopefully will help
+avoid accidental suppressions.
+\begin{center}
+ \verb+Jordan--H\"older on $[0,\infty)$ % chktex 8 chktex 9+\\*
+\end{center}
+
+One problem inherent in line-by-line suppressions is that during editing
+another error of the same type may creep into the same line. Therefore,
+I suggest using the \texttt{-L} or \texttt{-{}-nolinesupp} option to
+disallow line based suppressions once just before the document is finished.
+At that point you should go back over all the warnings and decide if they
+should be fixed.
+
+In addition to line-specific suppressions, you can create a suppression which will be in effect for the remainder of the file.
+This can be used, for example, to turn off warning 18 (about \verb+"+) in a file which uses a package (like \Cmd{babel}) where \verb+"+ is an active character.
+The syntax is nearly the same, namely
+\begin{center}
+ \verb+% chktex-file ##+
+\end{center}
+
+\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} or several of \Cmd{babel} languages
+ which use \verb+"+ as an active character; 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. Alternately, you can put
+ \verb+% chktex-file 18+ in your files which use one of these packages so
+ that other files will still have these checks performed.
+\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.
+
+Long lines are broken up into chunks and handled separately. The exact
+length is platform dependent, though is guaranteed to be at least 256 bytes.
+The first portions of the line will have line numbers that are 1 less than
+they should be. Some errors can be missed and some can be added erroneously.
+A warning will be issued if lines are too long.
+
+Before submitting a bug report, please first see whether the problem can be
+solved by editing the \rsrc\ file appropriately.
+
+
+
+\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
+\texttt{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 \texttt{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}
+
+\texttt{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 \texttt{lacheck}, or spell-checkers like \texttt{ispell}.
+
+When \texttt{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 \texttt{cweave}, which output is truly difficult to figure
+anything out from).
+
+\texttt{deweb} accepts a list of filenames on the argument line, and will send
+its output to \texttt{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 \texttt{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.
+
+\texttt{deweb} should now understand all correct \texttt{CWEB} opcodes. If it
+complains about not understanding a correct opcode, please inform the
+author.
+
+\subsubsection{Bugs}
+
+\texttt{deweb} will not even \emph{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{\texttt{\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.
+
+ You can also specify regular expressions to match commands which can
+ safely be terminated with a space. They are specified in the
+ \rsrc\ file in \texttt{[]}, which in some other cases is used to
+ indicate case-insensitive matching. This is used for example to
+ support the \verb+\startXXX+ macros of Con\TeX t.
+
+ \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\\DashExcpt}
+\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 & \texttt{WordDash} \\*
+ Number & \texttt{NumDash} \\*
+ Alphabetic character & \texttt{HyphDash} \\*
+ \end{tabular}
+
+ This is more or less correct, according to my references. One
+ complication is that most often a hyphen (single dash) is desired
+ between letters, but occasionally an n-dash (double dash) is
+ required. This is the case for theorems named after two people
+ e.g.\ Jordan--H\"older. A hyphen would indicate that it was one
+ person with a hyphenated name e.g.\ Gregorio Ricci-Curbastro.
+ If this is rare enough, it can be dealt with via line based suppressions.
+ However, exceptions can also be handled by adding them to the
+ \texttt{DashExcpt} list. The ``words'' in this list are
+ considered to be correct regardless of any other settings.
+ Adding \verb+Jordan--H\"older+ to this list will cause no warning
+ to be issued. There is still the problem that no warning will be
+ raised for Jordan-H\"older (unless added explicitly via regular
+ expression), so care must still be taken.
+
+ Some manuals---particularly American manuals---also suggest
+ \emph{not} adding space around an m-dash (triple dash).
+ Hopefully this check can be improved even more (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.}
+ Either brackets or environments don't match.
+ \chktex\ expects 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
+ between the dots. The \verb@\ldots@ is much more suitable for this.
+ Similar problems are noted for two periods in a row (instead of three)
+ since lacheck does.
+
+ 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.
+
+ You can also specify case-insensitive abbreviations in \texttt{[]}, though
+ only the first letter is actually case-insensitive.
+
+ \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
+ \emph{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, \emph{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, \emph{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: \%s.}
+ A substring you've specified using \texttt{UserWarn} in the \rsrc\ file,
+ has been found. See also warning~44 which allows using regular
+ expressions. You can also specify case-insensitive versions in
+ \texttt{[]}.
+ % Normally I would use a ref here, but if the numbers change that would be
+ % hugely backwards incompatible. Also it would require adding special label code.
+\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. Setting
+ this warning allows you to see notes you have left in comments.
+\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.
+
+ Warning~42 is similar in that it warns about spaces in front of footnotes.
+ The difference is that the warning text makes more sense for that case.
+
+ \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 numeric 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 requires that the input file exist\dots
+
+\end{errdesc}
+
+\Keyword{Italic\\ItalCmd\\NonItalic}
+\begin{errdesc}{Don't use \BS/ in front of small punctuation.}
+ Italic correction should generally \emph{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 \emph{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 \emph{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 \emph{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}
+
+\Keyword{UserWarnRegex}
+\begin{errdesc}{User Regex:\ \%s.}
+ A pattern you've specified using \texttt{UserWarnRegex} in the \rsrc\ file,
+ has been found. See also warning~20 which allows specification of simple
+ string matching.
+
+ Depending on how \chktex\ was configured, you can use either PCRE regular
+ expressions, POSIX extended regular expressions, or none at all.
+ A warning will be issued if \chktex\ was built without regular expression
+ support, but you try to use one.
+
+ By default the matching portion of the line is printed to help distinguish
+ between user specified regular expressions. However, if the regular
+ expression begins with a PCRE comment (which has a syntax of
+ \verb+(?#+~\dots~\verb+)+), then that comment will be printed instead.
+ This can be used to remind yourself why you were searching for the problem
+ or how to fix it. This applies even if POSIX regular expressions are used
+ since \chktex\ itself parses a single initial PCRE-style comment.
+
+ \emph{Note:} If a regular expression (not a comment) starts with
+ \texttt{PCRE:} or \texttt{POSIX:} it will be used only if support for that
+ regular expression engine has been compiled in. It is primarily meant to
+ make testing easier but, can be used to allow better regular expressions
+ if PCRE is available. If you want a regular expression that starts with
+ \texttt{PCRE:} or \texttt{POSIX:} then you can enclose one of the
+ characters in brackets like \texttt{[P]CRE:}.
+
+ An example, included in the \rsrc\ file, is given below. Remember that you
+ have to escape (with~\verb+!+) spaces and \verb+#+ as well as a few other
+ characters. One should always use \verb+\nmid+ instead of \verb+\not\mid+
+ because the results are much better.
+ \begin{errexam}
+ \verb+\\not! *(\||\\mid)+\\*
+ \verb+User Regex: \not\mid.+\\*
+ \end{errexam}
+ or with an initial comment
+ \begin{errexam}
+ \verb+(?!#Always! use! \nmid)\\not! *(\||\\mid)+\\*
+ \verb+User Regex: Always use \nmid.+
+ \end{errexam}
+
+ You can use \verb+% chktex 44+ to suppress user regular expression
+ warnings on a given line, but this is often undesirable since all such
+ warnings are suppressed this way. For this reason you can ``name'' user
+ regular expression warnings with negative numbers. For example
+ \verb+% chktex 4+ will suppress the system warning number 4, but
+ \verb+% chktex -4+ will suppress the user regular expression warning
+ number 4. Since one might wish to add, remove, or rearrange user warnings
+ in the \rsrc\ file, you must explicitly name particular warnings rather
+ than relying on position in that file.
+
+ In order to name one, include an initial PCRE-style comment with the first
+ characters being a number (positive or negative---the absolute value will
+ be used). The numbers are limited by the number of bits in a \texttt{long},
+ usually giving 1--63 as possible names. You can give more than one regular
+ expression the same name, and suppressing that name will suppress all
+ regular expressions with that name.
+
+ Using the example from before, all of the following will be suppressed with
+ \verb+% chktex -4+. Note that the name \emph{will} be printed as written
+ so that you know which number to suppress.
+ \begin{errexam}
+ \verb+(?!#4:Always! use! \nmid)\\not! *(\||\\mid)+\\*
+ \verb+(?!#-4Always! use! \nmid)\\not! *(\||\\mid)+\\*
+ \verb+(?!#-4! Always! use! \nmid)\\not! *(\||\\mid)+\\*
+ \end{errexam}
+\end{errdesc}
+
+\begin{errdesc}{Use \textbackslash[ ... \textbackslash] instead of \$\$ ... \$\$.}
+
+ In \LaTeX\ documents, using \verb+\[...\]+ is strongly preferred over \verb+$$...$$+.
+ This is because using \verb+$$+ will change the vertical spacing in the
+ equations making them inconsistent.
+
+\end{errdesc}
+
+\begin{errdesc*}{Use \textbackslash( ... \textbackslash) instead of \$ ... \$.}
+
+ In \LaTeX\ documents using \verb+\(...\)+ is slightly preferred over \verb+$...$+.
+ Some error messages might be clearer with \verb+\(...\)+.
+
+\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 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.
+\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{\texttt{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\texttt{html}, I'm willing to do the
+ same in order to produce \texttt{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, \emph{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 Interfaces for other editors are also welcomed.
+
+\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}
+
+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
+\texttt{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 \texttt{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
+
+
+\section{Thanks}
+
+The author wishes to thank the following people (in alphabetical order):
+
+\def\Name#1#2{%
+\item[]
+ \setbox0=\hbox{
+ \begin{tabular}{l}
+ \textbf{#1} \\
+ \texttt{#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 caught\dots
+
+ 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{Antonio DiCesare}{dicesare@vodafone.it}
+ He provided many feature requests and bug reports for the 1.7.1
+ version making it a much better release than it would have otherwise
+ been. He also helped expand several keywords in the \rsrc\ file.
+
+ \Name{Mojca Miklavec}{mojca.miklavec.lists@gmail.com}
+ Found and helped debug a problem (fixed in 1.7.2) occurring only on
+ some platforms, 32 bit Macs for one.
+
+ \Name{Baruch Even}{chktex@ev-en.org}
+ Maintainer of \chktex\ for about a decade.
+
+ \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: \texttt{<jensthi@ifi.uio.no>}
+ \end{quote}
+%latex
+\end{samepage}
+%endlatex
+Any signs of intelligent life are welcomed; that should exclude piracy.
+
+Since the original author is unreachable, the maintainer these days is:
+%latex
+\begin{samepage}
+%endlatex
+ \begin{quote}
+ Ivan Andrus \\
+ E-mail: \texttt{<darthandrus@gmail.com>}
+ \end{quote}
+%latex
+\end{samepage}
+%endlatex
+
+\medskip\noindent
+Have fun.
+
+\end{document}
+
+% The "Make" target is my own.
+% Local Variables:
+% TeX-command-default: "Make"
+% TeX-master: "ChkTeX.tex"
+% End:
diff --git a/support/chktex/ChkTeX.texrc b/support/chktex/ChkTeX.texrc
new file mode 100644
index 0000000000..e990c71d1b
--- /dev/null
+++ b/support/chktex/ChkTeX.texrc
@@ -0,0 +1,6 @@
+# Ignore file for ChkTeX.tex, since it shows many errors in its examples
+# it raises many errors when checking ChkTeX.tex with chktex itself.
+
+VerbEnvir { errexam errdesc }
+
+WipeArg { \Cmd:{} }
diff --git a/support/chktex/FindErrs.c b/support/chktex/FindErrs.c
new file mode 100644
index 0000000000..f1a470b823
--- /dev/null
+++ b/support/chktex/FindErrs.c
@@ -0,0 +1,2082 @@
+/*
+ * ChkTeX, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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"
+
+#if HAVE_PCRE || HAVE_POSIX_ERE
+
+#if HAVE_PCRE
+#include <pcreposix.h>
+#else
+#include <regex.h>
+#endif
+
+#define REGEX_FLAGS REG_EXTENDED
+#define NUM_MATCHES 10
+#define ERROR_STRING_SIZE 100
+
+regex_t* RegexArray = NULL;
+regex_t* SilentRegex = NULL;
+int NumRegexes = 0;
+
+#endif
+
+int FoundErr = EXIT_SUCCESS;
+int LastWasComment = FALSE;
+int SeenSpace = FALSE;
+
+/***************************** 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((unsigned char)c) || (AtLetter && (c == '@')))
+#define CTYPE(func) \
+static int my_##func(int c) \
+{ \
+ return(func(c)); \
+}
+
+#define SUPPRESSED_ON_LINE(c) (LineSuppressions & ((uint64_t)1<<c))
+
+#define INUSE(c) \
+ ((LaTeXMsgs[(enum ErrNum) c].InUse == iuOK) && !SUPPRESSED_ON_LINE(c))
+
+#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--)) \
+ { \
+ if (!(check)) break; \
+ } \
+ ptr++;
+
+#define SKIP_AHEAD(ptr, c, check) \
+ while((c = *ptr++)) \
+ { \
+ if (!(check)) \
+ break; \
+ } \
+ ptr--;
+
+
+/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */
+
+/*
+ * A list of characters LaTeX considers as an end-of-sentence characters, which
+ * should be detected when whether sentence spacing is correct.
+ *
+ */
+static const char LTX_EosPunc[] = { '.', ':', '?', '!', 0 };
+
+/*
+ * General punctuation characters used on your system.
+ */
+static const char LTX_GenPunc[] = { ',', ';', 0 };
+
+/*
+ * A list of characters LaTeX considers as an small punctuation characters,
+ * which should not be preceded by a \/.
+ */
+static const char LTX_SmallPunc[] = { '.', ',', 0 };
+
+/*
+ * String used to delimit a line suppression. This string must be
+ * followed immediately by the number of the warning to be suppressed.
+ * If more than one warning is to be suppressed, then multiple copies
+ * of LineSuppDelim+number must be used.
+ */
+const char LineSuppDelim[] = "chktex ";
+
+/*
+ * String used to delimit a file suppression. This string must be
+ * followed immediately by the number of the warning to be suppressed.
+ * If more than one warning is to be suppressed, then multiple copies
+ * of FileSuppDelim+number must be used.
+ */
+const char FileSuppDelim[] = "chktex-file ";
+
+/*
+ * A bit field used to hold the suppressions for the current line.
+ */
+static uint64_t LineSuppressions;
+/*
+ * A bit field used to hold the suppressions of numbered user warnings
+ * for the current line.
+ */
+static uint64_t UserLineSuppressions;
+
+static unsigned long Line;
+
+static const char *RealBuf;
+static char *BufPtr;
+
+static int ItFlag = efNone;
+static int MathFlag = efNone;
+
+NEWBUF(Buf, BUFSIZ);
+NEWBUF(CmdBuffer, BUFSIZ);
+NEWBUF(ArgBuffer, BUFSIZ);
+
+static enum ErrNum PerformCommand(const char *Cmd, char *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 char *GetLTXToken(char *Src, char *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 char *GetLTXArg(char *SrcBuf, char *OrigDest, const int Until,
+ struct WordList *wl)
+{
+ char *Retval;
+ char *TmpPtr;
+ char *Dest = OrigDest;
+ unsigned long 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))
+ {
+ int len = strlen(OrigDest+1);
+ memmove(OrigDest, OrigDest + 1, len + 1);
+ /* Strip the last '}' off */
+ OrigDest[len-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 char *PreProcess(void)
+{
+ char *TmpPtr;
+
+ /* Reset any line suppressions */
+
+ LineSuppressions = FileSuppressions;
+ UserLineSuppressions = UserFileSuppressions;
+
+ /* Kill comments. */
+ strcpy(Buf, RealBuf);
+
+ TmpPtr = Buf;
+
+ LastWasComment = FALSE;
+ while ((TmpPtr = strchr(TmpPtr, '%')))
+ {
+ char *EscapePtr = TmpPtr;
+ int NumBackSlashes = 0;
+ while (EscapePtr != Buf && EscapePtr[-1] == '\\')
+ {
+ ++NumBackSlashes;
+ --EscapePtr;
+ }
+
+ /* If there is an even number of backslashes, then it's a comment. */
+ if ((NumBackSlashes % 2) == 0)
+ {
+ LastWasComment = TRUE;
+ PSERR(TmpPtr - Buf, 1, emComment);
+ *TmpPtr = 0;
+ /* Check for line suppressions */
+ if (!NoLineSupp)
+ {
+ int error;
+ const int MaxSuppressionBits = 63;
+
+ /* Convert to lowercase to compare with LineSuppDelim */
+ EscapePtr = ++TmpPtr; /* move past NUL terminator */
+ while ( *EscapePtr )
+ {
+ *EscapePtr = tolower((unsigned char)*EscapePtr);
+ ++EscapePtr;
+ }
+
+ EscapePtr = TmpPtr; /* Save it for later */
+ while ((TmpPtr = strstr(TmpPtr, FileSuppDelim))) {
+ TmpPtr += STRLEN(FileSuppDelim);
+ error = atoi(TmpPtr);
+
+ if (abs(error) > MaxSuppressionBits)
+ {
+ PrintPrgErr(pmSuppTooHigh, error, MaxSuppressionBits);
+ }
+ if (error > 0)
+ {
+ FileSuppressions |= ((uint64_t)1 << error);
+ LineSuppressions |= ((uint64_t)1 << error);
+ }
+ else
+ {
+ UserFileSuppressions |= ((uint64_t)1 << (-error));
+ UserLineSuppressions |= ((uint64_t)1 << (-error));
+ }
+ }
+ TmpPtr = EscapePtr;
+
+ while ((TmpPtr = strstr(TmpPtr, LineSuppDelim))) {
+
+ TmpPtr += STRLEN(LineSuppDelim);
+ error = atoi(TmpPtr);
+
+ if (abs(error) > MaxSuppressionBits)
+ {
+ PrintPrgErr(pmSuppTooHigh, error, MaxSuppressionBits);
+ }
+
+ if (error > 0)
+ {
+ LineSuppressions |= ((uint64_t)1 << error);
+ }
+ else
+ {
+ UserLineSuppressions |= ((uint64_t)1 << (-error));
+ }
+ }
+ }
+ break;
+ }
+ TmpPtr++;
+ }
+ return (Buf);
+}
+
+/*
+ * Interpret environments
+ */
+
+static void PerformEnv(char *Env, int Begin)
+{
+ static char 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 char *SkipVerb(void)
+{
+ char *TmpPtr = BufPtr;
+ int TmpC;
+
+ if (VerbMode && BufPtr)
+ {
+ if (!(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(char *PrePtr, char *PstPtr)
+{
+ unsigned long 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);
+
+ if (!(Front && Back))
+ {
+ CHECKDOTS(LowDots, dtLDots);
+ }
+ return (Front & Back);
+ }
+ else
+ return (dtLDots);
+
+}
+
+static const char *Dot2Str(enum DotLevel dl)
+{
+ const char *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(const char *Cmd, char *CmdPtr)
+{
+ unsigned long CmdLen = strlen(Cmd);
+ const char *Format;
+ char *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));
+ 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 ']':
+ case ')':
+ break;
+ default:
+ PrintPrgErr(pmWrongWipeTemp, &Cmd[strlen(Cmd) + 1]);
+ break;
+ }
+ }
+
+ if (TmpPtr)
+ strwrite(CmdPtr+CmdLen, VerbClear, TmpPtr - CmdPtr - CmdLen);
+ else
+ strxrep(CmdPtr+CmdLen, "()[]{}", *VerbClear);
+ }
+}
+
+/*
+ * Checks italic.
+ *
+ */
+
+static void CheckItal(const char *Cmd)
+{
+ int TmpC;
+ char *TmpPtr;
+ if (HasWord(Cmd, &NonItalic))
+ ItState = itOff;
+ else if (HasWord(Cmd, &Italic))
+ ItState = itOn;
+ else if (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(char *CmdPtr)
+{
+ char *TmpPtr;
+ const char *ArgEndPtr;
+ unsigned long 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 && (*BufPtr != '*' || BufPtr[1]))
+ {
+ if (*BufPtr == '*')
+ TmpPtr = strchr(&BufPtr[2], BufPtr[1]);
+ else
+ TmpPtr = strchr(&BufPtr[1], *BufPtr);
+ if (TmpPtr)
+ 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((unsigned char)CmdPtr[-1]))
+ PSERRA(CmdPtr - Buf - 1, 1, emRemPSSpace, CmdBuffer);
+
+ if ((TmpPtr = HasWord(CmdBuffer, &NoCharNext)))
+ {
+ char *BPtr = BufPtr;
+
+ TmpPtr += strlen(TmpPtr) + 1;
+ SKIP_AHEAD(BPtr, TmpC, LATEX_SPACE(TmpC));
+
+ if (strchr(TmpPtr, *BPtr))
+ {
+ PSERR2(CmdPtr - Buf, CmdLen, emNoCharMean, CmdBuffer, *BPtr);
+ }
+ }
+
+ /* LaTeX environment tracking */
+ if (!strcmp(CmdBuffer, "\\begin") || !strcmp(CmdBuffer, "\\end"))
+ {
+ if (ArgEndPtr)
+ {
+ if (!strcmp(ArgBuffer, "document"))
+ InHeader = FALSE;
+
+ if (CmdBuffer[1] == 'b')
+ {
+ if (!(PushErr(ArgBuffer, Line, CmdPtr - Buf,
+ CmdLen, RealBuf, &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, (int) CmdBuffer[1] == 'b');
+ }
+ else
+ PSERR(CmdPtr - Buf, CmdLen, emNoArgFound);
+ }
+
+ /* ConTeXt \start \stop tracking */
+ if (!strncmp(CmdBuffer, "\\start", 6) || !strncmp(CmdBuffer, "\\stop", 5))
+ {
+ if (CmdBuffer[3] == 'a') /* start */
+ {
+ TmpPtr = CmdBuffer + 6;
+ if (!(PushErr(TmpPtr, Line, CmdPtr - Buf + 6,
+ CmdLen - 6, RealBuf, &EnvStack)))
+ PrintPrgErr(pmNoStackMem);
+ }
+ else
+ {
+ TmpPtr = CmdBuffer + 5;
+ if ((ei = PopErr(&EnvStack)))
+ {
+ if (strcmp(ei->Data, TmpPtr))
+ PrintError(CurStkName(&InputStack), RealBuf,
+ CmdPtr - Buf + 5,
+ (long) strlen(TmpPtr),
+ Line, emExpectC, ei->Data, TmpPtr);
+
+ FreeErrInfo(ei);
+ }
+ else
+ {
+ PrintError(CurStkName(&InputStack), RealBuf,
+ CmdPtr - Buf,
+ (long) strlen(CmdBuffer),
+ Line, emSoloC, TmpPtr);
+ }
+ }
+ /* TODO: Do I need to call PerformEnv? */
+ /* It handles math and verbatim environments */
+ }
+
+ 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))
+ {
+ const char *cTmpPtr = Dot2Str(dotlev);
+ PSERRA(CmdPtr - Buf, CmdLen, emEllipsis, cTmpPtr);
+ }
+ }
+
+ 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 char *Buffer)
+{
+ long i;
+ char *TmpPtr;
+ const char *AbbPtr;
+
+ if (INUSE(emInterWord))
+ {
+ TmpPtr = TmpBuffer + Abbrev.MaxLen + 2;
+ *TmpPtr = 0;
+ AbbPtr = Buffer;
+
+ for (i = Abbrev.MaxLen; i >= 0; i--)
+ {
+ *--TmpPtr = *AbbPtr--;
+ if (!isalpha((unsigned char)*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)
+{
+ unsigned long Count;
+ long CmdLen;
+ char *UsrPtr;
+
+ /* Search for user-specified warnings */
+
+#if ! (HAVE_PCRE || HAVE_POSIX_ERE)
+
+ if (INUSE(emUserWarnRegex) && UserWarnRegex.Stack.Used > 0)
+ {
+ PrintPrgErr(pmNoRegExp);
+ ClearWord( &UserWarnRegex );
+ }
+ else if (INUSE(emUserWarn))
+ {
+ strcpy(TmpBuffer, Buf);
+ }
+
+#else
+
+ if (INUSE(emUserWarnRegex) && UserWarnRegex.Stack.Used > 0)
+ {
+ static char error[ERROR_STRING_SIZE];
+ static regmatch_t MatchVector[NUM_MATCHES];
+ int rc;
+ int len = strlen(TmpBuffer);
+ strcpy(TmpBuffer, Buf);
+
+ /* Compile all regular expressions if not already compiled. */
+ if ( !RegexArray && UserWarnRegex.Stack.Used > 0 )
+ {
+ RegexArray = (regex_t*)malloc( sizeof(regex_t) * UserWarnRegex.Stack.Used );
+ if (!RegexArray)
+ {
+ /* Allocation failed. */
+ PrintPrgErr(pmNoRegexMem);
+ ClearWord(&UserWarnRegex);
+ NumRegexes = 0;
+ }
+ else
+ {
+ NumRegexes = 0;
+ FORWL(Count, UserWarnRegex)
+ {
+ char *pattern = UserWarnRegex.Stack.Data[Count];
+ char *CommentEnd = NULL;
+
+ /* See if it's got a special name that it goes by.
+ Only use the comment if it's at the very beginning. */
+ if ( strncmp(pattern,"(?#",3) == 0 )
+ {
+ CommentEnd = strchr(pattern, ')');
+ /* TODO: check for PCRE/POSIX only regexes */
+ if ( CommentEnd != NULL )
+ {
+ *CommentEnd = '\0';
+ /* We're leaking a little here, but this was never freed until exit anyway... */
+ UserWarnRegex.Stack.Data[NumRegexes] = pattern+3;
+
+ /* Compile past the end of the comment so that it works with POSIX too. */
+ pattern = CommentEnd + 1;
+ }
+ }
+
+ /* Ignore PCRE and POSIX specific regexes.
+ * This is mostly to make testing easier. */
+ if ( strncmp(pattern,"PCRE:",5) == 0 )
+ {
+ #if HAVE_PCRE
+ pattern += 5;
+ #else
+ continue;
+ #endif
+ }
+ if ( strncmp(pattern,"POSIX:",6) == 0 )
+ {
+ #if HAVE_POSIX_ERE
+ pattern += 6;
+ #else
+ continue;
+ #endif
+ }
+
+ rc = regcomp((regex_t*)(&RegexArray[NumRegexes]),
+ pattern, REGEX_FLAGS);
+
+ /* Compilation failed: print the error message */
+ if (rc != 0)
+ {
+ /* TODO: decide whether a non-compiling regex should completely stop, or just be ignored */
+ regerror(rc,(regex_t*)(&RegexArray[NumRegexes]),
+ error, ERROR_STRING_SIZE);
+ PrintPrgErr(pmRegexCompileFailed, pattern, error);
+ }
+ else
+ {
+ if ( !CommentEnd )
+ {
+ ((char*)UserWarnRegex.Stack.Data[NumRegexes])[0] = '\0';
+ }
+ ++NumRegexes;
+ }
+ }
+ }
+ }
+
+ for (Count = 0; Count < NumRegexes; ++Count)
+ {
+ int offset = 0;
+ char *ErrMessage = UserWarnRegex.Stack.Data[Count];
+ const int NamedWarning = strlen(ErrMessage) > 0;
+
+ while (offset < len)
+ {
+ /* Check if this warning should be suppressed. */
+ if (UserLineSuppressions && NamedWarning)
+ {
+ /* The warning can be named with positive or negative numbers. */
+ int UserWarningNumber = abs(atoi(ErrMessage));
+ if (UserLineSuppressions & ((uint64_t)1 << UserWarningNumber))
+ {
+ break;
+ }
+ }
+
+ rc = regexec( (regex_t*)(&RegexArray[Count]), TmpBuffer+offset,
+ NUM_MATCHES, MatchVector, 0);
+ /* Matching failed: handle error cases */
+ if (rc != 0)
+ {
+ switch(rc)
+ {
+ case REG_NOMATCH:
+ /* no match, no problem */
+ break;
+ default:
+ regerror(rc, (regex_t*)(&RegexArray[Count]),
+ error, ERROR_STRING_SIZE);
+ PrintPrgErr(pmRegexMatchingError, error);
+ break;
+ }
+
+ offset = len; /* break out of loop */
+ }
+ else
+ {
+#define MATCH (MatchVector[0])
+ if ( NamedWarning )
+ {
+ /* User specified error message */
+ PSERR2(offset + MATCH.rm_so, MATCH.rm_eo - MATCH.rm_so,
+ emUserWarnRegex,
+ strlen(ErrMessage), ErrMessage);
+ }
+ else
+ {
+ /* Default -- show the match */
+ PSERR2(offset + MATCH.rm_so, MATCH.rm_eo - MATCH.rm_so,
+ emUserWarnRegex,
+ /* The format specifier expects an int */
+ (int)(MATCH.rm_eo - MATCH.rm_so),
+ TmpBuffer + offset + MATCH.rm_so);
+ }
+ if ( MATCH.rm_eo == 0 )
+ {
+ /* Break out of loop if the match was empty.
+ * This avoids an infinite loop when the match
+ * is empty, e.g $ */
+ offset = len;
+ }
+ else
+ {
+ offset += MATCH.rm_eo;
+ }
+#undef MATCH
+ }
+ }
+ }
+ }
+ else if (INUSE(emUserWarn))
+ {
+ strcpy(TmpBuffer, Buf);
+ }
+
+#endif
+
+
+ if (INUSE(emUserWarn))
+ {
+ FORWL(Count, UserWarn)
+ {
+ for (UsrPtr = TmpBuffer;
+ (UsrPtr = strstr(UsrPtr, UserWarn.Stack.Data[Count]));
+ UsrPtr++)
+ {
+ CmdLen = strlen(UserWarn.Stack.Data[Count]);
+ PSERRA(UsrPtr - TmpBuffer, CmdLen, emUserWarn, UserWarn.Stack.Data[Count]);
+ }
+ }
+
+ strlwr(TmpBuffer);
+
+ FORWL(Count, UserWarnCase)
+ {
+ for (UsrPtr = TmpBuffer;
+ (UsrPtr = strstr(UsrPtr, UserWarnCase.Stack.Data[Count]));
+ UsrPtr++)
+ {
+ CmdLen = strlen(UserWarnCase.Stack.Data[Count]);
+ PSERRA(UsrPtr - TmpBuffer, CmdLen, emUserWarn, UserWarnCase.Stack.Data[Count]);
+ }
+ }
+ }
+}
+
+
+/*
+ * Checks that the dash-len is correct.
+ */
+
+static void CheckDash(void)
+{
+ char *TmpPtr;
+ int TmpC;
+ long TmpCount, Len;
+ struct WordList *wl = NULL;
+ unsigned long i;
+ int Errored;
+ char *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((unsigned char)*PrePtr) && isdigit((unsigned char)*TmpPtr))
+ wl = &NumDash;
+ if (isalpha((unsigned char)*PrePtr) && isalpha((unsigned char)*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)
+ {
+ struct WordList *el = &DashExcpt;
+
+ FORWL(i, *el)
+ {
+ char *exception = el->Stack.Data[i];
+
+ char *e = exception;
+ while ( *e )
+ {
+ if ( *e == '-' && 0 == strncmp( BufPtr, e, strlen(e) ) )
+ {
+ char *f = e;
+ TmpPtr = BufPtr;
+ while ( f > exception && *(--f) == *(--TmpPtr) )
+ {
+ /* Nothing */
+ }
+
+ if ( f <= exception && *f == *TmpPtr )
+ {
+ Errored = FALSE;
+ break;
+ }
+ }
+
+ ++e;
+ }
+
+ if ( !Errored )
+ break;
+ }
+ }
+
+ if (Errored)
+ HERE(TmpCount, emWrongDash);
+ }
+ }
+}
+
+/*
+ * Pushes and pops nesting characters.
+ *
+ */
+
+static void HandleBracket(char Char)
+{
+ unsigned long BrOffset; /* Offset into BrOrder array */
+ struct ErrInfo *ei;
+ char TmpC, Match;
+ char ABuf[2], BBuf[2];
+ char *TmpPtr;
+
+ AddBracket(Char);
+
+ if ((BrOffset = BrackIndex(Char)) != ~0UL)
+ {
+ if (BrOffset & 1) /* Closing bracket of some sort */
+ {
+ if ((ei = PopErr(&CharStack)))
+ {
+ Match = MatchBracket(*(ei->Data));
+ /* Return italics to proper state */
+ if (ei->Flags & efNoItal)
+ {
+ if (ItState == itOn)
+ {
+ TmpPtr = BufPtr;
+ SKIP_AHEAD(TmpPtr, TmpC, TmpC == '}');
+
+ /* If the next character is a period or comma,
+ * or the last character is, then it's not an
+ * error. */
+ /* Checking 2 characters back seems dangerous,
+ * but it's already done in CheckDash. */
+ if ( !strchr(LTX_SmallPunc, *TmpPtr) &&
+ !strchr(LTX_SmallPunc, *(TmpPtr-2)) )
+ HERE(1, emNoItFound);
+ }
+
+ ItState = FALSE;
+ }
+ else if (ei->Flags & efItal)
+ ItState = TRUE;
+
+ /* Same for math mode */
+ if (ei->Flags & efMath)
+ {
+ MathMode = 1;
+ }
+ else if (ei->Flags & efNoMath)
+ {
+ MathMode = 0;
+ }
+
+ 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, RealBuf)))
+ {
+ if (Char == '{')
+ {
+ switch (ItFlag)
+ {
+ default:
+ ei->Flags |= ItFlag;
+ ItFlag = efNone;
+ break;
+ case efNone:
+ ei->Flags |= ItState ? efItal : efNoItal;
+ }
+
+ switch (MathFlag)
+ {
+ default:
+ ei->Flags |= MathFlag;
+ MathFlag = efNone;
+ break;
+ case efNone:
+ ei->Flags |= MathMode ? efMath : efNoMath;
+ }
+ }
+ }
+
+ else
+ PrintPrgErr(pmNoStackMem);
+ }
+ }
+}
+
+
+/*
+ * Checks to see if CmdBuffer matches any of the words in Silent, or
+ * any of the regular expressions in SilentCase.
+ *
+ */
+
+int CheckSilentRegex(void)
+{
+
+#if ! (HAVE_PCRE || HAVE_POSIX_ERE)
+
+ return HasWord(CmdBuffer, &Silent) != NULL;
+
+#else
+
+ static char error[ERROR_STRING_SIZE];
+ char *pattern;
+ char *tmp;
+ int i;
+ int rc;
+ int len = 4; /* Enough for the (?:) */
+
+ /* Initialize regular expression */
+ if (INUSE(emSpaceTerm) && SilentCase.Stack.Used > 0)
+ {
+ /* Find the total length we need */
+ /* There is 1 for | and the final for null terminator */
+ FORWL(i, SilentCase)
+ {
+ len += strlen( SilentCase.Stack.Data[i] ) + 1;
+ }
+
+ /* (A|B|...) */
+ tmp = (pattern = (char*)malloc( sizeof(char) * len ));
+
+ #if HAVE_PCRE
+ tmp = stpcpy(tmp,"(?:");
+ #else
+ tmp = stpcpy(tmp,"(");
+ #endif
+
+ FORWL(i, SilentCase)
+ {
+ tmp = stpcpy(tmp, SilentCase.Stack.Data[i]);
+ *tmp++ = '|';
+ }
+ tmp = stpcpy(tmp - 1, ")");
+
+ SilentRegex = malloc( sizeof(regex_t) );
+ rc = regcomp(SilentRegex, pattern, REGEX_FLAGS);
+
+ /* Compilation failed: print the error message */
+ if (rc != 0)
+ {
+ regerror(rc, SilentRegex, error, ERROR_STRING_SIZE);
+ PrintPrgErr(pmRegexCompileFailed, pattern, error);
+ SilentRegex = NULL;
+ }
+ /* Ensure we won't initialize it again */
+ SilentCase.Stack.Used = 0;
+ free(pattern);
+ }
+
+ /* Check against the normal */
+ if ( HasWord(CmdBuffer, &Silent) )
+ return 1;
+ if (!SilentRegex)
+ return 0;
+
+ /* Check against the regexes */
+ rc = regexec(SilentRegex, CmdBuffer, 0, NULL, 0);
+ if (rc == 0)
+ return 1;
+
+ /* Matching failed: handle error cases */
+ switch(rc)
+ {
+ case REG_NOMATCH:
+ return 0;
+ break;
+ default:
+ regerror(rc, SilentRegex, error, ERROR_STRING_SIZE);
+ PrintPrgErr(pmRegexMatchingError, error);
+ break;
+ }
+ return 0;
+
+#endif
+}
+
+/*
+ * Searches the `Buf' for possible errors, and prints the errors. `Line'
+ * is supplied for error printing.
+ */
+
+int FindErr(const char *_RealBuf, const unsigned long _Line)
+{
+ char *CmdPtr; /* We'll have to copy each command out. */
+ char *PrePtr; /* Ptr to char in front of command, NULL if
+ * the cmd appears as the first character */
+ char *TmpPtr; /* Temporary pointer */
+ char *ErrPtr; /* Ptr to where an error started */
+
+ char TmpC, /* Just a temp var used throughout the proc. */
+ MatchC, Char; /* Char. currently processed */
+ unsigned long CmdLen; /* Length of misc. things */
+ int MixingQuotes;
+
+ int (*pstcb) (int c);
+
+ enum DotLevel dotlev;
+
+ FoundErr = EXIT_SUCCESS;
+
+ if (_RealBuf)
+ {
+ RealBuf = _RealBuf;
+ Line = _Line;
+
+ if (!LastWasComment)
+ {
+ SeenSpace = TRUE;
+ }
+ BufPtr = PreProcess();
+
+ BufPtr = SkipVerb();
+
+ /* Skip past leading whitespace which is insignificant in TeX to avoid
+ * spurious warnings (Delete this space to maintain correct
+ * pagereferences). If we have seen a space we don't _need_ to skip
+ * past, and doing so misses Message 30 (Multiple spaces detected). We
+ * can miss some of Message 30 in the "not SeenSpace" case too, but I
+ * think it's less important, since Message 30 is for newbies.
+ */
+ if (!SeenSpace && BufPtr)
+ {
+ SKIP_AHEAD(BufPtr, TmpC, LATEX_SPACE(TmpC));
+ }
+
+ while (BufPtr && *BufPtr)
+ {
+ PrePtr = BufPtr - 1;
+ Char = *BufPtr++;
+ if (isspace((unsigned char)Char))
+ Char = ' ';
+
+ switch (Char)
+ {
+ case '~':
+ TmpPtr = NULL;
+ if (isspace((unsigned char)*PrePtr))
+ TmpPtr = PrePtr;
+ else if (isspace((unsigned char)*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((unsigned char)*TmpPtr))
+ {
+ TmpPtr = BufPtr;
+
+ SKIP_AHEAD(TmpPtr, TmpC,
+ (LATEX_SPACE(TmpC) || strchr("{}$", TmpC)));
+
+ if (isdigit((unsigned char)*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((unsigned char)*PrePtr) && (*PrePtr != '\\') && MathMode)
+ {
+ TmpPtr = BufPtr;
+ CmdPtr = CmdBuffer;
+ do
+ {
+ *CmdPtr++ = Char;
+ Char = *TmpPtr++;
+ }
+ while (isalpha((unsigned char)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]))
+ {
+ const char *cTmpPtr;
+ dotlev = CheckDots(&PrePtr[1], &BufPtr[2]);
+ cTmpPtr = Dot2Str(dotlev);
+ HEREA(3, emEllipsis, cTmpPtr);
+ }
+
+ /* Regexp: "([^A-Z@.])\.[.!?:]*\s+[a-z]" */
+
+ TmpPtr = BufPtr;
+ SKIP_AHEAD(TmpPtr, TmpC, strchr(LTX_EosPunc, TmpC));
+ if (LATEX_SPACE(*TmpPtr))
+ {
+ if (!isupper((unsigned char)*PrePtr) && (*PrePtr != '@') &&
+ (*PrePtr != '.'))
+ {
+ SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC));
+ if (islower((unsigned char)*TmpPtr))
+ PSERR(BufPtr - Buf, 1, emInterWord);
+ else
+ CheckAbbrevs(&BufPtr[-1]);
+ }
+ }
+
+ /* FALLTHRU */
+ case ':':
+ case '?':
+ case '!':
+ case ';':
+ /* Regexp: "[A-Z][A-Z][.!?:;]\s+" */
+
+ if (isspace((unsigned char)*BufPtr) && isupper((unsigned char)*PrePtr) &&
+ (isupper((unsigned char)PrePtr[-1]) || (Char != '.')))
+ HERE(1, emInterSent);
+
+ /* FALLTHRU */
+ case ',':
+ if (isspace((unsigned char)*PrePtr) &&
+ !(isdigit((unsigned char)*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 == '\xB4')) /* xB4 = latin1 acute accent */
+ MixingQuotes = TRUE;
+
+ SKIP_AHEAD(TmpPtr, TmpC, strchr("`\'\"\xB4", TmpC)); /* xB4 = latin1 acute accent */
+
+ if (MixingQuotes)
+ HERE(TmpPtr - BufPtr + 1, emQuoteMix);
+
+ switch (Char)
+ {
+ case '\'':
+ if (isalpha((unsigned char)*TmpPtr) &&
+ (strchr(LTX_GenPunc, *PrePtr) || isspace((unsigned char)*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 */
+
+ {
+ char *WordPtr = PrePtr;
+ SKIP_BACK(WordPtr, TmpC, (isalnum((unsigned char)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((unsigned char)*PrePtr) &&
+ (strchr(LTX_GenPunc, *TmpPtr) || isspace((unsigned char)*TmpPtr)))
+ HERE(TmpPtr - BufPtr + 1, emEndQ);
+ break;
+ }
+ BufPtr = TmpPtr;
+ break;
+ case '"':
+ HERE(1, emUseQuoteLiga);
+ break;
+
+ case '\264': /* ´ (in Latin-1) */
+ 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((unsigned char)*TmpPtr))
+ pstcb = &my_isalpha;
+ else if (isdigit((unsigned char)*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 (SeenSpace)
+ {
+ /* We must be careful to not point to the "previous space"
+ * when it was actually on the previous line. This could
+ * cause us to write into someone else's memory (inside of
+ * PrintError). */
+ if (HasWord(CmdBuffer, &Linker))
+ PSERR( (PrePtr > Buf) ? (PrePtr - Buf) : 0,
+ 1, emNBSpace);
+ if (HasWord(CmdBuffer, &PostLink))
+ PSERR( (PrePtr > Buf) ? (PrePtr - Buf) : 0,
+ 1, emFalsePage);
+ }
+
+ if (LATEX_SPACE(*BufPtr) && !MathMode &&
+ !CheckSilentRegex() &&
+ (strlen(CmdBuffer) != 2))
+ {
+ PSERR(BufPtr - Buf, 1, emSpaceTerm);
+ }
+ else if ((*BufPtr == '\\') && (!isalpha((unsigned char)BufPtr[1])) &&
+ (!LATEX_SPACE(BufPtr[1])))
+ PSERR(BufPtr - Buf, 2, emNotIntended);
+
+ PerformBigCmd(PrePtr + 1);
+ BufPtr = SkipVerb();
+
+ break;
+
+ case '(':
+ if (*PrePtr && !LATEX_SPACE(*PrePtr) && !isdigit((unsigned char)*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((unsigned char)*BufPtr))
+ PSERRA(BufPtr - Buf, 1, emNoSpaceParen, "after");
+ HandleBracket(Char);
+ break;
+
+ case ')':
+ if (isspace((unsigned char)*PrePtr))
+ PSERRA(BufPtr - Buf - 1, 1, emNoSpaceParen,
+ "in front of");
+ if (isalpha((unsigned char)*BufPtr))
+ PSERRA(BufPtr - Buf, 1, emSpaceParen, "after");
+ HandleBracket(Char);
+ break;
+
+ case '}':
+ case '{':
+ case '[':
+ case ']':
+ HandleBracket(Char);
+ break;
+ case '$':
+ if (*PrePtr != '\\')
+ {
+ if (*BufPtr == '$')
+ {
+ BufPtr++;
+ TmpPtr = BufPtr;
+ SKIP_AHEAD(TmpPtr, TmpC, (TmpC != '$' && TmpC != '\0'));
+ PSERR(BufPtr - Buf - 2, TmpPtr-BufPtr+4, emDisplayMath);
+ }
+ else
+ {
+ TmpPtr = BufPtr;
+ SKIP_AHEAD(TmpPtr, TmpC, (TmpC != '$' && TmpC != '\0'));
+ PSERR(BufPtr - Buf - 1, TmpPtr-BufPtr+2, emInlineMath);
+ }
+ MathMode ^= TRUE;
+ }
+
+ break;
+ }
+
+ SeenSpace = LATEX_SPACE(Char);
+ }
+
+ if (!VerbMode)
+ {
+ CheckRest();
+ }
+
+ }
+
+ return FoundErr;
+}
+
+/*
+ * 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, unsigned long Cnt, const char *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(unsigned long Lines)
+{
+ unsigned long Cnt;
+ struct ErrInfo *ei;
+
+
+ while ((ei = PopErr(&CharStack)))
+ {
+ PrintError(ei->File, ei->LineBuf, ei->Column,
+ ei->ErrLen, ei->Line, emNoMatchC, (char *) ei->Data);
+ FreeErrInfo(ei);
+ }
+
+ while ((ei = PopErr(&EnvStack)))
+ {
+ PrintError(ei->File, ei->LineBuf, ei->Column,
+ ei->ErrLen, ei->Line, emNoMatchC, (char *) 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; ");
+ Transit(stderr, LineSupp, "line suppressed warning%s.\n");
+
+ /* Print how to suppress warnings. */
+ if ( ErrPrint + WarnPrint > 0 ) {
+ fprintf(stderr, "See the manual for how to suppress some or all of these warnings/errors.\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 char *File, const char *String,
+ const long Position, const long Len,
+ const long LineNo, const enum ErrNum Error, ...)
+{
+ static /* Just to reduce stack usage... */
+ char PrintBuffer[BUFSIZ];
+ va_list MsgArgs;
+
+ char *LastNorm = OutputFormat;
+ char *of;
+ int c;
+
+ enum Context Context;
+
+ if (betw(emMinFault, Error, emMaxFault))
+ {
+ switch (LaTeXMsgs[Error].InUse)
+ {
+ case iuOK:
+ if (SUPPRESSED_ON_LINE(Error))
+ {
+ LineSupp++;
+ }
+ else
+ {
+ FoundErr = EXIT_FAILURE;
+ 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':
+ /* TODO: need to add the offset of the column
+ * here when long lines are broken. */
+ 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);
+ }
+ 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 char *Cmd, char *Arg)
+{
+ const char *Argument = "";
+ enum ErrNum en = emMinFault;
+ int TmpC;
+
+ if (!strcmp(Cmd, "\\makeatletter"))
+ AtLetter = TRUE;
+ else if (!strcmp(Cmd, "\\makeatother"))
+ AtLetter = FALSE;
+ else if (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);
+
+ if (!(Argument && PushFileName(Argument, &InputStack)))
+ en = emNoCmdExec;
+ }
+ else if (HasWord(Cmd, &Primitives))
+ en = emTeXPrim;
+ else if (HasWord(Cmd, &MathCmd))
+ {
+ SKIP_AHEAD(Arg, TmpC, LATEX_SPACE(TmpC));
+ if (*Arg == '{')
+ {
+ MathFlag = MathMode ? efMath : efNoMath;
+ MathMode = 1;
+ }
+ }
+ else if (HasWord(Cmd, &TextCmd))
+ {
+ SKIP_AHEAD(Arg, TmpC, LATEX_SPACE(TmpC));
+ if (*Arg == '{')
+ {
+ MathFlag = MathMode ? efMath : efNoMath;
+ MathMode = 0;
+ }
+ }
+ else if (*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/support/chktex/FindErrs.h b/support/chktex/FindErrs.h
new file mode 100644
index 0000000000..df38559ba3
--- /dev/null
+++ b/support/chktex/FindErrs.h
@@ -0,0 +1,200 @@
+/*
+ * ChkTeX, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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
+#include "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, iuNotSys, ctNone,\
+ "Use \"'\" (ASCII 39) instead of \"\xB4\" (ASCII 180).")\
+ MSG(emUserWarn, etWarn, iuOK, ctNone,\
+ "User-specified pattern found: %s.")\
+ 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'.")\
+ MSG(emUserWarnRegex, etWarn, iuOK, ctNone,\
+ "User Regex: %.*s.") \
+ MSG(emDisplayMath, etWarn, iuOK, ctOutMath,\
+ "Use \\[ ... \\] instead of $$ ... $$.")\
+ MSG(emInlineMath, etWarn, iuNotSys, ctOutMath,\
+ "Use \\( ... \\) instead of $ ... $.")
+
+#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;
+
+ const char *Message;
+};
+
+enum ItState
+{
+ itOff,
+ itOn,
+ itCorrected
+};
+
+
+enum DotLevel
+{
+ dtUnknown = 0x0,
+ dtCDots = 0x1,
+ dtLDots = 0x2,
+ dtDots = 0x4
+};
+
+extern struct ErrMsg LaTeXMsgs[emMaxFault + 1];
+
+extern char *OutputFormat;
+
+int CheckSilentRegex(void);
+int FindErr(const char *, const unsigned long);
+void PrintError(const char *, const char *, const long, const long,
+ const long, const enum ErrNum, ...);
+void PrintStatus(unsigned long Lines);
+
+#endif /* FINDERRS */
diff --git a/support/chktex/MakeHTML.pl b/support/chktex/MakeHTML.pl
new file mode 100644
index 0000000000..6bdbadcf12
--- /dev/null
+++ b/support/chktex/MakeHTML.pl
@@ -0,0 +1,20 @@
+# Remove parts of code enclosed in %latex/%endlatex tags
+
+$latexonly = 0;
+
+while(<>)
+{
+ $latexonly = 1 if /^%latex/i;
+ $latexonly = 0 if /^%endlatex/i;
+
+
+ if($latexonly) {
+ if(/^%!(.*)/)
+ {
+ print $1;
+ }
+ }
+ else {
+ print;
+ }
+}
diff --git a/support/chktex/Makefile.in b/support/chktex/Makefile.in
new file mode 100644
index 0000000000..8980880ea3
--- /dev/null
+++ b/support/chktex/Makefile.in
@@ -0,0 +1,326 @@
+#
+# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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@
+datarootdir=@datarootdir@
+datadir=@datadir@
+sysconfdir=@sysconfdir@
+srcdir=@srcdir@
+mandir=@mandir@
+INSTALL=@INSTALL@
+INSTALL_PROGRAM=@INSTALL_PROGRAM@
+INSTALL_DATA=@INSTALL_DATA@
+MKDIR_P=@MKDIR_P@
+CLEAN=@CLEAN@
+
+CC=@CC@
+CFLAGS=@CFLAGS@
+CPPFLAGS=@CPPFLAGS@ -I$(srcdir) -I. $(DEFS) $(USRDEFS)
+DEFS=@DEFS@
+LIBS=@LIBS@
+LDFLAGS=@LDFLAGS@
+LN_S=@LN_S@
+LATEX=@LATEX@
+DVIPS=@DVIPS@
+PS2PDF=ps2pdf
+PERL5=@PERL5@
+LATEX2HTML=@LATEX2HTML@
+LYNX=@LYNX@
+GROFF=@GROFF@
+SHELL=/bin/sh
+
+BUILT_SCRIPTS=@BUILT_SCRIPTS@
+SCRIPTS=@SCRIPTS@
+
+USRDEFS=-DSYSCONFDIR=\"$(sysconfdir)\" -D__unix__
+
+VPATH=$(srcdir)
+
+#####################################################################
+
+EXTRA_DIST=configure.in Makefile.in stamp-h.in config.h.in rmeheader.in \
+ MakeHTML.pl ChkTeX.tex.in aclocal.m4 NEWS \
+ chkweb deweb.in COPYING chktex.1 chkweb.1 deweb.1 \
+ input.tex Test.tex Test.pcre.out Test.posix-ere.out Test.nore.out configure \
+ install-sh lacheck chktexrc \
+ $(wildcard m4/*.m4)
+
+# created by configure
+CONFIG_DIST=ChkTeX.tex
+
+# created at make time
+BUILT_DIST=chktex.doc chkweb.doc deweb.doc README ChkTeX.dvi
+
+CSOURCES=ChkTeX.c FindErrs.c OpSys.c Resource.c Utility.c
+
+# The sources are the C sources and possibly the files with the same base name
+# but ending with .h
+SOURCEFILES=$(CSOURCES) $(wildcard $(CSOURCES:.c=.h)) types.h
+
+DISTFILES=$(EXTRA_DIST) $(SOURCEFILES)
+
+all: chktex
+
+DISTDIR:=chktex-@PACKAGE_VERSION@
+dist: $(DISTDIR).tar.gz
+$(DISTDIR).tar.gz: $(DISTFILES) $(CONFIG_DIST) $(BUILT_DIST) html
+ rm -r $(DISTDIR) 2>/dev/null ; true
+ $(MKDIR_P) $(DISTDIR)
+ for f in $(DISTFILES) ; do \
+ cp $(srcdir)/$$f $(DISTDIR) ; \
+ done
+ cp $(CONFIG_DIST) $(BUILT_DIST) $(DISTDIR)
+ $(MKDIR_P) $(DISTDIR)/html
+ cp HTML/ChkTeX/*.{html,css} $(DISTDIR)/html
+ rm -f $(DISTDIR).tar.gz
+ tar --owner=0 --group=0 -chzf $@ $(DISTDIR)
+ rm -rf $(DISTDIR)
+
+########################################################################
+
+.c.o:
+ $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@
+CLEAN+=$(CSOURCES:.c=.o)
+
+.%.d: %.c
+ $(CC) -M $(CPPFLAGS) $< > $@.tmp
+ sed 's,\($*\)\.o *:,\1.o $@ : Makefile,g' $@.tmp > $@
+ -rm -f $@.tmp 2>/dev/null
+
+DEPFILES=$(patsubst %.c,.%.d,$(CSOURCES))
+CLEAN+=$(DEPFILES)
+
+ifeq ($(findstring clean,$(MAKECMDGOALS)),)
+include $(DEPFILES)
+endif
+
+###################### MAIN DEPENDENCIES ################################
+
+OBJS= ChkTeX.o FindErrs.o OpSys.o Resource.o Utility.o
+
+MAKETEST= (builddir=`pwd` ; cd $(srcdir) ; $${builddir}/chktex -mall -r -g0 -lchktexrc -v5 Test.tex || :)
+
+# We can't grep the output of chtex because it might not be built yet
+TestOutFile := $(shell sed -n 's/.*HAVE_\(.*RE\) 1.*/\1/p' config.h | tr "A-Z_" "a-z-")
+ifeq ($(TestOutFile),)
+TestOutFile := Test.nore.out
+else
+TestOutFile := Test.$(TestOutFile).out
+endif
+$(srcdir)/$(TestOutFile): $(srcdir)/Test.tex
+ -rm -f $(srcdir)/$(TestOutFile)
+ @echo ""
+ @echo "***Warning: creating $(TestOutFile)***"
+ @echo ""
+ $(MAKETEST) 1> $(srcdir)/$(TestOutFile)
+
+check: chktex $(srcdir)/$(TestOutFile)
+ @echo ">>> Testing that checking algorithms work correctly..."
+ @-rm -f chktest
+ $(MAKETEST) 1> chktest
+ @if cmp -s chktest $(srcdir)/$(TestOutFile); 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 -u $(srcdir)/$(TestOutFile) chktest; \
+ fi
+
+
+chktex: $(OBJS)
+ $(CC) $(LDFLAGS) -o chktex $(OBJS) $(LIBS)
+
+install: chktex ChkTeX.dvi
+ $(MKDIR_P) $(DESTDIR)$(bindir)
+ for program in chktex $(BUILT_SCRIPTS); do \
+ $(INSTALL_PROGRAM) $$program $(DESTDIR)$(bindir); \
+ done
+ for program in $(SCRIPTS); do \
+ $(INSTALL_PROGRAM) $(srcdir)/$$program $(DESTDIR)$(bindir); \
+ done
+ $(MKDIR_P) $(DESTDIR)$(sysconfdir)
+ $(INSTALL_DATA) $(srcdir)/chktexrc $(DESTDIR)$(sysconfdir)
+ if (eval echo "$(BUILT_SCRIPTS)") | egrep deweb >/dev/null 2>&1; then \
+ $(MKDIR_P) $(DESTDIR)$(mandir)/man1; \
+ cp $(srcdir)/deweb.1 $(DESTDIR)$(mandir)/man1; \
+ fi
+
+
+
+uninstall:
+ for program in chktex $(SCRIPTS) $(BUILT_SCRIPTS); do \
+ rm -f $(DESTDIR)$(bindir)/$$program; \
+ done
+ rm -f $(DESTDIR)$(sysconfdir)/chktexrc $(DESTDIR)$(mandir)/man1/deweb.1
+
+test:
+ chktex -v2 -mall $(srcdir)/Test.tex | less -r
+
+indent:
+ indent -npsl -bli0 -npcs -nut -i4 $(SOURCEFILES)
+
+mostlyclean: clean
+
+clean:
+ rm -rf $(CLEAN) $(BUILT_DIST) $(DISTDIR).tar.gz \
+ *.aux *.log *.pdf *.dvi *.ps \
+ chktex HTML rme chktest
+
+distclean: clean
+ rm -rf $(CONFIG_DIST) *.cache *.status *.log *.tar.gz \
+ deweb Makefile autom4te.cache config.h
+
+maintainer-clean: distclean
+ rm -rf *.rme install-sh config.guess config.sub aclocal.m4 \
+ configure missing rmeheader stamp-h mkinstalldirs tags
+
+dvi: ChkTeX.dvi
+
+pdf: ChkTeX.pdf
+
+ifneq ($(LATEX2HTML),)
+html: ChkTeX.tex MakeHTML.pl
+ -rm -r HTML
+ $(MKDIR_P) HTML
+ $(PERL5) $(srcdir)/MakeHTML.pl ChkTeX.tex > HTML/ChkTeX.tex
+ cd HTML; $(LATEX2HTML) ChkTeX.tex
+ $(PERL5) -i -pe 's%</code> %</code>%gi;s%\s+([.,?!])%$$1%g;' HTML/ChkTeX/*.html
+
+README: ChkTeX.tex rmeheader MakeHTML.pl
+ rm -rf rme
+ $(MKDIR_P) rme
+ $(PERL5) $(srcdir)/MakeHTML.pl ChkTeX.tex > rme/ChkTeX.tex
+ cd rme; $(LATEX2HTML) -split 0 ChkTeX.tex
+ $(PERL5) -i -pe 's%L<SUP><SMALL>A</SMALL></SUP>%La%g;s%T<SMALL>E</SMALL>X%TeX%g;s%<SUB>(.*)</SUB>%$$1%g' rme/ChkTeX/*.html
+ $(PERL5) -i -pe 's%</code> %</code>%gi;s%\s+([.,?!])%$$1%g;' rme/ChkTeX/*.html
+ $(LYNX) -dump rme/ChkTeX/ChkTeX.html > rme/ChkTeX.rme
+ cp rmeheader 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;' rme/ChkTeX.rme >> README
+ rm -rf rme
+else
+html README:
+ @echo "latex2html is unavailable on this system, cant create target $@."; exit 1
+endif
+
+###################### AUTOCONF REMAKING ################################
+
+$(srcdir)/configure: configure.in aclocal.m4
+ cd $(srcdir) && autoconf
+
+#autoheader might not change config.h.in, so touch a stamp file.
+$(srcdir)/config.h.in: stamp-h.in
+$(srcdir)/stamp-h.in: configure.in aclocal.m4
+ cd $(srcdir) && autoheader
+ echo timestamp > $(srcdir)/stamp-h.in
+
+config.h: stamp-h
+stamp-h: config.h.in config.status
+ ./config.status
+
+ChkTeX.tex: ChkTeX.tex.in
+ ./config.status ChkTeX.tex
+
+Makefile: Makefile.in config.status
+ ./config.status
+
+config.status: configure
+ ./config.status --recheck
+
+###################### INDIVIDUAL DEPENDENCIES ##########################
+
+%.doc: %.1
+ $(GROFF) $< > $@
+
+ChkTeX.dvi: ChkTeX.tex
+ifdef LATEX
+ $(LATEX) ChkTeX.tex
+else
+ echo "No latex program found by configure"
+ false
+endif
+
+ChkTeX.ps: ChkTeX.dvi
+ $(DVIPS) -o ChkTeX.ps ChkTeX.dvi
+
+ChkTeX.pdf: ChkTeX.ps
+ $(PS2PDF) $< $@
+
+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\
+Length: %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
+ for file in $(CSOURCES); do gcov $(GCOVOPTS) $$file; done
+
+valgrind: chktex
+ valgrind --tool=memcheck --leak-check=full chktex -mall -r -g0 -lchktexrc -v5 Test.tex | grep ^[-=][-=]
diff --git a/support/chktex/NEWS b/support/chktex/NEWS
new file mode 100644
index 0000000000..14c389b6b8
--- /dev/null
+++ b/support/chktex/NEWS
@@ -0,0 +1,189 @@
+Development of ChkTeX is now in a maintainance mode. All versions
+1.6.x are essentially bug fixes. Version 1.7 added some new features.
+
+1.7.6 (2016-09-09), released by Ivan Andrus <darthandrus@gmail.com>
+
+ * Properly copy and free strings. This caused incorrect file
+ reporting in some cases #49000
+ * Add "verbatim" commands and environments from tipa #46734
+ * Avoid infinite loop when a regex matches an empty string
+ * Fix crash on invalid regular expression
+ * Add warnings for $$...$$ and $...$ #47044
+ * Update the banner to reflect current bug reporting contacts
+
+1.7.5 (2015-12-07), released by Ivan Andrus <darthandrus@gmail.com>
+
+ * Track whether the previous line ended in a comment #45980
+ * Add a few source code environments to VerbEnvir
+ * Don't show long line warning if the last line doesn't have a newline #46539
+ * Fix deweb's handling of file names #46043,#46042
+ * Use the exit status to indicate warnings were found #45979
+ * Consider OS X a UNIX
+
+1.7.4 (2015-04-11), released by Ivan Andrus <darthandrus@gmail.com>
+
+ * Fixed undefined behavior (patch from TeXLive)
+
+1.7.3 (2015-04-09), released by Ivan Andrus <darthandrus@gmail.com>
+
+ * Fixed memory leaks and a crashing bug #42813
+ * Added ConTeXt \start... \stop... tracking #44517
+ * Added DashExcpt list for exceptions to dash rules #42237
+ * Support \cite with two optional arguments (biblatex) #44413
+ * Removed warning about using \dots instead of .. #40731
+ This incorrectly warns about relative paths
+ * Removed check for intro since it's common in file names #43013
+ * Turn off warning 19 by default #44226
+ Warning 19 is about Latin-1 quotes, but gives false positives
+ for some utf-8 characters.
+
+1.7.2 (2013-04-17), released by Ivan Andrus <darthandrus@gmail.com>
+
+ * Fixed display bug on platforms where sizeof(int) != sizeof(regoff_t)
+ * Warn that .. should be \dots like lacheck does
+ * Fixed warnings under clang
+ * Incorporated several build related patches from TeX Live
+
+1.7.1 (2012-08-22), released by Ivan Andrus <darthandrus@gmail.com>
+
+ * Improvements for TeX Live and CTAN
+ * Fixed bug when checking for interword spacing
+ * Added warning when a file has lines that are too long which can cause problems
+ * Added ability to suppress user regular expression warnings by "naming" them
+ * Added ability to suppress warnings for the rest of the file
+ * Allow using PCRE or POSIX ERE or neither (at configure time).
+ Regular expressions can be marked as PCRE or POSIX only.
+ * Allow () to specify an optional argument in WipeArg to support \cmidrule[](){}
+ * Allow regular expressions for Silent keyword, specified in [] for "case insensitive"
+ * Added warning about \hline and vertical rules in tabular environments
+ * I changed user warnings to be post WipeArg (like they were pre
+ 1.7.0). I had changed them in 1.7.0 to be pre WipeArg so that I
+ could match things like \label{...}, but this caused many false
+ positives by matching in comments, etc.
+
+1.7.0 (2012-05-28), released by Ivan Andrus <darthandrus@gmail.com>
+
+ * Added support for user defined regular expression based warnings
+ * Added support for macros like \ensuremath and \text
+ * Added support for suppressing messages on a single line
+
+1.6.6 (2012-04-07), released by Ivan Andrus <darthandrus@gmail.com>
+
+ * Fixed some memory issues
+ * Do not increase line number when the line was very long
+ * Some fixes for TexLive
+
+1.6.5 (??), released by Jean-Marc Lasgouttes <lasgouttes@lyx.org>
+
+ * Fix bug where ChkTeX generates a warning about missing space before
+ parenthesis when the parenthesis is at start of line.
+ * Update ChkTeX.tex.in to use proper LaTeX2e markup.
+ * Update the build machinery a bit.
+
+1.6.4 (2007-10-20), released by Baruch Even
+
+ * For some reason 1.6.3 did not include all the changes it was supposed to
+ have, this release should fix it. One such issue is the MacOS X
+ compilation.
+ * Include some updates to the default chktexrc from Jean-Marc Lasgouttes.
+
+1.6.3, released by Baruch Even
+
+ * Support DESTDIR for installation to help distributions.
+ * Apply old standing patch from Jean-Marc Lasgouttes to compile outside the
+ directory.
+ * Enable compilation on MacOS X.
+ * Fix various coding issues.
+
+
+Original versions from Jens T. Berger Thielemann:
+=================================================
+
+Modifications and additions since v1.6:
+
+ * Improved the build system
+ * Better fixes for memory access errors
+
+Modifications and additions since v1.5:
+
+ * Fixed a crash when running from emacs
+ * Fixed a crash when checking our own manual
+ * Added \verb* support
+
+Modifications and additions since v1.4:
+
+ ** New 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.
+
+ ** Program
+
+ * 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 Boehm.
+ * 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
+
+ * 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.
+ * You can now specify how many optional or required arguments
+ WIPEARG should wipe; it also behaves somewhat more intelligently
+ 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
+
+ * 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.
diff --git a/support/chktex/OpSys.c b/support/chktex/OpSys.c
new file mode 100644
index 0000000000..7d055b7228
--- /dev/null
+++ b/support/chktex/OpSys.c
@@ -0,0 +1,492 @@
+/*
+ * ChkTeX, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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...:\
+ *
+ */
+
+#include "ChkTeX.h"
+#include "OpSys.h"
+#include "Utility.h"
+
+#ifdef KPATHSEA
+#include <kpathsea/variable.h>
+#endif
+
+#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
+
+/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */
+
+/*
+ * This is the name of the global resource file.
+ */
+
+#ifndef SYSCONFDIR
+# if defined(__unix__)
+# define SYSCONFDIR "/usr/local/lib/"
+# elif defined(__MSDOS__)
+# define SYSCONFDIR "\\emtex\\data\\"
+# else
+# define SYSCONFDIR
+# endif
+#endif
+#define RCBASENAME "chktexrc"
+
+#ifdef __MSDOS__
+# define LOCALRCFILE RCBASENAME
+#elif defined(WIN32)
+# define LOCALRCFILE RCBASENAME
+#else
+# define LOCALRCFILE "." RCBASENAME
+#endif
+
+char ConfigFile[BUFSIZ] = LOCALRCFILE;
+const char *ReverseOn;
+const char *ReverseOff;
+
+
+static int HasFile(char *Dir, const char *Filename, const char *App);
+
+#if USE_RECURSE
+static int SearchFile(char *Dir, const char *Filename, const char *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
+};
+
+
+int SetupVars(void)
+{
+ char *Env;
+#ifdef __MSDOS__
+
+ char *Ptr;
+#endif
+
+ static enum LookIn i = liMin;
+ static int 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")))
+#elif defined(TEX_LIVE)
+ if ((Env = kpse_var_value("CHKTEXRC")))
+#else
+
+ if ((Env = getenv("CHKTEXRC")))
+#endif
+
+ {
+ strcpy(ConfigFile, Env);
+ tackon(ConfigFile, LOCALRCFILE);
+#ifdef TEX_LIVE
+ free(Env);
+#endif
+ }
+ 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 */
+#if defined(__unix__)
+
+ if ((Env = getenv("HOME")) || (Env = getenv("LOGDIR")))
+ {
+ strcpy(ConfigFile, Env);
+ tackon(ConfigFile, LOCALRCFILE);
+ }
+ else
+#elif defined(__MSDOS__)
+
+ strcpy(ConfigFile, PrgName);
+ if ((Ptr = strrchr(ConfigFile, '\\')) ||
+ (Ptr = strchr(ConfigFile, ':')))
+ strcpy(++Ptr, RCBASENAME);
+ else
+#endif
+ *ConfigFile = 0;
+
+ break;
+ case liSysDir: /* System dir for resource files */
+#ifdef TEX_LIVE
+ if ((Env = kpse_var_value("CHKTEX_CONFIG")))
+ {
+ strcpy(ConfigFile, Env);
+ free(Env);
+ }
+ else if ((Env = kpse_var_value("TEXMFMAIN")))
+ {
+ strcpy(ConfigFile, Env);
+ tackon(ConfigFile, "chktex");
+ tackon(ConfigFile, RCBASENAME);
+ free(Env);
+ }
+ else
+ *ConfigFile = 0;
+#else /* TEX_LIVE */
+#if defined(__unix__) || defined(__MSDOS__)
+ strcpy(ConfigFile, SYSCONFDIR);
+ tackon(ConfigFile, RCBASENAME);
+#else
+ *ConfigFile = 0;
+#endif
+#endif /* TEX_LIVE */
+
+ 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;
+ static char str_so[3] = "so", str_se[3] = "se";
+
+ if (termtype)
+ {
+
+ success = tgetent(term_buffer, termtype);
+ if (success < 0)
+ PrintPrgErr(pmNoTermData);
+ if (success == 0)
+ PrintPrgErr(pmNoTermDefd);
+
+ buffer = (char *) malloc(sizeof(term_buffer));
+ ReverseOn = tgetstr(str_so, &buffer);
+ ReverseOff = tgetstr(str_se, &buffer);
+
+ if (ReverseOn && ReverseOff)
+ return;
+ }
+#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(char *Dir, const char *File)
+{
+ int EndC;
+ unsigned long SLen;
+
+ if (Dir && (SLen = strlen(Dir)))
+ {
+ EndC = Dir[SLen - 1];
+ if (!(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(char *Name, const char *App)
+{
+#ifdef __MSDOS__
+ char *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.
+ */
+
+
+int LocateFile(const char *Filename, /* File to search for */
+ char *Dest, /* Where to put final file */
+ const char *App, /* Extra optional appendix */
+ struct WordList *wl) /* List of paths, entries
+ * ending in // will be recursed
+ */
+{
+ unsigned long i;
+#if USE_RECURSE
+
+ unsigned long Len;
+#endif
+
+ 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);
+}
+
+static int HasFile(char *Dir, const char *Filename, const char *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 int SearchFile(char *Dir, const char *Filename, const char *App)
+{
+ struct stat *statbuf;
+ struct dirent *de;
+ DIR *dh;
+
+ int DirLen = strlen(Dir);
+ int 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 */
diff --git a/support/chktex/OpSys.h b/support/chktex/OpSys.h
new file mode 100644
index 0000000000..7ce3f1b527
--- /dev/null
+++ b/support/chktex/OpSys.h
@@ -0,0 +1,207 @@
+/*
+ * ChkTeX, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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
+
+#include "ChkTeX.h"
+#include "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 __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
+# define EXIT_FAILURE 1
+#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.
+ */
+
+
+#ifdef TEX_LIVE
+#if defined(__MSDOS__) || defined(WIN32)
+# define SLASH '\\'
+# define DIRCHARS ":\\"
+#else
+# define SLASH '/'
+# define DIRCHARS "/"
+#endif
+#else /* TEX_LIVE */
+#if defined(__unix__)
+# define SLASH '/'
+#elif defined(__MSDOS__)
+# define SLASH '\\'
+#endif
+
+#if defined(__unix__)
+# define DIRCHARS "/"
+#elif defined(__MSDOS__)
+# define DIRCHARS ":\\"
+#endif
+#endif /* TEX_LIVE */
+
+/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */
+
+/*
+ * 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.
+ */
+
+#if 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.
+ *
+ */
+
+# define PRE_ERROR_STR "\033[7m"
+# define POST_ERROR_STR "\033[0m"
+
+
+/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */
+
+/*
+ * 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 const char *ReverseOn;
+extern const char *ReverseOff;
+extern char ConfigFile[BUFSIZ];
+
+char *MatchFileName(char *String);
+int SetupVars(void);
+void SetupTerm(void);
+void AddAppendix(char *Name, const char *App);
+void tackon(char *, const char *);
+int LocateFile(const char *Filename, char *Dest, const char *App,
+ struct WordList *wl);
+
+#endif /* OPSYS_H */
diff --git a/support/chktex/README b/support/chktex/README
new file mode 100644
index 0000000000..ba09801466
--- /dev/null
+++ b/support/chktex/README
@@ -0,0 +1,22 @@
+ChkTeX
+======
+
+ChkTeX is a tool to check for common errors in LaTeX files. It also
+supports checking CWEB files (uses a perl5 script). It is highly
+customizable allowing you turn off any warnings you don't like, as
+well as add your own warnings. It works easily with Emacs and AUCTeX,
+but should also be easy to interface with other editors. If you have
+interfaced ChkTeX with another editor, please contribute how you did
+it.
+
+It is important to remember that ChkTeX is only intended as a *guide*
+to fixing faults. 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. If you have ideas for
+new warnings or ways in which current warnings could be improved,
+please report them on the
+[bug tracker](https://savannah.nongnu.org/bugs/?group=chktex).
+
+For complete documentation see [the manual](http://www.nongnu.org/chktex/ChkTeX.pdf).
+
+ChkTeX is released under the GNU Public License version 2 or greater.
diff --git a/support/chktex/Resource.c b/support/chktex/Resource.c
new file mode 100644
index 0000000000..f301c6aff2
--- /dev/null
+++ b/support/chktex/Resource.c
@@ -0,0 +1,514 @@
+/*
+ * ChkTeX, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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) const char *a = def;
+
+RESOURCE_INFO
+#undef KEY
+#undef LCASE
+#undef LNEMPTY
+#undef LIST
+struct KeyWord
+{
+ const char *Name;
+ const char **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 **************************/
+
+/* We don't include a trailing semicolon here, so that we can add it
+ * at the calling site, thereby preserving proper indentation. Double
+ * semicolons are undesirable since they have been known to break some
+ * compilers. */
+#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 unsigned long RsrcLine;
+
+static enum Token ReadWord(char *, FILE *);
+static char MapChars(char **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.
+ */
+
+int ReadRC(const char *Filename)
+{
+ const char *String = NULL;
+ int Success = FALSE;
+ FILE *fh;
+ enum Token Token;
+ unsigned long 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);
+ if (!(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:
+ if (!(*(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(char *Buffer, FILE * fh)
+{
+ static char *String = NULL;
+ static char StatBuf[BUFSIZ];
+ enum Token Retval = FLG_Eof;
+
+ unsigned short Chr;
+
+ char *Ptr;
+ int 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:
+ if (!(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((unsigned char)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:
+ if (!(Chr = MapChars(&String)))
+ break;
+
+ *Ptr++ = Chr;
+ break;
+ default:
+ if (!isspace((unsigned char)Chr))
+ *Ptr++ = Chr;
+ else
+ Cont = FALSE;
+ }
+ }
+ Retval = FLG_Item;
+ }
+
+ if (!(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 char MapChars(char **String)
+{
+ int Chr, Tmp = 0;
+ unsigned short Cnt;
+
+ Chr = *((char *) (*String)++);
+
+ switch (tolower((unsigned char)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((unsigned char)Chr))
+ {
+ Chr = toupper((unsigned char)Chr);
+ Tmp = (Tmp << 4) + Chr;
+
+ if (isdigit((unsigned char)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((unsigned char)(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/support/chktex/Resource.h b/support/chktex/Resource.h
new file mode 100644
index 0000000000..c0ebed0bd1
--- /dev/null
+++ b/support/chktex/Resource.h
@@ -0,0 +1,67 @@
+/*
+ * ChkTeX, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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
+
+#include "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 */
+
+/* We cannot put semicolons here as with OPTION_DEFAULTS, since
+ * sometimes LIST etc. will be defined to be empty. Thus we must
+ * never put a semicolon after RESOURCE_INFO where it's called since
+ * such isolated semicolons can break certain compilers. This can
+ * mess with indentation a bit, but we just have to deal with it. */
+#define RESOURCE_INFO \
+ LCASE(Silent) LIST(Linker) LIST(IJAccent) LIST(Italic)\
+ LIST(ItalCmd) LIST(PostLink) LIST(WipeArg) LIST(VerbEnvir)\
+ LIST(MathEnvir) LIST(MathCmd) LIST(TextCmd) LIST(MathRoman)\
+ LIST(HyphDash) LIST(NumDash) LIST(WordDash) LIST(DashExcpt)\
+ LIST(CenterDots) LIST(LowDots) LIST(OutFormat)\
+ LIST(Primitives) LIST(NotPreSpaced) LIST(NonItalic) LIST(NoCharNext)\
+ LNEMPTY(CmdLine) LNEMPTY(TeXInputs)\
+ LCASE(Abbrev) LCASE(UserWarn) LIST(UserWarnRegex)\
+ 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 const char *a;
+
+RESOURCE_INFO
+#undef KEY
+#undef LCASE
+#undef LNEMPTY
+#undef LIST
+int ReadRC(const char *);
+
+
+#endif /* RESOURCE */
diff --git a/support/chktex/Test.nore.out b/support/chktex/Test.nore.out
new file mode 100644
index 0000000000..44e3571500
--- /dev/null
+++ b/support/chktex/Test.nore.out
@@ -0,0 +1,627 @@
+Message 30 in Test.tex: Multiple spaces detected in input.
+ o To test the program upon it
+ ^^^
+Message 30 in Test.tex: Multiple spaces detected in input.
+ o To show off some of the features
+ ^^^
+Message 22 in Test.tex: Comment displayed.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+^
+Message 22 in Test.tex: Comment displayed.
+% Warning 1
+^
+Message 1 in Test.tex: Command terminated with space.
+\foo This is an error.
+ ^
+Message 1 in Test.tex: Command terminated with space.
+So is this \foo
+ ^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+\smallskip This is a not. $\foo Neither$ is this.
+ ^^^^^^^^^^^^^^
+Message 1 in Test.tex: Command terminated with space.
+\stoptext
+ ^
+Message 9 in Test.tex: `section' expected, found `text'.
+\stoptext
+ ^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 2
+^
+Message 2 in Test.tex: Non-breaking space (`~') should have been used.
+This is a faulty reference to \ref{foo}
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Warning 3
+^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+$[(ab)^{-1}]^{-2}$ is not beautiful
+^^^^^^^^^^^^^^^^^^
+Message 3 in Test.tex: You should enclose the previous parenthesis with `{}'.
+$[(ab)^{-1}]^{-2}$ is not beautiful
+ ^
+Message 3 in Test.tex: You should enclose the previous parenthesis with `{}'.
+$[(ab)^{-1}]^{-2}$ is not beautiful
+ ^
+Message 30 in Test.tex: Multiple spaces detected in input.
+$[(ab)^{-1}]^{-2}$ is not beautiful
+ ^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+${{[{(ab)}^{-1}]}}^{-2}$ is beautiful
+^^^^^^^^^^^^^^^^^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 4-6, 28
+^
+Message 6 in Test.tex: No italic correction (`\/') found.
+Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}.
+ ^
+Message 42 in Test.tex: You should remove spaces in front of `\/'
+Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}.
+ ^
+Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer.
+Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}.
+ ^^
+Message 28 in Test.tex: Don't use \/ in front of small punctuation.
+Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}.
+ ^^
+Message 42 in Test.tex: You should remove spaces in front of `\/'
+Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}.
+ ^
+Message 5 in Test.tex: Italic correction (`\/') found more than once.
+Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}.
+ ^^
+Message 22 in Test.tex: Comment displayed.
+% LaTeX2e
+^
+Message 42 in Test.tex: You should remove spaces in front of `\/'
+Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}.
+ ^
+Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer.
+Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}.
+ ^^
+Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer.
+Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}.
+ ^^
+Message 42 in Test.tex: You should remove spaces in front of `\/'
+Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}.
+ ^
+Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer.
+Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}.
+ ^^
+Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer.
+Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}.
+ ^^
+Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer.
+Testing \textem{italic\/} in this \textit{sentence}, as \textem{you see}.
+ ^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 7
+^
+Message 7 in Test.tex: Accent command `\'' needs use of `\i'.
+This \'is a test of $\hat{j}$ accents.
+ ^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+This \'is a test of $\hat{j}$ accents.
+ ^^^^^^^^^
+Message 7 in Test.tex: Accent command `\hat' needs use of `\jmath'.
+This \'is a test of $\hat{j}$ accents.
+ ^^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+This \'{\i}s a test of $\hat{\jmath}$ accents.
+ ^^^^^^^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 8
+^
+Message 8 in Test.tex: Wrong length of dash may have been used.
+It wasn't anything - just a 2---3 star--shots.
+ ^
+Message 8 in Test.tex: Wrong length of dash may have been used.
+It wasn't anything - just a 2---3 star--shots.
+ ^^^
+Message 8 in Test.tex: Wrong length of dash may have been used.
+It wasn't anything - just a 2---3 star--shots.
+ ^^
+Message 22 in Test.tex: Comment displayed.
+% From Knuths TeXbook Chapter 14
+^
+Message 22 in Test.tex: Comment displayed.
+% "How TeX Breaks Paragraphs into Lines", fourth paragraph:
+^
+Message 22 in Test.tex: Comment displayed.
+% Using DashExcpt
+^
+Message 8 in Test.tex: Wrong length of dash may have been used.
+The Birch--Swinnerton--Dyer conjecture is not correct.
+ ^^
+Message 8 in Test.tex: Wrong length of dash may have been used.
+The Birch--Swinnerton--Dyer conjecture is not correct.
+ ^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 9-10
+^
+Message 22 in Test.tex: Comment displayed.
+% Brackets:
+^
+Message 10 in Test.tex: Solo `)' found.
+)}{[])} }}}]]])))
+^
+Message 10 in Test.tex: Solo `}' found.
+)}{[])} }}}]]])))
+ ^
+Message 9 in Test.tex: `}' expected, found `)'.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex: Solo `}' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex: Solo `}' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex: Solo `}' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex: Solo `}' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex: Solo `]' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex: Solo `]' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex: Solo `]' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex: Solo `)' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex: Solo `)' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex: Solo `)' found.
+)}{[])} }}}]]])))
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Envs:
+^
+Message 9 in Test.tex: `baz' expected, found `quux'.
+\begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo}
+ ^^^^
+Message 9 in Test.tex: `quux' expected, found `baz'.
+\begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo}
+ ^^^^
+Message 10 in Test.tex: Solo `asoi' found.
+\begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo}
+ ^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 11
+^
+Message 11 in Test.tex: You should use \ldots to achieve an ellipsis.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^^^^^^^
+Message 11 in Test.tex: You should use \ldots to achieve an ellipsis.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^^^^^^^
+Message 11 in Test.tex: You should use \cdots to achieve an ellipsis.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^^^^^^^^^^
+Message 11 in Test.tex: You should use \ldots to achieve an ellipsis.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^^^^^^^^^^^^^^^^^^
+Message 11 in Test.tex: You should use \cdots to achieve an ellipsis.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$.
+ ^^^^^^^^^^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$.
+ ^^^^^^^^^^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$.
+ ^^^^^^^^^^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$.
+ ^^^^^^^^^^^^^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 12
+^
+Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used.
+1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george
+ ^
+Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used.
+1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george
+ ^
+Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used.
+1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george
+ ^
+Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used.
+1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george
+ ^
+Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used.
+1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george
+ ^
+Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used.
+1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george
+ ^
+Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used.
+1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Warning 13
+^
+Message 13 in Test.tex: Intersentence spacing (`\@') should perhaps be used.
+Look at THIS! It's an error.
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Warning 14
+^
+Message 1 in Test.tex: Command terminated with space.
+\hat
+ ^
+Message 14 in Test.tex: Could not find argument for command.
+\hat
+^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 18,19
+^
+Message 18 in Test.tex: Use either `` or '' as an alternative to `"'.
+Is this an "example", or is it an ´example´.
+ ^
+Message 18 in Test.tex: Use either `` or '' as an alternative to `"'.
+Is this an "example", or is it an ´example´.
+ ^
+Message 19 in Test.tex: Use "'" (ASCII 39) instead of "´" (ASCII 180).
+Is this an "example", or is it an ´example´.
+ ^
+Message 19 in Test.tex: Use "'" (ASCII 39) instead of "´" (ASCII 180).
+Is this an "example", or is it an ´example´.
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Warning 20
+^
+Message 20 in Test.tex: User-specified pattern found: \unknown.
+That bug is \unknown\ to me.
+ ^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% That bug is \unknown\ to me.
+^
+Message 22 in Test.tex: Comment displayed.
+% Warning 21
+^
+Message 21 in Test.tex: This command might not be intended.
+\LaTeX\ is an extension of \TeX\. Right?
+ ^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 23
+^
+Message 23 in Test.tex: Either `\,`` or ``\,` will look better.
+```Hello', I heard him said'', she remembered.
+^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 24
+^
+Message 24 in Test.tex: Delete this space to maintain correct pagereferences.
+Indexing text \index{text} is fun!
+ ^
+Message 22 in Test.tex: Comment displayed.
+Indexing text%
+ ^
+Message 30 in Test.tex: Multiple spaces detected in input.
+ \index{text} is fun!
+ ^^^^
+Message 24 in Test.tex: Delete this space to maintain correct pagereferences.
+ \index{text} is fun!
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Warning 25
+^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+$5\cdot10^10$
+^^^^^^^^^^^^^
+Message 25 in Test.tex: You might wish to put this between a pair of `{}'
+$5\cdot10^10$
+ ^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+$5\cdot10^{10}$
+^^^^^^^^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 26
+^
+Message 26 in Test.tex: You ought to remove spaces in front of punctuation.
+Do you understand ?
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Warning 27
+^
+Message 1 in input.tex: Command terminated with space.
+\this is a test of whether the file is actually inputted...
+ ^
+Message 11 in input.tex: You should use \ldots to achieve an ellipsis.
+\this is a test of whether the file is actually inputted...
+ ^^^
+Message 1 in input.tex: Command terminated with space.
+\this is a test of whether the file is actually inputted...
+ ^
+Message 11 in input.tex: You should use \ldots to achieve an ellipsis.
+\this is a test of whether the file is actually inputted...
+ ^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 29
+^
+Message 29 in Test.tex: $\times$ may look prettier here.
+The program opens a screen sized 640x200 pixels
+ ^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+The program opens a screen sized $640\times200$ pixels
+ ^^^^^^^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 30
+^
+Message 30 in Test.tex: Multiple spaces detected in input.
+White is a beautiful colour.
+ ^^^^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 31
+^
+Message 31 in Test.tex: This text may be ignored.
+\end{verbatim} foo bar
+ ^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 32-34
+^
+Message 32 in Test.tex: Use ` to begin quotation, not '.
+This is either an 'example`, an ''example`` or an `"`example'`'.
+ ^
+Message 33 in Test.tex: Use ' to end quotation, not `.
+This is either an 'example`, an ''example`` or an `"`example'`'.
+ ^
+Message 32 in Test.tex: Use ` to begin quotation, not '.
+This is either an 'example`, an ''example`` or an `"`example'`'.
+ ^^
+Message 33 in Test.tex: Use ' to end quotation, not `.
+This is either an 'example`, an ''example`` or an `"`example'`'.
+ ^^
+Message 34 in Test.tex: Don't mix quotes.
+This is either an 'example`, an ''example`` or an `"`example'`'.
+ ^^^
+Message 34 in Test.tex: Don't mix quotes.
+This is either an 'example`, an ''example`` or an `"`example'`'.
+ ^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 35
+^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+$sin^2 + cos^2 = 1$
+^^^^^^^^^^^^^^^^^^^
+Message 35 in Test.tex: You should perhaps use `\sin' instead.
+$sin^2 + cos^2 = 1$
+ ^^^
+Message 35 in Test.tex: You should perhaps use `\cos' instead.
+$sin^2 + cos^2 = 1$
+ ^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+$\sin^2 + \cos^2 = 1$
+^^^^^^^^^^^^^^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 36-37
+^
+Message 36 in Test.tex: You should put a space in front of parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 37 in Test.tex: You should avoid spaces after parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 36 in Test.tex: You should put a space in front of parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 37 in Test.tex: You should avoid spaces after parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 37 in Test.tex: You should avoid spaces in front of parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 36 in Test.tex: You should put a space in front of parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 37 in Test.tex: You should avoid spaces after parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 37 in Test.tex: You should avoid spaces in front of parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 36 in Test.tex: You should put a space after parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Warning 38
+^
+Message 38 in Test.tex: You should not use punctuation in front of quotes.
+``An example,'' he said, ``would be great.''
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Warning 39
+^
+Message 39 in Test.tex: Double space found.
+For output codes, see table ~\ref{tab:fmtout}.
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Warning 40
+^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+$\this,$ and $$this$$.
+^^^^^^^^
+Message 40 in Test.tex: You should put punctuation outside inner math mode.
+$\this,$ and $$this$$.
+ ^
+Message 45 in Test.tex: Use \[ ... \] instead of $$ ... $$.
+$\this,$ and $$this$$.
+ ^^^^^^^^
+Message 40 in Test.tex: You should put punctuation inside display math mode.
+$\this,$ and $$this$$.
+ ^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+$\this$, and $$this.$$
+^^^^^^^
+Message 45 in Test.tex: Use \[ ... \] instead of $$ ... $$.
+$\this$, and $$this.$$
+ ^^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 41
+^
+Message 1 in Test.tex: Command terminated with space.
+foo \above qux
+ ^
+Message 41 in Test.tex: You ought to not use primitive TeX in LaTeX code.
+foo \above qux
+ ^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 42
+^
+Message 42 in Test.tex: You should remove spaces in front of `\footnote'
+This is a footnote \footnote{foo}.
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Warning 43
+^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Here is a mistake $\left{x\right}$.
+ ^^^^^^^^^^^^^^^^
+Message 43 in Test.tex: `\left' is normally not followed by `{'.
+Here is a mistake $\left{x\right}$.
+ ^^^^^
+Message 43 in Test.tex: `\right' is normally not followed by `}'.
+Here is a mistake $\left{x\right}$.
+ ^^^^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+This one triggers warning 22 $\left\{x\right\}$.
+ ^^^^^^^^^^^^^^^^^^
+Message 21 in Test.tex: This command might not be intended.
+This one triggers warning 22 $\left\{x\right\}$.
+ ^^
+Message 21 in Test.tex: This command might not be intended.
+This one triggers warning 22 $\left\{x\right\}$.
+ ^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Here \chktex\ doesn't complain $\left\lbrace x\right\rbrace$.
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 44 -- user regex -- default message
+^
+Message 22 in Test.tex: Comment displayed.
+% Warning 44 -- user regex -- user message
+^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+For every $p\not|n$ you have an ugly prime which doesn't divide $n$.
+ ^^^^^^^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+For every $p\not|n$ you have an ugly prime which doesn't divide $n$.
+ ^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+For every $p\nmid n$ you have a cute prime which doesn't divide $n$.
+ ^^^^^^^^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+For every $p\nmid n$ you have a cute prime which doesn't divide $n$.
+ ^^^
+Message 22 in Test.tex: Comment displayed.
+% Math mode check
+^
+Message 35 in Test.tex: You should perhaps use `\sin' instead.
+\ensuremath{sin x\text{is not the same as sin x, but is the same as $sin x$}}
+ ^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+\ensuremath{sin x\text{is not the same as sin x, but is the same as $sin x$}}
+ ^^^^^^^
+Message 35 in Test.tex: You should perhaps use `\sin' instead.
+\ensuremath{sin x\text{is not the same as sin x, but is the same as $sin x$}}
+ ^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Also, $x(3)\text{ is not x(3) but it is $x(3)$}$
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Message 36 in Test.tex: You should put a space in front of parenthesis.
+Also, $x(3)\text{ is not x(3) but it is $x(3)$}$
+ ^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Also, $x(3)\text{ is not x(3) but it is $x(3)$}$
+ ^^^^^^
+Message 22 in Test.tex: Comment displayed.
+This is\\% a comment. Nothing here should be checked(right)?
+ ^
+Message 36 in Test.tex: You should put a space in front of parenthesis.
+But this is not a \% comment, so we should find this error(right)?
+ ^
+Message 22 in Test.tex: Comment displayed.
+Here(on this line only)is a warning $sin(x)$ suppressed. % chktex 36 chktex 35
+ ^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Here(on this line only)is a warning $sin(x)$ suppressed. % chktex 36 chktex 35
+ ^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36
+ ^
+Message 36 in Test.tex: You should put a space in front of parenthesis.
+Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36
+ ^
+Message 36 in Test.tex: You should put a space after parenthesis.
+Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36
+ ^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36
+ ^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+In section~\ref{sec:4} it is suppressed. % chktex -1
+ ^
+Message 22 in Test.tex: Comment displayed.
+% In section~\ref{sec:5} we don't have a warning.
+^
+Message 22 in Test.tex: Comment displayed.
+% Verb check
+^
+Message 14 in Test.tex: Could not find argument for command.
+\verb#
+^^^^^
+Message 31 in Test.tex: This text may be ignored.
+\end{verbatim} FOO
+ ^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 16,15
+^
+Message 45 in Test.tex: Use \[ ... \] instead of $$ ... $$.
+$$(
+^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Local Variables:
+^
+Message 22 in Test.tex: Comment displayed.
+% require-final-newline: nil
+^
+Message 22 in Test.tex: Comment displayed.
+% End:
+^
+Message 22 in Test.tex: Comment displayed.
+% There should be no newline at the end of this file to test bug #46539
+^
+Message 16 in Test.tex: Mathmode still on at end of LaTeX file.
+
+
+Message 17 in Test.tex: Number of `(' doesn't match the number of `)'!
+
+
+Message 17 in Test.tex: Number of `[' doesn't match the number of `]'!
+
+
+Message 17 in Test.tex: Number of `{' doesn't match the number of `}'!
+
+
diff --git a/support/chktex/Test.pcre.out b/support/chktex/Test.pcre.out
new file mode 100644
index 0000000000..c2e8eefac2
--- /dev/null
+++ b/support/chktex/Test.pcre.out
@@ -0,0 +1,636 @@
+Message 30 in Test.tex: Multiple spaces detected in input.
+ o To test the program upon it
+ ^^^
+Message 30 in Test.tex: Multiple spaces detected in input.
+ o To show off some of the features
+ ^^^
+Message 22 in Test.tex: Comment displayed.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+^
+Message 22 in Test.tex: Comment displayed.
+% Warning 1
+^
+Message 1 in Test.tex: Command terminated with space.
+\foo This is an error.
+ ^
+Message 1 in Test.tex: Command terminated with space.
+So is this \foo
+ ^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+\smallskip This is a not. $\foo Neither$ is this.
+ ^^^^^^^^^^^^^^
+Message 9 in Test.tex: `section' expected, found `text'.
+\stoptext
+ ^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 2
+^
+Message 2 in Test.tex: Non-breaking space (`~') should have been used.
+This is a faulty reference to \ref{foo}
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Warning 3
+^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+$[(ab)^{-1}]^{-2}$ is not beautiful
+^^^^^^^^^^^^^^^^^^
+Message 3 in Test.tex: You should enclose the previous parenthesis with `{}'.
+$[(ab)^{-1}]^{-2}$ is not beautiful
+ ^
+Message 3 in Test.tex: You should enclose the previous parenthesis with `{}'.
+$[(ab)^{-1}]^{-2}$ is not beautiful
+ ^
+Message 30 in Test.tex: Multiple spaces detected in input.
+$[(ab)^{-1}]^{-2}$ is not beautiful
+ ^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+${{[{(ab)}^{-1}]}}^{-2}$ is beautiful
+^^^^^^^^^^^^^^^^^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 4-6, 28
+^
+Message 6 in Test.tex: No italic correction (`\/') found.
+Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}.
+ ^
+Message 42 in Test.tex: You should remove spaces in front of `\/'
+Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}.
+ ^
+Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer.
+Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}.
+ ^^
+Message 28 in Test.tex: Don't use \/ in front of small punctuation.
+Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}.
+ ^^
+Message 42 in Test.tex: You should remove spaces in front of `\/'
+Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}.
+ ^
+Message 5 in Test.tex: Italic correction (`\/') found more than once.
+Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}.
+ ^^
+Message 22 in Test.tex: Comment displayed.
+% LaTeX2e
+^
+Message 42 in Test.tex: You should remove spaces in front of `\/'
+Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}.
+ ^
+Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer.
+Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}.
+ ^^
+Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer.
+Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}.
+ ^^
+Message 42 in Test.tex: You should remove spaces in front of `\/'
+Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}.
+ ^
+Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer.
+Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}.
+ ^^
+Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer.
+Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}.
+ ^^
+Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer.
+Testing \textem{italic\/} in this \textit{sentence}, as \textem{you see}.
+ ^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 7
+^
+Message 7 in Test.tex: Accent command `\'' needs use of `\i'.
+This \'is a test of $\hat{j}$ accents.
+ ^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+This \'is a test of $\hat{j}$ accents.
+ ^^^^^^^^^
+Message 7 in Test.tex: Accent command `\hat' needs use of `\jmath'.
+This \'is a test of $\hat{j}$ accents.
+ ^^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+This \'{\i}s a test of $\hat{\jmath}$ accents.
+ ^^^^^^^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 8
+^
+Message 8 in Test.tex: Wrong length of dash may have been used.
+It wasn't anything - just a 2---3 star--shots.
+ ^
+Message 8 in Test.tex: Wrong length of dash may have been used.
+It wasn't anything - just a 2---3 star--shots.
+ ^^^
+Message 8 in Test.tex: Wrong length of dash may have been used.
+It wasn't anything - just a 2---3 star--shots.
+ ^^
+Message 22 in Test.tex: Comment displayed.
+% From Knuths TeXbook Chapter 14
+^
+Message 22 in Test.tex: Comment displayed.
+% "How TeX Breaks Paragraphs into Lines", fourth paragraph:
+^
+Message 22 in Test.tex: Comment displayed.
+% Using DashExcpt
+^
+Message 8 in Test.tex: Wrong length of dash may have been used.
+The Birch--Swinnerton--Dyer conjecture is not correct.
+ ^^
+Message 8 in Test.tex: Wrong length of dash may have been used.
+The Birch--Swinnerton--Dyer conjecture is not correct.
+ ^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 9-10
+^
+Message 22 in Test.tex: Comment displayed.
+% Brackets:
+^
+Message 10 in Test.tex: Solo `)' found.
+)}{[])} }}}]]])))
+^
+Message 10 in Test.tex: Solo `}' found.
+)}{[])} }}}]]])))
+ ^
+Message 9 in Test.tex: `}' expected, found `)'.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex: Solo `}' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex: Solo `}' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex: Solo `}' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex: Solo `}' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex: Solo `]' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex: Solo `]' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex: Solo `]' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex: Solo `)' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex: Solo `)' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex: Solo `)' found.
+)}{[])} }}}]]])))
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Envs:
+^
+Message 9 in Test.tex: `baz' expected, found `quux'.
+\begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo}
+ ^^^^
+Message 9 in Test.tex: `quux' expected, found `baz'.
+\begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo}
+ ^^^^
+Message 10 in Test.tex: Solo `asoi' found.
+\begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo}
+ ^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 11
+^
+Message 11 in Test.tex: You should use \ldots to achieve an ellipsis.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^^^^^^^
+Message 11 in Test.tex: You should use \ldots to achieve an ellipsis.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^^^^^^^
+Message 11 in Test.tex: You should use \cdots to achieve an ellipsis.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^^^^^^^^^^
+Message 11 in Test.tex: You should use \ldots to achieve an ellipsis.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^^^^^^^^^^^^^^^^^^
+Message 11 in Test.tex: You should use \cdots to achieve an ellipsis.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$.
+ ^^^^^^^^^^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$.
+ ^^^^^^^^^^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$.
+ ^^^^^^^^^^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$.
+ ^^^^^^^^^^^^^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 12
+^
+Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used.
+1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george
+ ^
+Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used.
+1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george
+ ^
+Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used.
+1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george
+ ^
+Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used.
+1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george
+ ^
+Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used.
+1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george
+ ^
+Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used.
+1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george
+ ^
+Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used.
+1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Warning 13
+^
+Message 13 in Test.tex: Intersentence spacing (`\@') should perhaps be used.
+Look at THIS! It's an error.
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Warning 14
+^
+Message 1 in Test.tex: Command terminated with space.
+\hat
+ ^
+Message 14 in Test.tex: Could not find argument for command.
+\hat
+^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 18,19
+^
+Message 18 in Test.tex: Use either `` or '' as an alternative to `"'.
+Is this an "example", or is it an ´example´.
+ ^
+Message 18 in Test.tex: Use either `` or '' as an alternative to `"'.
+Is this an "example", or is it an ´example´.
+ ^
+Message 19 in Test.tex: Use "'" (ASCII 39) instead of "´" (ASCII 180).
+Is this an "example", or is it an ´example´.
+ ^
+Message 19 in Test.tex: Use "'" (ASCII 39) instead of "´" (ASCII 180).
+Is this an "example", or is it an ´example´.
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Warning 20
+^
+Message 20 in Test.tex: User-specified pattern found: \unknown.
+That bug is \unknown\ to me.
+ ^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% That bug is \unknown\ to me.
+^
+Message 22 in Test.tex: Comment displayed.
+% Warning 21
+^
+Message 21 in Test.tex: This command might not be intended.
+\LaTeX\ is an extension of \TeX\. Right?
+ ^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 23
+^
+Message 23 in Test.tex: Either `\,`` or ``\,` will look better.
+```Hello', I heard him said'', she remembered.
+^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 24
+^
+Message 24 in Test.tex: Delete this space to maintain correct pagereferences.
+Indexing text \index{text} is fun!
+ ^
+Message 22 in Test.tex: Comment displayed.
+Indexing text%
+ ^
+Message 30 in Test.tex: Multiple spaces detected in input.
+ \index{text} is fun!
+ ^^^^
+Message 24 in Test.tex: Delete this space to maintain correct pagereferences.
+ \index{text} is fun!
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Warning 25
+^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+$5\cdot10^10$
+^^^^^^^^^^^^^
+Message 25 in Test.tex: You might wish to put this between a pair of `{}'
+$5\cdot10^10$
+ ^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+$5\cdot10^{10}$
+^^^^^^^^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 26
+^
+Message 26 in Test.tex: You ought to remove spaces in front of punctuation.
+Do you understand ?
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Warning 27
+^
+Message 1 in input.tex: Command terminated with space.
+\this is a test of whether the file is actually inputted...
+ ^
+Message 11 in input.tex: You should use \ldots to achieve an ellipsis.
+\this is a test of whether the file is actually inputted...
+ ^^^
+Message 1 in input.tex: Command terminated with space.
+\this is a test of whether the file is actually inputted...
+ ^
+Message 11 in input.tex: You should use \ldots to achieve an ellipsis.
+\this is a test of whether the file is actually inputted...
+ ^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 29
+^
+Message 29 in Test.tex: $\times$ may look prettier here.
+The program opens a screen sized 640x200 pixels
+ ^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+The program opens a screen sized $640\times200$ pixels
+ ^^^^^^^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 30
+^
+Message 30 in Test.tex: Multiple spaces detected in input.
+White is a beautiful colour.
+ ^^^^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 31
+^
+Message 31 in Test.tex: This text may be ignored.
+\end{verbatim} foo bar
+ ^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 32-34
+^
+Message 32 in Test.tex: Use ` to begin quotation, not '.
+This is either an 'example`, an ''example`` or an `"`example'`'.
+ ^
+Message 33 in Test.tex: Use ' to end quotation, not `.
+This is either an 'example`, an ''example`` or an `"`example'`'.
+ ^
+Message 32 in Test.tex: Use ` to begin quotation, not '.
+This is either an 'example`, an ''example`` or an `"`example'`'.
+ ^^
+Message 33 in Test.tex: Use ' to end quotation, not `.
+This is either an 'example`, an ''example`` or an `"`example'`'.
+ ^^
+Message 34 in Test.tex: Don't mix quotes.
+This is either an 'example`, an ''example`` or an `"`example'`'.
+ ^^^
+Message 34 in Test.tex: Don't mix quotes.
+This is either an 'example`, an ''example`` or an `"`example'`'.
+ ^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 35
+^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+$sin^2 + cos^2 = 1$
+^^^^^^^^^^^^^^^^^^^
+Message 35 in Test.tex: You should perhaps use `\sin' instead.
+$sin^2 + cos^2 = 1$
+ ^^^
+Message 35 in Test.tex: You should perhaps use `\cos' instead.
+$sin^2 + cos^2 = 1$
+ ^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+$\sin^2 + \cos^2 = 1$
+^^^^^^^^^^^^^^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 36-37
+^
+Message 36 in Test.tex: You should put a space in front of parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 37 in Test.tex: You should avoid spaces after parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 36 in Test.tex: You should put a space in front of parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 37 in Test.tex: You should avoid spaces after parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 37 in Test.tex: You should avoid spaces in front of parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 36 in Test.tex: You should put a space in front of parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 37 in Test.tex: You should avoid spaces after parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 37 in Test.tex: You should avoid spaces in front of parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 36 in Test.tex: You should put a space after parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Warning 38
+^
+Message 38 in Test.tex: You should not use punctuation in front of quotes.
+``An example,'' he said, ``would be great.''
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Warning 39
+^
+Message 39 in Test.tex: Double space found.
+For output codes, see table ~\ref{tab:fmtout}.
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Warning 40
+^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+$\this,$ and $$this$$.
+^^^^^^^^
+Message 40 in Test.tex: You should put punctuation outside inner math mode.
+$\this,$ and $$this$$.
+ ^
+Message 45 in Test.tex: Use \[ ... \] instead of $$ ... $$.
+$\this,$ and $$this$$.
+ ^^^^^^^^
+Message 40 in Test.tex: You should put punctuation inside display math mode.
+$\this,$ and $$this$$.
+ ^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+$\this$, and $$this.$$
+^^^^^^^
+Message 45 in Test.tex: Use \[ ... \] instead of $$ ... $$.
+$\this$, and $$this.$$
+ ^^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 41
+^
+Message 1 in Test.tex: Command terminated with space.
+foo \above qux
+ ^
+Message 41 in Test.tex: You ought to not use primitive TeX in LaTeX code.
+foo \above qux
+ ^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 42
+^
+Message 42 in Test.tex: You should remove spaces in front of `\footnote'
+This is a footnote \footnote{foo}.
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Warning 43
+^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Here is a mistake $\left{x\right}$.
+ ^^^^^^^^^^^^^^^^
+Message 43 in Test.tex: `\left' is normally not followed by `{'.
+Here is a mistake $\left{x\right}$.
+ ^^^^^
+Message 43 in Test.tex: `\right' is normally not followed by `}'.
+Here is a mistake $\left{x\right}$.
+ ^^^^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+This one triggers warning 22 $\left\{x\right\}$.
+ ^^^^^^^^^^^^^^^^^^
+Message 21 in Test.tex: This command might not be intended.
+This one triggers warning 22 $\left\{x\right\}$.
+ ^^
+Message 21 in Test.tex: This command might not be intended.
+This one triggers warning 22 $\left\{x\right\}$.
+ ^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Here \chktex\ doesn't complain $\left\lbrace x\right\rbrace$.
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 44 -- user regex -- default message
+^
+Message 22 in Test.tex: Comment displayed.
+% Warning 44 -- user regex -- user message
+^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+For every $p\not|n$ you have an ugly prime which doesn't divide $n$.
+ ^^^^^^^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+For every $p\not|n$ you have an ugly prime which doesn't divide $n$.
+ ^^^
+Message 44 in Test.tex: User Regex: Always use \nmid.
+For every $p\not|n$ you have an ugly prime which doesn't divide $n$.
+ ^^^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+For every $p\nmid n$ you have a cute prime which doesn't divide $n$.
+ ^^^^^^^^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+For every $p\nmid n$ you have a cute prime which doesn't divide $n$.
+ ^^^
+Message 22 in Test.tex: Comment displayed.
+% Math mode check
+^
+Message 35 in Test.tex: You should perhaps use `\sin' instead.
+\ensuremath{sin x\text{is not the same as sin x, but is the same as $sin x$}}
+ ^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+\ensuremath{sin x\text{is not the same as sin x, but is the same as $sin x$}}
+ ^^^^^^^
+Message 35 in Test.tex: You should perhaps use `\sin' instead.
+\ensuremath{sin x\text{is not the same as sin x, but is the same as $sin x$}}
+ ^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Also, $x(3)\text{ is not x(3) but it is $x(3)$}$
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Message 36 in Test.tex: You should put a space in front of parenthesis.
+Also, $x(3)\text{ is not x(3) but it is $x(3)$}$
+ ^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Also, $x(3)\text{ is not x(3) but it is $x(3)$}$
+ ^^^^^^
+Message 22 in Test.tex: Comment displayed.
+This is\\% a comment. Nothing here should be checked(right)?
+ ^
+Message 36 in Test.tex: You should put a space in front of parenthesis.
+But this is not a \% comment, so we should find this error(right)?
+ ^
+Message 22 in Test.tex: Comment displayed.
+Here(on this line only)is a warning $sin(x)$ suppressed. % chktex 36 chktex 35
+ ^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Here(on this line only)is a warning $sin(x)$ suppressed. % chktex 36 chktex 35
+ ^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36
+ ^
+Message 36 in Test.tex: You should put a space in front of parenthesis.
+Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36
+ ^
+Message 36 in Test.tex: You should put a space after parenthesis.
+Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36
+ ^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36
+ ^^^^^^^^
+Message 44 in Test.tex: User Regex: -1:Capitalize before references.
+In section~\ref{sec:3} we have a warning.
+ ^^^^^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+In section~\ref{sec:4} it is suppressed. % chktex -1
+ ^
+Message 22 in Test.tex: Comment displayed.
+% In section~\ref{sec:5} we don't have a warning.
+^
+Message 44 in Test.tex: User Regex: -2:Vertical rules in tables are ugly.
+\begin{tabular*}{1.0\linewidth}[h]{|c|cc|}
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Message 44 in Test.tex: User Regex: -2:Use \toprule, midrule, or \bottomrule from booktabs.
+ \hline
+ ^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Verb check
+^
+Message 14 in Test.tex: Could not find argument for command.
+\verb#
+^^^^^
+Message 31 in Test.tex: This text may be ignored.
+\end{verbatim} FOO
+ ^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 16,15
+^
+Message 45 in Test.tex: Use \[ ... \] instead of $$ ... $$.
+$$(
+^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Local Variables:
+^
+Message 22 in Test.tex: Comment displayed.
+% require-final-newline: nil
+^
+Message 22 in Test.tex: Comment displayed.
+% End:
+^
+Message 22 in Test.tex: Comment displayed.
+% There should be no newline at the end of this file to test bug #46539
+^
+Message 16 in Test.tex: Mathmode still on at end of LaTeX file.
+
+
+Message 17 in Test.tex: Number of `(' doesn't match the number of `)'!
+
+
+Message 17 in Test.tex: Number of `[' doesn't match the number of `]'!
+
+
+Message 17 in Test.tex: Number of `{' doesn't match the number of `}'!
+
+
diff --git a/support/chktex/Test.posix-ere.out b/support/chktex/Test.posix-ere.out
new file mode 100644
index 0000000000..c89ce36936
--- /dev/null
+++ b/support/chktex/Test.posix-ere.out
@@ -0,0 +1,636 @@
+Message 30 in Test.tex: Multiple spaces detected in input.
+ o To test the program upon it
+ ^^^
+Message 30 in Test.tex: Multiple spaces detected in input.
+ o To show off some of the features
+ ^^^
+Message 22 in Test.tex: Comment displayed.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+^
+Message 22 in Test.tex: Comment displayed.
+% Warning 1
+^
+Message 1 in Test.tex: Command terminated with space.
+\foo This is an error.
+ ^
+Message 1 in Test.tex: Command terminated with space.
+So is this \foo
+ ^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+\smallskip This is a not. $\foo Neither$ is this.
+ ^^^^^^^^^^^^^^
+Message 9 in Test.tex: `section' expected, found `text'.
+\stoptext
+ ^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 2
+^
+Message 2 in Test.tex: Non-breaking space (`~') should have been used.
+This is a faulty reference to \ref{foo}
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Warning 3
+^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+$[(ab)^{-1}]^{-2}$ is not beautiful
+^^^^^^^^^^^^^^^^^^
+Message 3 in Test.tex: You should enclose the previous parenthesis with `{}'.
+$[(ab)^{-1}]^{-2}$ is not beautiful
+ ^
+Message 3 in Test.tex: You should enclose the previous parenthesis with `{}'.
+$[(ab)^{-1}]^{-2}$ is not beautiful
+ ^
+Message 30 in Test.tex: Multiple spaces detected in input.
+$[(ab)^{-1}]^{-2}$ is not beautiful
+ ^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+${{[{(ab)}^{-1}]}}^{-2}$ is beautiful
+^^^^^^^^^^^^^^^^^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 4-6, 28
+^
+Message 6 in Test.tex: No italic correction (`\/') found.
+Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}.
+ ^
+Message 42 in Test.tex: You should remove spaces in front of `\/'
+Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}.
+ ^
+Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer.
+Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}.
+ ^^
+Message 28 in Test.tex: Don't use \/ in front of small punctuation.
+Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}.
+ ^^
+Message 42 in Test.tex: You should remove spaces in front of `\/'
+Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}.
+ ^
+Message 5 in Test.tex: Italic correction (`\/') found more than once.
+Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}.
+ ^^
+Message 22 in Test.tex: Comment displayed.
+% LaTeX2e
+^
+Message 42 in Test.tex: You should remove spaces in front of `\/'
+Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}.
+ ^
+Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer.
+Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}.
+ ^^
+Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer.
+Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}.
+ ^^
+Message 42 in Test.tex: You should remove spaces in front of `\/'
+Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}.
+ ^
+Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer.
+Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}.
+ ^^
+Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer.
+Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}.
+ ^^
+Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer.
+Testing \textem{italic\/} in this \textit{sentence}, as \textem{you see}.
+ ^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 7
+^
+Message 7 in Test.tex: Accent command `\'' needs use of `\i'.
+This \'is a test of $\hat{j}$ accents.
+ ^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+This \'is a test of $\hat{j}$ accents.
+ ^^^^^^^^^
+Message 7 in Test.tex: Accent command `\hat' needs use of `\jmath'.
+This \'is a test of $\hat{j}$ accents.
+ ^^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+This \'{\i}s a test of $\hat{\jmath}$ accents.
+ ^^^^^^^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 8
+^
+Message 8 in Test.tex: Wrong length of dash may have been used.
+It wasn't anything - just a 2---3 star--shots.
+ ^
+Message 8 in Test.tex: Wrong length of dash may have been used.
+It wasn't anything - just a 2---3 star--shots.
+ ^^^
+Message 8 in Test.tex: Wrong length of dash may have been used.
+It wasn't anything - just a 2---3 star--shots.
+ ^^
+Message 22 in Test.tex: Comment displayed.
+% From Knuths TeXbook Chapter 14
+^
+Message 22 in Test.tex: Comment displayed.
+% "How TeX Breaks Paragraphs into Lines", fourth paragraph:
+^
+Message 22 in Test.tex: Comment displayed.
+% Using DashExcpt
+^
+Message 8 in Test.tex: Wrong length of dash may have been used.
+The Birch--Swinnerton--Dyer conjecture is not correct.
+ ^^
+Message 8 in Test.tex: Wrong length of dash may have been used.
+The Birch--Swinnerton--Dyer conjecture is not correct.
+ ^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 9-10
+^
+Message 22 in Test.tex: Comment displayed.
+% Brackets:
+^
+Message 10 in Test.tex: Solo `)' found.
+)}{[])} }}}]]])))
+^
+Message 10 in Test.tex: Solo `}' found.
+)}{[])} }}}]]])))
+ ^
+Message 9 in Test.tex: `}' expected, found `)'.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex: Solo `}' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex: Solo `}' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex: Solo `}' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex: Solo `}' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex: Solo `]' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex: Solo `]' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex: Solo `]' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex: Solo `)' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex: Solo `)' found.
+)}{[])} }}}]]])))
+ ^
+Message 10 in Test.tex: Solo `)' found.
+)}{[])} }}}]]])))
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Envs:
+^
+Message 9 in Test.tex: `baz' expected, found `quux'.
+\begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo}
+ ^^^^
+Message 9 in Test.tex: `quux' expected, found `baz'.
+\begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo}
+ ^^^^
+Message 10 in Test.tex: Solo `asoi' found.
+\begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo}
+ ^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 11
+^
+Message 11 in Test.tex: You should use \ldots to achieve an ellipsis.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^^^^^^^
+Message 11 in Test.tex: You should use \ldots to achieve an ellipsis.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^^^^^^^
+Message 11 in Test.tex: You should use \cdots to achieve an ellipsis.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^^^^^^^^^^
+Message 11 in Test.tex: You should use \ldots to achieve an ellipsis.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^^^^^^^^^^^^^^^^^^
+Message 11 in Test.tex: You should use \cdots to achieve an ellipsis.
+Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$.
+ ^^^^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$.
+ ^^^^^^^^^^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$.
+ ^^^^^^^^^^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$.
+ ^^^^^^^^^^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$.
+ ^^^^^^^^^^^^^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 12
+^
+Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used.
+1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george
+ ^
+Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used.
+1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george
+ ^
+Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used.
+1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george
+ ^
+Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used.
+1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george
+ ^
+Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used.
+1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george
+ ^
+Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used.
+1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george
+ ^
+Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used.
+1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Warning 13
+^
+Message 13 in Test.tex: Intersentence spacing (`\@') should perhaps be used.
+Look at THIS! It's an error.
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Warning 14
+^
+Message 1 in Test.tex: Command terminated with space.
+\hat
+ ^
+Message 14 in Test.tex: Could not find argument for command.
+\hat
+^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 18,19
+^
+Message 18 in Test.tex: Use either `` or '' as an alternative to `"'.
+Is this an "example", or is it an ´example´.
+ ^
+Message 18 in Test.tex: Use either `` or '' as an alternative to `"'.
+Is this an "example", or is it an ´example´.
+ ^
+Message 19 in Test.tex: Use "'" (ASCII 39) instead of "´" (ASCII 180).
+Is this an "example", or is it an ´example´.
+ ^
+Message 19 in Test.tex: Use "'" (ASCII 39) instead of "´" (ASCII 180).
+Is this an "example", or is it an ´example´.
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Warning 20
+^
+Message 20 in Test.tex: User-specified pattern found: \unknown.
+That bug is \unknown\ to me.
+ ^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% That bug is \unknown\ to me.
+^
+Message 22 in Test.tex: Comment displayed.
+% Warning 21
+^
+Message 21 in Test.tex: This command might not be intended.
+\LaTeX\ is an extension of \TeX\. Right?
+ ^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 23
+^
+Message 23 in Test.tex: Either `\,`` or ``\,` will look better.
+```Hello', I heard him said'', she remembered.
+^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 24
+^
+Message 24 in Test.tex: Delete this space to maintain correct pagereferences.
+Indexing text \index{text} is fun!
+ ^
+Message 22 in Test.tex: Comment displayed.
+Indexing text%
+ ^
+Message 30 in Test.tex: Multiple spaces detected in input.
+ \index{text} is fun!
+ ^^^^
+Message 24 in Test.tex: Delete this space to maintain correct pagereferences.
+ \index{text} is fun!
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Warning 25
+^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+$5\cdot10^10$
+^^^^^^^^^^^^^
+Message 25 in Test.tex: You might wish to put this between a pair of `{}'
+$5\cdot10^10$
+ ^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+$5\cdot10^{10}$
+^^^^^^^^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 26
+^
+Message 26 in Test.tex: You ought to remove spaces in front of punctuation.
+Do you understand ?
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Warning 27
+^
+Message 1 in input.tex: Command terminated with space.
+\this is a test of whether the file is actually inputted...
+ ^
+Message 11 in input.tex: You should use \ldots to achieve an ellipsis.
+\this is a test of whether the file is actually inputted...
+ ^^^
+Message 1 in input.tex: Command terminated with space.
+\this is a test of whether the file is actually inputted...
+ ^
+Message 11 in input.tex: You should use \ldots to achieve an ellipsis.
+\this is a test of whether the file is actually inputted...
+ ^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 29
+^
+Message 29 in Test.tex: $\times$ may look prettier here.
+The program opens a screen sized 640x200 pixels
+ ^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+The program opens a screen sized $640\times200$ pixels
+ ^^^^^^^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 30
+^
+Message 30 in Test.tex: Multiple spaces detected in input.
+White is a beautiful colour.
+ ^^^^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 31
+^
+Message 31 in Test.tex: This text may be ignored.
+\end{verbatim} foo bar
+ ^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 32-34
+^
+Message 32 in Test.tex: Use ` to begin quotation, not '.
+This is either an 'example`, an ''example`` or an `"`example'`'.
+ ^
+Message 33 in Test.tex: Use ' to end quotation, not `.
+This is either an 'example`, an ''example`` or an `"`example'`'.
+ ^
+Message 32 in Test.tex: Use ` to begin quotation, not '.
+This is either an 'example`, an ''example`` or an `"`example'`'.
+ ^^
+Message 33 in Test.tex: Use ' to end quotation, not `.
+This is either an 'example`, an ''example`` or an `"`example'`'.
+ ^^
+Message 34 in Test.tex: Don't mix quotes.
+This is either an 'example`, an ''example`` or an `"`example'`'.
+ ^^^
+Message 34 in Test.tex: Don't mix quotes.
+This is either an 'example`, an ''example`` or an `"`example'`'.
+ ^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 35
+^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+$sin^2 + cos^2 = 1$
+^^^^^^^^^^^^^^^^^^^
+Message 35 in Test.tex: You should perhaps use `\sin' instead.
+$sin^2 + cos^2 = 1$
+ ^^^
+Message 35 in Test.tex: You should perhaps use `\cos' instead.
+$sin^2 + cos^2 = 1$
+ ^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+$\sin^2 + \cos^2 = 1$
+^^^^^^^^^^^^^^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 36-37
+^
+Message 36 in Test.tex: You should put a space in front of parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 37 in Test.tex: You should avoid spaces after parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 36 in Test.tex: You should put a space in front of parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 37 in Test.tex: You should avoid spaces after parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 37 in Test.tex: You should avoid spaces in front of parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 36 in Test.tex: You should put a space in front of parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 37 in Test.tex: You should avoid spaces after parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 37 in Test.tex: You should avoid spaces in front of parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 36 in Test.tex: You should put a space after parenthesis.
+This( an example( Nuff said )), illustrates( ``my'' )point.
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Warning 38
+^
+Message 38 in Test.tex: You should not use punctuation in front of quotes.
+``An example,'' he said, ``would be great.''
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Warning 39
+^
+Message 39 in Test.tex: Double space found.
+For output codes, see table ~\ref{tab:fmtout}.
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Warning 40
+^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+$\this,$ and $$this$$.
+^^^^^^^^
+Message 40 in Test.tex: You should put punctuation outside inner math mode.
+$\this,$ and $$this$$.
+ ^
+Message 45 in Test.tex: Use \[ ... \] instead of $$ ... $$.
+$\this,$ and $$this$$.
+ ^^^^^^^^
+Message 40 in Test.tex: You should put punctuation inside display math mode.
+$\this,$ and $$this$$.
+ ^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+$\this$, and $$this.$$
+^^^^^^^
+Message 45 in Test.tex: Use \[ ... \] instead of $$ ... $$.
+$\this$, and $$this.$$
+ ^^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 41
+^
+Message 1 in Test.tex: Command terminated with space.
+foo \above qux
+ ^
+Message 41 in Test.tex: You ought to not use primitive TeX in LaTeX code.
+foo \above qux
+ ^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 42
+^
+Message 42 in Test.tex: You should remove spaces in front of `\footnote'
+This is a footnote \footnote{foo}.
+ ^
+Message 22 in Test.tex: Comment displayed.
+% Warning 43
+^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Here is a mistake $\left{x\right}$.
+ ^^^^^^^^^^^^^^^^
+Message 43 in Test.tex: `\left' is normally not followed by `{'.
+Here is a mistake $\left{x\right}$.
+ ^^^^^
+Message 43 in Test.tex: `\right' is normally not followed by `}'.
+Here is a mistake $\left{x\right}$.
+ ^^^^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+This one triggers warning 22 $\left\{x\right\}$.
+ ^^^^^^^^^^^^^^^^^^
+Message 21 in Test.tex: This command might not be intended.
+This one triggers warning 22 $\left\{x\right\}$.
+ ^^
+Message 21 in Test.tex: This command might not be intended.
+This one triggers warning 22 $\left\{x\right\}$.
+ ^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Here \chktex\ doesn't complain $\left\lbrace x\right\rbrace$.
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 44 -- user regex -- default message
+^
+Message 22 in Test.tex: Comment displayed.
+% Warning 44 -- user regex -- user message
+^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+For every $p\not|n$ you have an ugly prime which doesn't divide $n$.
+ ^^^^^^^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+For every $p\not|n$ you have an ugly prime which doesn't divide $n$.
+ ^^^
+Message 44 in Test.tex: User Regex: Always use \nmid.
+For every $p\not|n$ you have an ugly prime which doesn't divide $n$.
+ ^^^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+For every $p\nmid n$ you have a cute prime which doesn't divide $n$.
+ ^^^^^^^^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+For every $p\nmid n$ you have a cute prime which doesn't divide $n$.
+ ^^^
+Message 22 in Test.tex: Comment displayed.
+% Math mode check
+^
+Message 35 in Test.tex: You should perhaps use `\sin' instead.
+\ensuremath{sin x\text{is not the same as sin x, but is the same as $sin x$}}
+ ^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+\ensuremath{sin x\text{is not the same as sin x, but is the same as $sin x$}}
+ ^^^^^^^
+Message 35 in Test.tex: You should perhaps use `\sin' instead.
+\ensuremath{sin x\text{is not the same as sin x, but is the same as $sin x$}}
+ ^^^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Also, $x(3)\text{ is not x(3) but it is $x(3)$}$
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Message 36 in Test.tex: You should put a space in front of parenthesis.
+Also, $x(3)\text{ is not x(3) but it is $x(3)$}$
+ ^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Also, $x(3)\text{ is not x(3) but it is $x(3)$}$
+ ^^^^^^
+Message 22 in Test.tex: Comment displayed.
+This is\\% a comment. Nothing here should be checked(right)?
+ ^
+Message 36 in Test.tex: You should put a space in front of parenthesis.
+But this is not a \% comment, so we should find this error(right)?
+ ^
+Message 22 in Test.tex: Comment displayed.
+Here(on this line only)is a warning $sin(x)$ suppressed. % chktex 36 chktex 35
+ ^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Here(on this line only)is a warning $sin(x)$ suppressed. % chktex 36 chktex 35
+ ^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36
+ ^
+Message 36 in Test.tex: You should put a space in front of parenthesis.
+Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36
+ ^
+Message 36 in Test.tex: You should put a space after parenthesis.
+Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36
+ ^
+Message 46 in Test.tex: Use \( ... \) instead of $ ... $.
+Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36
+ ^^^^^^^^
+Message 44 in Test.tex: User Regex: 1:Capitalize before references.
+In section~\ref{sec:3} we have a warning.
+ ^^^^^^^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+In section~\ref{sec:4} it is suppressed. % chktex -1
+ ^
+Message 22 in Test.tex: Comment displayed.
+% In section~\ref{sec:5} we don't have a warning.
+^
+Message 44 in Test.tex: User Regex: -2:Vertical rules in tables are ugly.
+\begin{tabular*}{1.0\linewidth}[h]{|c|cc|}
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Message 44 in Test.tex: User Regex: -2:Use \toprule, midrule, or \bottomrule from booktabs.
+ \hline
+ ^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Verb check
+^
+Message 14 in Test.tex: Could not find argument for command.
+\verb#
+^^^^^
+Message 31 in Test.tex: This text may be ignored.
+\end{verbatim} FOO
+ ^^^
+Message 22 in Test.tex: Comment displayed.
+% Warning 16,15
+^
+Message 45 in Test.tex: Use \[ ... \] instead of $$ ... $$.
+$$(
+^^^^^^^
+Message 22 in Test.tex: Comment displayed.
+% Local Variables:
+^
+Message 22 in Test.tex: Comment displayed.
+% require-final-newline: nil
+^
+Message 22 in Test.tex: Comment displayed.
+% End:
+^
+Message 22 in Test.tex: Comment displayed.
+% There should be no newline at the end of this file to test bug #46539
+^
+Message 16 in Test.tex: Mathmode still on at end of LaTeX file.
+
+
+Message 17 in Test.tex: Number of `(' doesn't match the number of `)'!
+
+
+Message 17 in Test.tex: Number of `[' doesn't match the number of `]'!
+
+
+Message 17 in Test.tex: Number of `{' doesn't match the number of `}'!
+
+
diff --git a/support/chktex/Test.tex b/support/chktex/Test.tex
new file mode 100644
index 0000000000..9a7fc05fa0
--- /dev/null
+++ b/support/chktex/Test.tex
@@ -0,0 +1,237 @@
+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.
+So is this \foo
+\smallskip This is a not. $\foo Neither$ is this.
+
+\startsection[title={Testing ConTeXt}]
+These should now be an error.
+\stoptext
+
+% 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.
+It's just a start-shot.
+is also used to send cross-calls (xc) and cross-traps (xt) to other
+% From Knuths TeXbook Chapter 14
+% "How TeX Breaks Paragraphs into Lines", fourth paragraph:
+in plain TeX---are the key
+
+% Using DashExcpt
+The Birch--Swinnerton-Dyer conjecture is correct.
+The Birch--Swinnerton--Dyer conjecture is not correct.
+The Birch-Swinnerton-Dyer conjecture is not correct (but not caught).
+
+% 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 baz., billy.; bob.: joe.! frank.? james.. george
+1st.\ foo Inc.\ ab.cd.\ foo ab.cd.\ Foo.\ bar baz., billy.; bob.:\ joe.!\ frank.?\ james..\ george
+
+% 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.
+% 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!
+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}.
+
+% Warning 43
+Here is a mistake $\left{x\right}$.
+This one triggers warning 22 $\left\{x\right\}$.
+Here \chktex\ doesn't complain $\left\lbrace x\right\rbrace$.
+
+% Warning 44 -- user regex -- default message
+You should always write a good intro.
+You should always write a good introduction.
+
+% Warning 44 -- user regex -- user message
+For every $p\not|n$ you have an ugly prime which doesn't divide $n$.
+For every $p\nmid n$ you have a cute prime which doesn't divide $n$.
+
+% Math mode check
+\ensuremath{sin x\text{is not the same as sin x, but is the same as $sin x$}}
+Also, $x(3)\text{ is not x(3) but it is $x(3)$}$
+
+This is\\% a comment. Nothing here should be checked(right)?
+a broken line.
+But this is not a \% comment, so we should find this error(right)?
+
+Here(on this line only)is a warning $sin(x)$ suppressed. % chktex 36 chktex 35
+Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36
+
+In section~\ref{sec:3} we have a warning.
+In section~\ref{sec:4} it is suppressed. % chktex -1
+% In section~\ref{sec:5} we don't have a warning.
+
+\begin{tabular*}{1.0\linewidth}[h]{|c|cc|}
+ a & b \\
+ \hline
+ c & d
+\end{tabular*}
+
+% Verb check
+
+\verb@\this is )() lots of errors, etc. Or what?@
+\verb#
+
+\begin{verbatim}
+\this is
+\end{verbatim} FOO
+
+% Warning 16,15
+
+$$(
+
+% Local Variables:
+% require-final-newline: nil
+% End:
+% There should be no newline at the end of this file to test bug #46539 \ No newline at end of file
diff --git a/support/chktex/Utility.c b/support/chktex/Utility.c
new file mode 100644
index 0000000000..6f05e98f61
--- /dev/null
+++ b/support/chktex/Utility.c
@@ -0,0 +1,993 @@
+/*
+ * ChkTeX, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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"
+
+typedef unsigned long HASH_TYPE;
+
+/***************************** 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.
+ */
+
+
+short substring(const char *source, char *dest, unsigned long pos, long len)
+{
+ const char *Start;
+ short 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.
+ *
+ */
+
+
+int fexists(const char *Filename)
+{
+ int 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.
+ */
+
+void *sfmemset(void *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(char *String, /* String to replace within. */
+ const char From, /* Character to search for. */
+ const char 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(char *Buf, const char *Prot, const char 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.
+ */
+
+
+char *strip(char *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 */
+{
+ char *bufptr = str;
+ char *nlptr;
+ char 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
+char *strlwr(char *String)
+{
+ char *Bufptr;
+ char TmpC;
+
+ for (Bufptr = String; (TmpC = *Bufptr); Bufptr++)
+ *Bufptr = tolower((unsigned char)TmpC);
+
+ return (String);
+}
+#endif
+
+/*
+ * Returns a duplicate of the string passed.
+ */
+
+#ifndef HAVE_STRDUP
+char *strdup(const char *String)
+{
+ char *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.
+ */
+
+char *strdupx(const char *String, int Extra)
+{
+ char *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((unsigned char)aa) == tolower((unsigned char)bb)));
+ /* bb != 0 is implicit */
+
+ return (tolower((unsigned char)aa) - tolower((unsigned char)bb));
+}
+#endif
+
+/*
+ * Not all reallocs are intelligent enough to handle NULL's as
+ * parameters. This fixes this.
+ */
+
+void *saferealloc(void *b, size_t n)
+{
+ void *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(char *To, const char *From, unsigned long Len)
+{
+ unsigned long i, j;
+ unsigned long 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 char *Str, const char *Cmp)
+{
+ return (strncmp(Str, Cmp, strlen(Cmp)));
+}
+
+/*
+ * Checks whether Cmp comes before Str. Returns 0 if so, non-zero if not.
+ *
+ */
+
+int strinfront(const char *Str, const char *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.
+ *
+ * The algorithm was designed by Peter Weinberger. This version was
+ * adapted from Dr Dobb's Journal April 1996 page 26.
+ */
+
+static unsigned long HashWord(const char *str)
+{
+ register unsigned long h = 0, hbit, c;
+
+ while ((c = *str++))
+ {
+ h = (h << 4) ^ c;
+ if ((hbit = h & 0xf0000000))
+ h ^= hbit >> 24;
+ h &= ~hbit;
+ }
+
+ return (h);
+}
+
+/*
+ * Inserts a string into a hash index. Note: You'll have to
+ * duplicate the string yourself.
+ */
+
+void InsertHash(char *a, struct Hash *h)
+{
+ struct HashEntry **he, *newhe;
+
+ if (!h->Index)
+ {
+ if (!((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.
+ */
+
+char *HasHash(const char *a, const struct Hash *h)
+{
+ struct HashEntry *he;
+ HASH_TYPE i; /* Special magic to optimize SAS/C */
+
+ /* Do we have a hash? */
+ if (!h->Index)
+ return NULL;
+
+ /* Find entry in hash */
+ i = HashWord(a);
+ i %= HASH_SIZE;
+ he = h->Index[i];
+
+ /* Search in the entry for the item */
+ 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)
+{
+ int i;
+ struct HashEntry *he, *next;
+ if (h && h->Index)
+ {
+ /* Free all the memory */
+ for ( i = 0; i < HASH_SIZE; ++i )
+ {
+ he = h->Index[i];
+ while ( he )
+ {
+ next = he->Next;
+ free( he );
+ he = next;
+ }
+ }
+ /* Reset the hash table */
+ 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)
+{
+ unsigned long 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.
+ */
+
+int InsertWord(const char *Word, struct WordList *WL)
+{
+ char *WrdCpy;
+ unsigned long 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)
+{
+ char *Word;
+ if (WL)
+ {
+ while ( (Word = StkPop( &WL->Stack )) )
+ {
+ free(Word);
+ }
+ 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.
+ */
+
+
+char *HasWord(const char *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)
+{
+ unsigned long 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 char From, const char To)
+{
+ unsigned long 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.
+ */
+
+int StkPush(void *Data, struct Stack *Stack)
+{
+ unsigned long NewSize;
+ void **NewBuf;
+
+ if (Data && Stack)
+ {
+ if (Stack->Used >= Stack->Size)
+ {
+ NewSize = Stack->Size + MINPUDDLE;
+
+ if ((NewBuf = saferealloc(Stack->Data,
+ (size_t) NewSize * sizeof(void *))))
+ {
+ Stack->Size = NewSize;
+ Stack->Data = NewBuf;
+ }
+ else
+ return (FALSE);
+ }
+
+ Stack->Data[Stack->Used++] = Data;
+ return (TRUE);
+ }
+
+ return (FALSE);
+}
+
+/*
+ * Pops an element from the stack.
+ *
+ */
+
+void *StkPop(struct Stack *Stack)
+{
+ void *Retval = NULL;
+
+ if (Stack && (Stack->Used > 0))
+ {
+ Retval = Stack->Data[--Stack->Used];
+
+#ifdef NO_DIRTY_TRICKS
+
+ {
+ void **NewBuf;
+
+ if (Stack->Used < (Stack->Size / 2))
+ {
+ unsigned long NewSize;
+ NewSize = Stack->Size - MINPUDDLE;
+ NewSize = max(NewSize, MINPUDDLE);
+
+ if (NewBuf = saferealloc(Stack->Data,
+ (size_t) NewSize * sizeof(void *)))
+ {
+ Stack->Size = NewSize;
+ Stack->Data = NewBuf;
+ }
+ }
+ }
+#endif
+
+ }
+ return (Retval);
+}
+
+/*
+ * Returns the topmost element of the stack.
+ */
+
+void *StkTop(struct Stack *Stack)
+{
+ if (Stack && (Stack->Used > 0))
+ return (Stack->Data[Stack->Used - 1]);
+ else
+ return (NULL);
+}
+
+/****************************** INPUT STACK *****************************/
+
+int PushFileName(const char *Name, struct Stack *stack)
+{
+ FILE *fh = NULL;
+ static char 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);
+}
+
+
+int PushFile(const char *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);
+}
+
+char *FGetsStk(char *Dest, unsigned long len, struct Stack *stack)
+{
+ static short HasSeenLong = 0;
+ struct FileNode *fn;
+ char *Retval = NULL;
+ size_t Retlen = 0;
+
+ if ((fn = StkTop(stack)))
+ {
+ do
+ {
+ Retval = fgets(Dest, (int)len, fn->fh);
+ if (Retval) {
+ Retlen = strlen(Retval);
+
+ if (Retval[Retlen-1] == '\n' || Retlen < len-1)
+ fn->Line++;
+ /* We only want the long lines warning once per file */
+ else if (!HasSeenLong)
+ {
+ PrintPrgErr(pmLongLines, len-2);
+ HasSeenLong = 1;
+ }
+ break;
+ }
+
+ fn = StkPop(stack);
+ fclose(fn->fh);
+ if ( fn->Name != NULL )
+ free(fn->Name);
+ free(fn);
+ HasSeenLong = 0;
+ }
+ while (!Retval && (fn = StkTop(stack)));
+ }
+
+ return (Retval);
+}
+
+const char *CurStkName(struct Stack *stack)
+{
+ struct FileNode *fn;
+ static const char *LastName = "";
+
+ if (PseudoInName && (stack->Used <= 1))
+ return (PseudoInName);
+ else
+ {
+ if ((fn = StkTop(stack)))
+ {
+ if ( stack->Used == 1 && strlen(LastName) == 0 && fn->Name )
+ {
+ LastName = strdup(fn->Name);
+ }
+ return (fn->Name);
+ }
+ else
+ return (LastName);
+ }
+}
+
+
+FILE *CurStkFile(struct Stack * stack)
+{
+ struct FileNode *fn;
+
+ if ((fn = StkTop(stack)))
+ return (fn->fh);
+ else
+ return (NULL);
+}
+
+unsigned long CurStkLine(struct Stack *stack)
+{
+ struct FileNode *fn;
+ static unsigned long 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 char c, const unsigned long Line,
+ const unsigned long Column, struct Stack *Stk,
+ const char *LineCpy)
+{
+ char Buf[2];
+
+ Buf[0] = c;
+ Buf[1] = 0;
+
+ return (PushErr(Buf, Line, Column, 1, LineCpy, Stk));
+}
+
+struct ErrInfo *PushErr(const char *Data, const unsigned long Line,
+ const unsigned long Column,
+ const unsigned long ErrLen, const char *LineCpy,
+ struct Stack *Stk)
+{
+ struct ErrInfo *ci;
+
+ if ((ci = malloc(sizeof(struct ErrInfo))))
+ {
+ if ((ci->Data = strdup(Data)))
+ {
+ if ((ci->File = strdup(CurStkName(&InputStack))))
+ {
+ if ((ci->LineBuf = strdup(LineCpy)))
+ {
+ ci->Line = Line;
+ ci->ErrLen = ErrLen;
+ ci->Column = Column;
+ ci->Flags = efNone;
+
+ if (StkPush(ci, Stk))
+ return (ci);
+
+ free(ci->LineBuf);
+ }
+ else
+ PrintPrgErr(pmStrDupErr);
+
+ free(ci->File);
+ }
+ else
+ PrintPrgErr(pmStrDupErr);
+
+ free(ci->Data);
+ }
+ 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, char *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);
+ if (ei->File)
+ free(ei->File);
+ if (ei->LineBuf)
+ free(ei->LineBuf);
+
+ 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 char 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 char 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.
+ */
+
+char MatchBracket(const char c)
+{
+ unsigned long Index;
+ char Char = 0;
+
+
+ if ((Index = BrackIndex(c)) != ~0UL)
+ Char = BrOrder[Index ^ 1];
+
+ return (Char);
+}
diff --git a/support/chktex/Utility.h b/support/chktex/Utility.h
new file mode 100644
index 0000000000..b1b31ec773
--- /dev/null
+++ b/support/chktex/Utility.h
@@ -0,0 +1,184 @@
+/*
+ * ChkTeX, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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
+
+#include "ChkTeX.h"
+#include "OpSys.h"
+
+/*
+ * How many indexes we'll allocate first time
+ */
+#define MINPUDDLE 256
+
+/*
+ * How many bytes we want in front/end of each char 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;
+ char *Str;
+};
+
+struct Hash
+{
+ struct HashEntry **Index;
+};
+
+struct Stack
+{
+ void **Data;
+ unsigned long Size, Used;
+};
+
+struct WordList
+{
+ unsigned long MaxLen;
+ int NonEmpty;
+ struct Stack Stack;
+ struct Hash Hash;
+};
+#define WORDLIST_DEFINED
+
+struct FileNode
+{
+ char *Name;
+ FILE *fh;
+ unsigned long 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)))
+
+/* Subtract 1 because sizeof includes the null terminator.
+ * WARNING: To use this on a variable, the type should be char[]
+ * rather than char*, since for some versions of gcc these give
+ * different values. */
+#define STRLEN(x) (sizeof(x)/sizeof(x[0]) - 1)
+
+int fexists(const char *Filename);
+
+void *sfmemset(void *to, int c, long n);
+void *saferealloc(void *old, size_t newsize);
+
+int strafter(const char *Str, const char *Cmp);
+void strrep(char *String, const char From, const char To);
+void strxrep(char *Buf, const char *Prot, const char To);
+char *strip(char *String, const enum Strip What);
+void strwrite(char *To, const char *From, unsigned long Len);
+int strinfront(const char *Str, const char *Cmp);
+char *strdupx(const char *String, int Extra);
+void strmove(char *a, const char *b);
+
+void ClearHash(struct Hash *h);
+void InsertHash(char *a, struct Hash *h);
+char *HasHash(const char *a, const struct Hash *h);
+
+int InsertWord(const char *Word, struct WordList *WL);
+char *HasWord(const char *Word, struct WordList *WL);
+void MakeLower(struct WordList *wl);
+void ListRep(struct WordList *wl, const char From, const char To);
+void ClearWord(struct WordList *WL);
+
+int StkPush(void *Data, struct Stack *Stack);
+void *StkPop(struct Stack *Stack);
+void *StkTop(struct Stack *Stack);
+
+FILE *CurStkFile(struct Stack *stack);
+const char *CurStkName(struct Stack *stack);
+unsigned long CurStkLine(struct Stack *stack);
+char *FGetsStk(char *Dest, unsigned long len, struct Stack *stack);
+int PushFileName(const char *Name, struct Stack *stack);
+int PushFile(const char *, FILE *, struct Stack *);
+
+
+void FreeErrInfo(struct ErrInfo *ei);
+struct ErrInfo *PushChar(const char c, const unsigned long Line,
+ const unsigned long Column, struct Stack *Stk,
+ const char *LineCpy);
+struct ErrInfo *PushErr(const char *Data, const unsigned long Line,
+ const unsigned long Column,
+ const unsigned long ErrLen, const char *LineCpy,
+ struct Stack *Stk);
+struct ErrInfo *TopChar(struct Stack *Stack);
+struct ErrInfo *TopErr(struct Stack *Stack);
+struct ErrInfo *PopErr(struct Stack *Stack);
+struct ErrInfo *TopMatch(struct Stack *Stack, char *String);
+
+long BrackIndex(const char c);
+void AddBracket(const char c);
+char MatchBracket(const char c);
+
+
+
+short substring(const char *source, char *dest, unsigned long pos, long len);
+
+#ifndef HAVE_STRLWR
+# define strlwr mystrlwr
+char *mystrlwr(char *String);
+#endif
+
+#ifndef HAVE_STRDUP
+# define strdup mystrdup
+char *mystrdup(const char *String);
+#endif
+
+
+#ifndef HAVE_STRCASECMP
+int strcasecmp(char *a, char *b);
+#endif
+
+#if !(defined HAVE_DECL_STPCPY && HAVE_DECL_STPCPY)
+static inline char * stpcpy(char *dest, const char *src)
+{
+ return strcpy(dest, src) + strlen(src);
+}
+#endif
+
+
+#endif /* UTILITY_H */
diff --git a/support/chktex/aclocal.m4 b/support/chktex/aclocal.m4
new file mode 100644
index 0000000000..022e3ea7e7
--- /dev/null
+++ b/support/chktex/aclocal.m4
@@ -0,0 +1,16 @@
+# generated automatically by aclocal 1.15 -*- Autoconf -*-
+
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
+m4_include([m4/ax_cflags_strict_prototypes.m4])
+m4_include([m4/vl_prog_cc_warnings.m4])
diff --git a/support/chktex/autogen.sh b/support/chktex/autogen.sh
new file mode 100755
index 0000000000..0982233b12
--- /dev/null
+++ b/support/chktex/autogen.sh
@@ -0,0 +1,49 @@
+#!/bin/sh
+
+ACLOCAL="aclocal -I m4"
+AUTOHEADER="autoheader"
+AUTOMAKE="automake --add-missing --copy --foreign"
+AUTOCONF="autoconf"
+
+# Delete old cache directories.
+# automake will stop if their contents was created by an earlier version.
+rm -rf autom4te.cache
+
+# Generate the Makefiles and configure files
+echo "Building macros..."
+if ( $ACLOCAL --version ) < /dev/null > /dev/null 2>&1; then
+ $ACLOCAL
+else
+ echo "aclocal not found -- aborting"
+ exit 1
+fi
+
+echo "Building config header template..."
+if ( $AUTOHEADER --version ) < /dev/null > /dev/null 2>&1; then
+ $AUTOHEADER
+ echo timestamp > stamp-h.in
+else
+ echo "autoheader not found -- aborting"
+ exit 1
+fi
+
+# We do not really need automake, but want to install programs like install-sh.
+echo "Installing some useful programs..."
+if ( $AUTOMAKE --version ) < /dev/null > /dev/null 2>&1; then
+ $AUTOMAKE 2>/dev/null
+else
+ echo "automake not found -- aborting"
+ exit 1
+fi
+
+echo "Building configure..."
+if ( $AUTOCONF --version ) < /dev/null > /dev/null 2>&1; then
+ $AUTOCONF
+else
+ echo "autoconf not found -- aborting"
+ exit 1
+fi
+
+echo
+echo 'run "./configure ; make"'
+echo
diff --git a/support/chktex/chktex.1 b/support/chktex/chktex.1
new file mode 100644
index 0000000000..a3dcc13e3d
--- /dev/null
+++ b/support/chktex/chktex.1
@@ -0,0 +1,143 @@
+.TH chktex 1 "March 30, 2001"
+.AT 3
+.SH NAME
+chktex \- finds typographic errors in LaTeX.
+.SH SYNOPSIS
+.B chktex
+.I [-hiqrW] [-v[0-...]] [-l <rcfile>] [-[wemn] <[1-42]|all>]
+.I [-d[0-...]] [-p <name>] [-o <outfile>] [-[btxgI][0|1]]
+.B file1 file2 ...
+.SH DESCRIPTION
+.I chktex
+finds typographic errors in
+.I LaTeX
+.
+.SH OPTIONS
+.PP
+Miscellaneous options:
+.TP
+.B "-h --help"
+Print a help screen.
+.TP
+.B "-i --license"
+Show distribution information.
+.TP
+.B "-l --localrc"
+Read local .chktexrc formatted file.
+.TP
+.B "-d --debug"
+Debug information. Give it a number.
+.TP
+.B "-r --reset"
+Reset settings to default.
+.PP
+Muting warning messages:
+.TP
+.B "-w --warnon"
+Makes msg # given a warning and turns it on.
+.TP
+.B "-e --erroron"
+Makes msg # given an error and turns it on.
+.TP
+.B "-m --msgon"
+Makes msg # given a message and turns it on.
+.TP
+.B "-n --nowarn"
+Mutes msg # given.
+.TP
+.B "-L --nolinesupp"
+Do not allow per-line suppressions. These are TeX comments of the form
+.I "% chktex ##".
+
+.PP
+Output control flags:
+.TP
+.B "-v --verbosity"
+How errors are displayed.
+Default 1, 0=Less, 2=Fancy, 3=lacheck.
+.TP
+.B "-V --pipeverb"
+How errors are displayed when stdout != tty.
+Defaults to the same as -v.
+.TP
+.B "-s --splitchar"
+String used to split fields when doing -v0
+.TP
+.B "-o --output"
+Redirect error report to a file.
+.TP
+.B "-q --quiet"
+Shuts up about version information.
+.TP
+.B "-p --pseudoname"
+Input file-name when reporting.
+.TP
+.B "-f --format"
+Format to use for output
+
+.PP
+Boolean switches (1 -> enables / 0 -> disables):
+.TP
+.B "-b --backup"
+Backup output file.
+.TP
+.B "-x --wipeverb"
+Ignore contents of `\\verb' commands.
+.TP
+.B "-g --globalrc"
+Read global .chktexrc file.
+.TP
+.B "-I --inputfiles"
+Execute \\input statements.
+.TP
+.B "-H --headererr"
+Show errors found in front of \\begin{document}
+.PP Miscellaneous switches:
+.TP
+.B "-W --version"
+Version information
+
+.PP
+If no LaTeX files are specified on the command line, we will read from
+stdin. For explanation of warning/error messages, please consult the
+main document /usr/share/doc/chktex/ChkTeX.dvi.gz.
+
+.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.,
+59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+.SH ENVIRONMENT
+No environment variables are used.
+.SH FILES
+None.
+.SH AUTHOR
+Jens T. Berger Thielemann,
+.I <jensthi@ifi.uio.no>
+.PP
+This manual page was cobbled together by Clint Adams <schizo@debian.org>,
+based on the output of "chktex --help" and deweb(1).
+.SH "SEE ALSO"
+.B deweb(1), chkweb(1)
diff --git a/support/chktex/chktexrc b/support/chktex/chktexrc
new file mode 100644
index 0000000000..c6355f8db1
--- /dev/null
+++ b/support/chktex/chktexrc
@@ -0,0 +1,802 @@
+##
+## ChkTeX, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 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 caught.
+# 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 - Number 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.
+# MathCmd - Commands which turn on math mode.
+# TextCmd - Commands which turn off 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. They are not found in comments.
+#
+# 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.
+#
+###
+
+]
+
+
+###
+#
+# These patterns will be searched for, no matter whether they appear
+# as normal text, commands or arguments. However, they will _not_
+# match in verbatim environments.
+#
+# Remember that you have to escape (with a !) the following
+# characters: "#!= as well as spaces and {}[] if they are proceeded by
+# a space.
+#
+# Since these are PCRE regular expressions, you can use (?i) to make
+# the expression case insensitive. See the man pages (man pcresyntax)
+# or the nicely formatted http://perldoc.perl.org/perlre.html for
+# documentation on the regular expression syntax. Note however that
+# some the features of perl regular expression are not available such
+# as running code (callouts), and replacing.
+#
+# An initial PCRE comment (?# ... ) can be used change what is
+# displayed, thereby reminding yourself how to fix the problem.
+#
+###
+UserWarnRegex
+{
+
+ (?!#Always! use! \nmid)\\not! *(\||\\mid)
+
+ # capitalize section when saying Section 6.
+ (?!#-1:Capitalize! before! references)PCRE:\b(chapter|(sub)?section|theorem|lemma|proposition|corollary|appendix)~\\ref
+ (?!#1:Capitalize! before! references)POSIX:([^[:alnum:]]|^)(chapter|(sub)?section|theorem|lemma|proposition|corollary|appendix)~\\ref
+
+ # spell it out.
+ # PCRE:(?i)\bintro\b(?!#Spell! it! out.! This! comment! is! not! used.)
+ # POSIX:([^[:alnum:]]|^)intro([^[:alnum:]]|$)
+
+ # Pretty tables--see http://texdoc.net/texmf-dist/doc/latex/booktabs/booktabs.pdf
+ (?!#-2:Use! \toprule,! midrule,! or! \bottomrule! from! booktabs)\\hline
+ # This relies on it being on a single line, and not having anything
+ # else on that line. With PCRE we could match balanced [] and {},
+ # but I wonder if it's worth the complexity...
+ (?!#-2:Vertical! rules! in! tables! are! ugly)\\begin\{(array|tabularx?\*?)\}(\[.*\])?\{.*\|.*\}
+
+}
+
+
+#####################################################################
+#
+# 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 output formats 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,pdf}.
+#
+# 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"
+
+# -v5; no line number, ease auto-test
+"%k %n in %f: %m!n%r%s%t!n%u!n"
+
+# -v6; emacs compilation mode
+"!"%f!", line %l.%c:(#%n) %m!n"
+
+}
+
+
+
+#####################################################################
+#
+# These commands should be ignored when detecting whether a command
+# is ended by a space. You can specify regular expressions in the []
+# section in case you have many custom macros that can be safely
+# terminated with 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 \else
+
+ \csname \endcsname
+
+ \z@ \p@ \@warning \typeout
+
+ \dots \ldots \input \endinput \nextline \leavevmode \cdots
+ \appendix \listfiles \and \quad
+ \hskip \vfill \vfil \hfill \hfil \topmargin \oddsidemargin
+ \frenchspacing \nonfrenchspacing
+ \begingroup \endgroup \par
+
+ \vrefwarning \upshape \headheight \headsep \hoffset \voffset
+ \cdot \qquad
+ \left \right
+ \qedhere
+
+ \xspace
+
+ \addlinespace \cr \fill \frontmatter
+ \toprule \midrule \bottomrule
+
+}[
+# Here you can put regular expressions to match Silent macros. It was
+# designed for the case where you have many custom macros sharing a
+# common prefix, but can of course be used for other things.
+
+# Support ConTeXt to at least some extent
+\\start.* \\stop.*
+
+]
+
+#####################################################################
+#
+# 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 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 a 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 3
+}
+
+NumDash
+{
+ 2
+}
+
+WordDash
+{
+ 3
+}
+
+#####################################################################
+#
+# Here are exceptions to the dash rules above. For example, an
+# n-dash -- between words is usually wrong, but in some cases it is
+# correct, such as when naming a theorem. The Birch--Swinnerton-Dyer
+# conjecture is one example where the difference matters. You can
+# tell that Birch is one person and Swinnerton-Dyer is another.
+#
+# Adding line suppressions for these is possible, but can quickly
+# become tedious if a certain theorem is referenced often. For this
+# reason exceptions can be specified here. They are case-sensitive.
+#
+
+DashExcpt
+{
+ Birch--Swinnerton-Dyer
+}
+
+#####################################################################
+#
+# This keyword indicates commands whose argument isn't LaTeX code,
+# and 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.
+# Some commands (e.g. \cmidrule) use () to delimit and optional
+# argument and so this syntax is supported as well.
+#
+# 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:{} \eqref:{} \vref:{} \pageref:{} \index:[]{}
+ \cite:[][]{} \nocite:{}
+ \input:{} \verbatiminput:[]{} \listinginput:[]{}{}
+ \verbatimtabinput:[]{} \include:{} \includeonly:{}
+ \bibitem:[]{}
+ \cline:{} \cmidrule:[](){}
+ \href:{}{}
+ # Cleveref -- there are many others that could be here as well...
+ \cref:*{} \cpageref:*{} \crefrange:*{}{} \cpagerefrange:*{}{}
+ \Cref:*{} \Cpageref:*{} \Crefrange:*{}{} \Cpagerefrange:*{}{}
+ # natbib
+ \citet:*[][]{} \citep:*[][]{} \citealt:*{} \citealp:*[]{} \citeauthor:*{}
+ \Citet:*[][]{} \Citep:*[][]{} \Citealt:*{} \Citealp:*[]{} \Citeauthor:{}
+ \citetext:{} \citeyear:*{} \citeyearpar:{}
+ # tipa which uses "
+ \textipa:{}
+}
+
+#####################################################################
+#
+# These environments contain 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
+ align alignat gather flalign multline
+}
+
+#####################################################################
+#
+# These commands contain material which will be typeset as mathematics
+# by LaTeX. The commands are assumed to have one mandatory argument
+# which is in math mode. This turns on/off some warnings.
+#
+
+MathCmd
+{
+ \ensuremath
+}
+
+#####################################################################
+#
+# These commands contain material which will _not_ be typeset as
+# mathematics by LaTeX even if it would otherwise be in mathmode. The
+# commands are assumed to have one mandatory argument which is in text
+# mode. This turns on/off some warnings.
+#
+
+TextCmd
+{
+ \text \intertext \shortintertext \mbox
+}
+
+#####################################################################
+#
+# 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
+ filecontents pgfpicture tikzpicture minted lstlisting IPA
+}
+
+#####################################################################
+#
+# 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
+ \itshape \slshape
+}
+
+#####################################################################
+#
+# Commands which makes the font non-italic.
+#
+
+NonItalic
+{
+ \bf \rm \sf \tt \sc
+ \upshape
+}
+
+#####################################################################
+#
+# Commands which put their argument into italic (and thus possibly
+# needs italic correction in the end).
+#
+# This is currently empty, since \textit, \textsl and \emph do that
+# automatically.
+#
+
+ItalCmd
+{
+}
+
+#####################################################################
+#
+# 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 \eqref \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
+# commands 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's reserved characters (`#$%&~_^\{}'), or any parenthesis
+# character ('()[]{}'). If possible, don't use a punctuation
+# character, either, or any spacing character.
+#
+# The asterisk is also unsuitable, as some commands behave in another
+# way if they are appended with an asterisk. 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/support/chktex/chkweb b/support/chktex/chkweb
new file mode 100755
index 0000000000..8d6361d109
--- /dev/null
+++ b/support/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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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/support/chktex/chkweb.1 b/support/chktex/chkweb.1
new file mode 100644
index 0000000000..5cb7063f78
--- /dev/null
+++ b/support/chktex/chkweb.1
@@ -0,0 +1,132 @@
+.TH chkweb 1 "March 30, 2001"
+.AT 3
+.SH NAME
+chkweb \- runs the LaTeX parts of a CWEB file through chktex
+.SH SYNOPSIS
+.B chkweb
+.I [-hiqrW] [-l <rcfile>] [-[wemn] <[1-42]|all>]
+.I [-d[0-...]] [-o <outfile>] [-[btxgI][0|1]]
+.B file1 file2 ...
+.SH DESCRIPTION
+.I chkweb
+runs the
+.I LaTeX
+parts of a CWEB file through chktex.
+.SH OPTIONS
+.PP
+Miscellaneous options:
+.TP
+.B "-h --help"
+Print a help screen.
+.TP
+.B "-i --license"
+Show distribution information.
+.TP
+.B "-l --localrc"
+Read local .chktexrc formatted file.
+.TP
+.B "-d --debug"
+Debug information. Give it a number.
+.TP
+.B "-r --reset"
+Reset settings to default.
+.PP
+Muting warning messages:
+.TP
+.B "-w --warnon"
+Makes msg # given a warning and turns it on.
+.TP
+.B "-e --erroron"
+Makes msg # given an error and turns it on.
+.TP
+.B "-m --msgon"
+Makes msg # given a message and turns it on.
+.TP
+.B "-n --nowarn"
+Mutes msg # given.
+
+.PP
+Output control flags:
+.TP
+.B "-V --pipeverb"
+How errors are displayed when stdout != tty.
+Defaults to the same as -v.
+.TP
+.B "-s --splitchar"
+String used to split fields when doing -v0
+.TP
+.B "-o --output"
+Redirect error report to a file.
+.TP
+.B "-q --quiet"
+Shuts up about version information.
+.TP
+.B "-f --format"
+Format to use for output
+
+.PP
+Boolean switches (1 -> enables / 0 -> disables):
+.TP
+.B "-b --backup"
+Backup output file.
+.TP
+.B "-x --wipeverb"
+Ignore contents of `\\verb' commands.
+.TP
+.B "-g --globalrc"
+Read global .chktexrc file.
+.TP
+.B "-I --inputfiles"
+Execute \\input statements.
+.TP
+.B "-H --headererr"
+Show errors found in front of \\begin{document}
+.PP Miscellaneous switches:
+.TP
+.B "-W --version"
+Version information
+
+.PP
+If no LaTeX files are specified on the command line, we will read from
+stdin. For explanation of warning/error messages, please consult the
+main document /usr/share/doc/chktex/ChkTeX.dvi.gz.
+
+.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.,
+59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+.SH ENVIRONMENT
+No environment variables are used.
+.SH FILES
+None.
+.SH AUTHOR
+Jens T. Berger Thielemann,
+.I <jensthi@ifi.uio.no>
+.PP
+This manual page was cobbled together by Clint Adams <schizo@debian.org>,
+based on the output of "chktex --help" and deweb(1).
+.SH "SEE ALSO"
+.B deweb(1), chktex(1)
diff --git a/support/chktex/config.h.in b/support/chktex/config.h.in
new file mode 100644
index 0000000000..80401f8e31
--- /dev/null
+++ b/support/chktex/config.h.in
@@ -0,0 +1,158 @@
+/* config.h.in. Generated from configure.in by autoheader. */
+
+/* Define to 1 if you have the `access' function. */
+#undef HAVE_ACCESS
+
+/* Define to 1 if you have the `closedir' function. */
+#undef HAVE_CLOSEDIR
+
+/* Define to 1 if you have the declaration of `stpcpy', and to 0 if you don't.
+ */
+#undef HAVE_DECL_STPCPY
+
+/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
+ */
+#undef HAVE_DIRENT_H
+
+/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
+#undef HAVE_DOPRNT
+
+/* Define to 1 if you have the `fileno' function. */
+#undef HAVE_FILENO
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the `isatty' function. */
+#undef HAVE_ISATTY
+
+/* Define to 1 if you have the `termcap' library (-ltermcap). */
+#undef HAVE_LIBTERMCAP
+
+/* Define to 1 if you have the `termlib' library (-ltermlib). */
+#undef HAVE_LIBTERMLIB
+
+/* Define to 1 if you have the <limits.h> header file. */
+#undef HAVE_LIMITS_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
+#undef HAVE_NDIR_H
+
+/* Define to 1 if you have the `opendir' function. */
+#undef HAVE_OPENDIR
+
+/* Whether PCRE can be used for user warnings. */
+#undef HAVE_PCRE
+
+/* Whether POSIX ERE can be used for user warnings. */
+#undef HAVE_POSIX_ERE
+
+/* Define to 1 if you have the `readdir' function. */
+#undef HAVE_READDIR
+
+/* Define to 1 if you have the `stat' function. */
+#undef HAVE_STAT
+
+/* Define to 1 if you have the <stat.h> header file. */
+#undef HAVE_STAT_H
+
+/* Define to 1 if you have the <stdarg.h> header file. */
+#undef HAVE_STDARG_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the `strcasecmp' function. */
+#undef HAVE_STRCASECMP
+
+/* Define to 1 if you have the `strdup' function. */
+#undef HAVE_STRDUP
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the `strlwr' function. */
+#undef HAVE_STRLWR
+
+/* Define to 1 if you have the `strtol' function. */
+#undef HAVE_STRTOL
+
+/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
+ */
+#undef HAVE_SYS_DIR_H
+
+/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
+ */
+#undef HAVE_SYS_NDIR_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <termcap.h> header file. */
+#undef HAVE_TERMCAP_H
+
+/* Define to 1 if you have the <termlib.h> header file. */
+#undef HAVE_TERMLIB_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the `vprintf' function. */
+#undef HAVE_VPRINTF
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Strip debug info */
+#undef STRIP_DEBUG
+
+/* Define for Solaris 2.5.1 so the uint64_t typedef from <sys/synch.h>,
+ <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the
+ #define below would cause a syntax error. */
+#undef _UINT64_T
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+ calls it, or to nothing if 'inline' is not supported under any name. */
+#ifndef __cplusplus
+#undef inline
+#endif
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+#undef size_t
+
+/* Define to the type of an unsigned integer type of width exactly 64 bits if
+ such a type exists and the standard includes do not define it. */
+#undef uint64_t
diff --git a/support/chktex/configure b/support/chktex/configure
new file mode 100755
index 0000000000..d5e4be46f6
--- /dev/null
+++ b/support/chktex/configure
@@ -0,0 +1,6044 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.69 for ChkTeX 1.7.6.
+#
+#
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# Use a proper internal environment variable to ensure we don't fall
+ # into an infinite loop, continuously re-executing ourselves.
+ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+ _as_can_reexec=no; export _as_can_reexec;
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+ fi
+ # We don't want this to propagate to other subprocesses.
+ { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+ as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '\${1+\"\$@\"}'='\"\$@\"'
+ setopt NO_GLOB_SUBST
+else
+ case \`(set -o) 2>/dev/null\` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+"
+ as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+ exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
+ as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+ as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+ eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+ test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+ if (eval "$as_required") 2>/dev/null; then :
+ as_have_required=yes
+else
+ as_have_required=no
+fi
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ as_found=:
+ case $as_dir in #(
+ /*)
+ for as_base in sh bash ksh sh5; do
+ # Try only shells that exist, to save several forks.
+ as_shell=$as_dir/$as_base
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ CONFIG_SHELL=$as_shell as_have_required=yes
+ if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ break 2
+fi
+fi
+ done;;
+ esac
+ as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+ if test "x$CONFIG_SHELL" != x; then :
+ export CONFIG_SHELL
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+ if test x$as_have_required = xno; then :
+ $as_echo "$0: This script requires a shell more modern than all"
+ $as_echo "$0: the shells that I found on your system."
+ if test x${ZSH_VERSION+set} = xset ; then
+ $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+ else
+ $as_echo "$0: Please tell bug-autoconf@gnu.org about your system,
+$0: including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+ fi
+ exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+ as_lineno_1=$LINENO as_lineno_1a=$LINENO
+ as_lineno_2=$LINENO as_lineno_2a=$LINENO
+ eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+ test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+ # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+ # already done that, so ensure we don't try to do so again and fall
+ # in an infinite loop. This has already happened in practice.
+ _as_can_reexec=no; export _as_can_reexec
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='ChkTeX'
+PACKAGE_TARNAME='chktex'
+PACKAGE_VERSION='1.7.6'
+PACKAGE_STRING='ChkTeX 1.7.6'
+PACKAGE_BUGREPORT=''
+PACKAGE_URL=''
+
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='LTLIBOBJS
+LIBOBJS
+WITH_PCRE
+EGREP
+GREP
+CPP
+LATEX2HTML
+LYNX
+DVIPS
+LATEX
+GROFF
+PERL5
+MKDIR_P
+LN_S
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+CLEAN
+BUILT_SCRIPTS
+SCRIPTS
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_pcre
+enable_posixre
+enable_lacheck_replace
+enable_debug_info
+enable_coverage_testing
+'
+ ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CPP'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval $ac_prev=\$ac_option
+ ac_prev=
+ continue
+ fi
+
+ case $ac_option in
+ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+ *=) ac_optarg= ;;
+ *) ac_optarg=yes ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_dashdash$ac_option in
+ --)
+ ac_dashdash=yes ;;
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=*)
+ datadir=$ac_optarg ;;
+
+ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+ | --dataroo | --dataro | --datar)
+ ac_prev=datarootdir ;;
+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+ datarootdir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=no ;;
+
+ -docdir | --docdir | --docdi | --doc | --do)
+ ac_prev=docdir ;;
+ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+ docdir=$ac_optarg ;;
+
+ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+ ac_prev=dvidir ;;
+ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+ dvidir=$ac_optarg ;;
+
+ -enable-* | --enable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=\$ac_optarg ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+ ac_prev=htmldir ;;
+ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+ | --ht=*)
+ htmldir=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localedir | --localedir | --localedi | --localed | --locale)
+ ac_prev=localedir ;;
+ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+ localedir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst | --locals)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+ ac_prev=pdfdir ;;
+ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+ pdfdir=$ac_optarg ;;
+
+ -psdir | --psdir | --psdi | --psd | --ps)
+ ac_prev=psdir ;;
+ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+ psdir=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=\$ac_optarg ;;
+
+ -without-* | --without-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: $ac_useropt"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=no ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ case $ac_envvar in #(
+ '' | [0-9]* | *[!_$as_cr_alnum]* )
+ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+ esac
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+ case $enable_option_checking in
+ no) ;;
+ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+ *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
+ datadir sysconfdir sharedstatedir localstatedir includedir \
+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+ libdir localedir mandir
+do
+ eval ac_val=\$$ac_var
+ # Remove trailing slashes.
+ case $ac_val in
+ */ )
+ ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+ eval $ac_var=\$ac_val;;
+ esac
+ # Be sure to have absolute directory names.
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+ as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+ as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then the parent directory.
+ ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_myself" : 'X\(//\)[^/]' \| \
+ X"$as_myself" : 'X\(//\)$' \| \
+ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r "$srcdir/$ac_unique_file"; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+ pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+ srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+ eval ac_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_env_${ac_var}_value=\$${ac_var}
+ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures ChkTeX 1.7.6 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking ...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+ --infodir=DIR info documentation [DATAROOTDIR/info]
+ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
+ --mandir=DIR man documentation [DATAROOTDIR/man]
+ --docdir=DIR documentation root [DATAROOTDIR/doc/chktex]
+ --htmldir=DIR html documentation [DOCDIR]
+ --dvidir=DIR dvi documentation [DOCDIR]
+ --pdfdir=DIR pdf documentation [DOCDIR]
+ --psdir=DIR ps documentation [DOCDIR]
+_ACEOF
+
+ cat <<\_ACEOF
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+ case $ac_init_help in
+ short | recursive ) echo "Configuration of ChkTeX 1.7.6:";;
+ esac
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-option-checking ignore unrecognized --enable/--with options
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+
+ --enable-pcre: Use PCRE to allow regular expressions in
+ user warnings. (Default: yes, if available).
+
+ --enable-posixre: Use POSIX extended regular expressions in
+ user warnings. (Default: yes, unless using PCRE).
+
+ --enable-lacheck-replace: Installs a lacheck replacement. (Default: no).
+
+ --enable-debug-info: Compile in miscellaneous runtime debugging
+ information. (Default: yes).
+
+ --enable-coverage-testing: Activate coverage testing with gcov. (Default: no)
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ LIBS libraries to pass to the linker, e.g. -l<library>
+ CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+ you have headers in a nonstandard directory <include dir>
+ CPP C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to the package provider.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d "$ac_dir" ||
+ { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+ continue
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+ cd "$ac_dir" || { ac_status=$?; continue; }
+ # Check for guested configure.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+ elif test -f "$ac_srcdir/configure"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure" --help=recursive
+ else
+ $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi || ac_status=$?
+ cd "$ac_pwd" || { ac_status=$?; break; }
+ done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+ cat <<\_ACEOF
+ChkTeX configure 1.7.6
+generated by GNU Autoconf 2.69
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest$ac_exeext
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest$ac_exeext && {
+ test "$cross_compiling" = yes ||
+ test -x conftest$ac_exeext
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+ # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+ # interfere with the next link command; also delete a directory that is
+ # left behind by Apple's compiler. We do this before executing the actions.
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } > conftest.i && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: program exited with status $ac_status" >&5
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=$ac_status
+fi
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
+# accordingly.
+ac_fn_c_check_header_mongrel ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if eval \${$3+:} false; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+else
+ # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_header_compiler=yes
+else
+ ac_header_compiler=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <$2>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ ac_header_preproc=yes
+else
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+ yes:no: )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+ ;;
+ no:yes:* )
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+ ;;
+esac
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=\$ac_header_compiler"
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_mongrel
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
+# -------------------------------------------
+# Tests whether TYPE exists after having included INCLUDES, setting cache
+# variable VAR accordingly.
+ac_fn_c_check_type ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=no"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+if (sizeof ($2))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+if (sizeof (($2)))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ eval "$3=yes"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_type
+
+# ac_fn_c_find_uintX_t LINENO BITS VAR
+# ------------------------------------
+# Finds an unsigned integer type with width BITS, setting cache variable VAR
+# accordingly.
+ac_fn_c_find_uintX_t ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5
+$as_echo_n "checking for uint$2_t... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ eval "$3=no"
+ # Order is important - never check a type that is potentially smaller
+ # than half of the expected target width.
+ for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \
+ 'unsigned long long int' 'unsigned short int' 'unsigned char'; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)];
+test_array [0] = 0;
+return test_array [0];
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ case $ac_type in #(
+ uint$2_t) :
+ eval "$3=yes" ;; #(
+ *) :
+ eval "$3=\$ac_type" ;;
+esac
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ if eval test \"x\$"$3"\" = x"no"; then :
+
+else
+ break
+fi
+ done
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_find_uintX_t
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $2 (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES
+# ---------------------------------------------
+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
+# accordingly.
+ac_fn_c_check_decl ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ as_decl_name=`echo $2|sed 's/ *(.*//'`
+ as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
+$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main ()
+{
+#ifndef $as_decl_name
+#ifdef __cplusplus
+ (void) $as_decl_use;
+#else
+ (void) $as_decl_name;
+#endif
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_decl
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by ChkTeX $as_me 1.7.6, which was
+generated by GNU Autoconf 2.69. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ $as_echo "PATH: $as_dir"
+ done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *\'*)
+ ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+ 2)
+ as_fn_append ac_configure_args1 " '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ as_fn_append ac_configure_args " '$ac_arg'"
+ ;;
+ esac
+ done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+(
+ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+ (set) 2>&1 |
+ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ sed -n \
+ "s/'\''/'\''\\\\'\'''\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+ ;; #(
+ *)
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+)
+ echo
+
+ $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ $as_echo "$as_me: caught signal $ac_signal"
+ $as_echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core core.conftest.* &&
+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+ # We do not want a PATH search for config.site.
+ case $CONFIG_SITE in #((
+ -*) ac_site_file1=./$CONFIG_SITE;;
+ */*) ac_site_file1=$CONFIG_SITE;;
+ *) ac_site_file1=./$CONFIG_SITE;;
+ esac
+elif test "x$prefix" != xNONE; then
+ ac_site_file1=$prefix/share/config.site
+ ac_site_file2=$prefix/etc/config.site
+else
+ ac_site_file1=$ac_default_prefix/share/config.site
+ ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+ test "x$ac_site_file" = xNONE && continue
+ if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file" \
+ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special files
+ # actually), so we avoid doing that. DJGPP emulates it as a regular file.
+ if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val=\$ac_cv_env_${ac_var}_value
+ eval ac_new_val=\$ac_env_${ac_var}_value
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ # differences in whitespace do not lead to failure.
+ ac_old_val_w=`echo x $ac_old_val`
+ ac_new_val_w=`echo x $ac_new_val`
+ if test "$ac_old_val_w" != "$ac_new_val_w"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ ac_cache_corrupted=:
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ eval $ac_var=\$ac_old_val
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+CLEAN=
+
+# Check whether --enable-pcre was given.
+if test "${enable_pcre+set}" = set; then :
+ enableval=$enable_pcre;
+else
+ enable_pcre=yes
+fi
+
+
+# Check whether --enable-posixre was given.
+if test "${enable_posixre+set}" = set; then :
+ enableval=$enable_posixre;
+else
+ enable_posixre=yes
+fi
+
+
+# Check whether --enable-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-debug-info was given.
+if test "${enable_debug_info+set}" = set; then :
+ enableval=$enable_debug_info;
+else
+ enable_debug_info=yes
+fi
+
+
+# Check whether --enable-coverage-testing was given.
+if test "${enable_coverage_testing+set}" = set; then :
+ enableval=$enable_coverage_testing;
+else
+ enable_coverage_testing=no
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lacheck replacement should be installed" >&5
+$as_echo_n "checking whether lacheck replacement should be installed... " >&6; }
+if test "$enable_lacheck_replace" = "yes"; then
+ SCRIPTS="$SCRIPTS lacheck"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether runtime debug info should be used" >&5
+$as_echo_n "checking whether runtime debug info should be used... " >&6; }
+if test "$enable_debug_info" = "yes"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+
+$as_echo "#define STRIP_DEBUG 1" >>confdefs.h
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether coverage testing is enabled" >&5
+$as_echo_n "checking whether coverage testing is enabled... " >&6; }
+if test "$enable_coverage_testing" = "yes"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ CFLAGS="${CFLAGS} -fprofile-arcs -ftest-coverage -O0"
+ CLEAN="${CLEAN} \$(wildcard *.bb *.bbg *.da *.gcov)"
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ fi
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl.exe
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl.exe
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CC" && break
+done
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+ esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link_default") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile. We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+ then :; else
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ fi
+ # We set ac_cv_exeext here because the later test for it is not
+ # safe: cross compilers may not add the suffix if given an `-o'
+ # argument, so we may need to know it at that point already.
+ # Even if this section looks crufty: it has the advantage of
+ # actually working.
+ break;;
+ * )
+ break;;
+ esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+ ac_file=''
+fi
+if test -z "$ac_file"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+ { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if { ac_try='./conftest$ac_cv_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then :
+ for ac_file in conftest.o conftest.obj conftest.*; do
+ test -f "$ac_file" || continue;
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_compiler_gnu=yes
+else
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_save_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ ac_cv_prog_cc_g=no
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_g=yes
+else
+ CFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not '\xHH' hex character constants.
+ These don't provoke an error unfortunately, instead are silently treated
+ as 'x'. The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
+ array size at least. It's necessary to write '\x00'==0 to get something
+ that's true only with -std. */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+ test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+ x)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+ xno)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+ *)
+ CC="$CC $ac_cv_prog_cc_c89"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for strict prototypes" >&5
+$as_echo_n "checking CFLAGS for strict prototypes... " >&6; }
+if ${ac_cv_cflags_strict_prototypes+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_cflags_strict_prototypes="no, unknown"
+
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ ac_save_CFLAGS="$CFLAGS"
+for ac_arg in "-pedantic % -fstrict-prototypes -Wstrict-prototypes" "-pedantic % -Wstrict-prototypes" "-pedantic % -Wmissing-prototypes" "-pedantic % -Werror-implicit-function-declaration" "-pedantic % -Wimplicit-function-declaration" #
+do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_cflags_strict_prototypes=`echo $ac_arg | sed -e 's,.*% *,,'` ; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case ".$ac_cv_cflags_strict_prototypes" in
+ .|.no|.no,*) ;;
+ *) # sanity check with signal() from sys/signal.h
+ cp config.log config.tmp
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <signal.h>
+int
+main ()
+{
+
+ if (signal (SIGINT, SIG_IGN) == SIG_DFL) return 1;
+ if (signal (SIGINT, SIG_IGN) != SIG_DFL) return 2;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ if test `diff config.log config.tmp | grep -i warning | wc -l` != 0
+then if test `diff config.log config.tmp | grep -i warning | wc -l` != 1
+then ac_cv_cflags_strict_prototypes="no, suppressed, signal.h," ; fi ; fi
+else
+ ac_cv_cflags_strict_prototypes="no, suppressed, signal.h"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ rm config.tmp
+ ;;
+esac
+ CFLAGS="$ac_save_CFLAGS"
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags_strict_prototypes" >&5
+$as_echo "$ac_cv_cflags_strict_prototypes" >&6; }
+case ".$ac_cv_cflags_strict_prototypes" in
+ .ok|.ok,*) ;;
+ .|.no|.no,*)
+ ;;
+ *)
+ if echo " $CFLAGS " | grep " $ac_cv_cflags_strict_prototypes " 2>&1 >/dev/null
+ then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$ac_cv_cflags_strict_prototypes"; } >&5
+ (: CFLAGS does contain $ac_cv_cflags_strict_prototypes) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$ac_cv_cflags_strict_prototypes\""; } >&5
+ (: CFLAGS="$CFLAGS $ac_cv_cflags_strict_prototypes") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ CFLAGS="$CFLAGS $ac_cv_cflags_strict_prototypes"
+ fi
+ ;;
+esac
+
+
+ ansi=
+ if test -z "$ansi"; then
+ msg="for C compiler warning flags"
+ else
+ msg="for C compiler warning and ANSI conformance flags"
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking $msg" >&5
+$as_echo_n "checking $msg... " >&6; }
+if ${vl_cv_prog_cc_warnings+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ if test -n "$CC"; then
+ cat > conftest.c <<EOF
+int main(int argc, char **argv) { return 0; }
+EOF
+
+ if test "$GCC" = "yes"; then
+ if test -z "$ansi"; then
+ vl_cv_prog_cc_warnings="-Wall"
+ else
+ vl_cv_prog_cc_warnings="-Wall -ansi -pedantic"
+ fi
+
+
+ elif $CC -V 2>&1 | grep -i "WorkShop" > /dev/null 2>&1 &&
+ $CC -c -v -Xc conftest.c > /dev/null 2>&1 &&
+ test -f conftest.o; then
+ if test -z "$ansi"; then
+ vl_cv_prog_cc_warnings="-v"
+ else
+ vl_cv_prog_cc_warnings="-v -Xc"
+ fi
+
+ elif $CC -V 2>&1 | grep -i "Digital UNIX Compiler" > /dev/null 2>&1 &&
+ $CC -c -verbose -w0 -warnprotos -std1 conftest.c > /dev/null 2>&1 &&
+ test -f conftest.o; then
+ if test -z "$ansi"; then
+ vl_cv_prog_cc_warnings="-verbose -w0 -warnprotos"
+ else
+ vl_cv_prog_cc_warnings="-verbose -w0 -warnprotos -std1"
+ fi
+
+ elif $CC 2>&1 | grep -i "C for AIX Compiler" > /dev/null 2>&1 &&
+ $CC -c -qlanglvl=ansi -qinfo=all conftest.c > /dev/null 2>&1 &&
+ test -f conftest.o; then
+ if test -z "$ansi"; then
+ vl_cv_prog_cc_warnings="-qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd"
+ else
+ vl_cv_prog_cc_warnings="-qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd -qlanglvl=ansi"
+ fi
+
+ elif $CC -version 2>&1 | grep -i "MIPSpro Compilers" > /dev/null 2>&1 &&
+ $CC -c -fullwarn -ansi -ansiE conftest.c > /dev/null 2>&1 &&
+ test -f conftest.o; then
+ if test -z "$ansi"; then
+ vl_cv_prog_cc_warnings="-fullwarn"
+ else
+ vl_cv_prog_cc_warnings="-fullwarn -ansi -ansiE"
+ fi
+
+ elif what $CC 2>&1 | grep -i "HP C Compiler" > /dev/null 2>&1 &&
+ $CC -c -Aa +w1 conftest.c > /dev/null 2>&1 &&
+ test -f conftest.o; then
+ if test -z "$ansi"; then
+ vl_cv_prog_cc_warnings="+w1"
+ else
+ vl_cv_prog_cc_warnings="+w1 -Aa"
+ fi
+
+ elif $CC -V 2>&1 | grep "/SX" > /dev/null 2>&1 &&
+ $CC -c -pvctl,fullmsg -Xc conftest.c > /dev/null 2>&1 &&
+ test -f conftest.o; then
+ if test -z "$ansi"; then
+ vl_cv_prog_cc_warnings="-pvctl,fullmsg"
+ else
+ vl_cv_prog_cc_warnings="-pvctl,fullmsg -Xc"
+ fi
+
+ elif $CC -V 2>&1 | grep -i "Cray" > /dev/null 2>&1 &&
+ $CC -c -h msglevel 2 conftest.c > /dev/null 2>&1 &&
+ test -f conftest.o; then
+ if test -z "$ansi"; then
+ vl_cv_prog_cc_warnings="-h msglevel 2"
+ else
+ vl_cv_prog_cc_warnings="-h msglevel 2 -h conform"
+ fi
+
+ fi
+ rm -f conftest.*
+ fi
+ if test -n "$vl_cv_prog_cc_warnings"; then
+ CFLAGS="$CFLAGS $vl_cv_prog_cc_warnings"
+ else
+ vl_cv_prog_cc_warnings="unknown"
+ fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $vl_cv_prog_cc_warnings" >&5
+$as_echo "$vl_cv_prog_cc_warnings" >&6; }
+
+
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+ if test -f "$ac_dir/install-sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f "$ac_dir/install.sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f "$ac_dir/shtool"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
+
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+ ./ | .// | /[cC]/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ rm -rf conftest.one conftest.two conftest.dir
+ echo one > conftest.one
+ echo two > conftest.two
+ mkdir conftest.dir
+ if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+ test -s conftest.one && test -s conftest.two &&
+ test -s conftest.dir/conftest.one &&
+ test -s conftest.dir/conftest.two
+ then
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+
+ done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ INSTALL=$ac_install_sh
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+$as_echo_n "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+$as_echo "no, using $LN_S" >&6; }
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+ if ${ac_cv_path_mkdir+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in mkdir gmkdir; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
+ case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+ 'mkdir (GNU coreutils) '* | \
+ 'mkdir (coreutils) '* | \
+ 'mkdir (fileutils) '4.1*)
+ ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+ break 3;;
+ esac
+ done
+ done
+ done
+IFS=$as_save_IFS
+
+fi
+
+ test -d ./--version && rmdir ./--version
+ if test "${ac_cv_path_mkdir+set}" = set; then
+ MKDIR_P="$ac_cv_path_mkdir -p"
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for MKDIR_P within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ MKDIR_P="$ac_install_sh -d"
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PERL5+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $PERL5 in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_PERL5="$PERL5" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/usr/bin:/usr/local/bin"
+for as_dir in $as_dummy
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_PERL5="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+PERL5=$ac_cv_path_PERL5
+if test -n "$PERL5"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL5" >&5
+$as_echo "$PERL5" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$PERL5" && break
+done
+test -n "$PERL5" || PERL5="no"
+
+if test "$PERL5" != no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether perl is v5 or higher" >&5
+$as_echo_n "checking whether perl is v5 or higher... " >&6; }
+ if $PERL5 -e 'exit($] >= 5)'; then
+ PERL5=no
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ fi
+fi
+
+if test "$PERL5" != no; then
+ BUILT_SCRIPTS="$BUILT_SCRIPTS deweb"
+ SCRIPTS="$SCRIPTS chkweb"
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: chkweb will not be installed since you do not have perl5." >&5
+$as_echo "$as_me: WARNING: chkweb will not be installed since you do not have perl5." >&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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_GROFF+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$GROFF"; then
+ ac_cv_prog_GROFF="$GROFF" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_GROFF="$ac_prog"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+GROFF=$ac_cv_prog_GROFF
+if test -n "$GROFF"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GROFF" >&5
+$as_echo "$GROFF" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$GROFF" && break
+done
+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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_LATEX+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $LATEX in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_LATEX="$LATEX" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_LATEX="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_path_LATEX" && ac_cv_path_LATEX="no"
+ ;;
+esac
+fi
+LATEX=$ac_cv_path_LATEX
+if test -n "$LATEX"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LATEX" >&5
+$as_echo "$LATEX" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+# Extract the first word of "dvips", so it can be a program name with args.
+set dummy dvips; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_DVIPS+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $DVIPS in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_DVIPS="$DVIPS" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_DVIPS="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+DVIPS=$ac_cv_path_DVIPS
+if test -n "$DVIPS"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DVIPS" >&5
+$as_echo "$DVIPS" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+# Extract the first word of "lynx", so it can be a program name with args.
+set dummy lynx; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_LYNX+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $LYNX in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_LYNX="$LYNX" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_LYNX="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+LYNX=$ac_cv_path_LYNX
+if test -n "$LYNX"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LYNX" >&5
+$as_echo "$LYNX" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+# Extract the first word of "latex2html", so it can be a program name with args.
+set dummy latex2html; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_LATEX2HTML+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $LATEX2HTML in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_LATEX2HTML="$LATEX2HTML" # Let the user override the test with a path.
+ ;;
+ *)
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_LATEX2HTML="$as_dir/$ac_word$ac_exec_ext"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+fi
+LATEX2HTML=$ac_cv_path_LATEX2HTML
+if test -n "$LATEX2HTML"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LATEX2HTML" >&5
+$as_echo "$LATEX2HTML" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for tgetent in -ltermlib" >&5
+$as_echo_n "checking for tgetent in -ltermlib... " >&6; }
+if ${ac_cv_lib_termlib_tgetent+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ltermlib $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char tgetent ();
+int
+main ()
+{
+return tgetent ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_termlib_tgetent=yes
+else
+ ac_cv_lib_termlib_tgetent=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_termlib_tgetent" >&5
+$as_echo "$ac_cv_lib_termlib_tgetent" >&6; }
+if test "x$ac_cv_lib_termlib_tgetent" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBTERMLIB 1
+_ACEOF
+
+ LIBS="-ltermlib $LIBS"
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for tgetent in -ltermcap" >&5
+$as_echo_n "checking for tgetent in -ltermcap... " >&6; }
+if ${ac_cv_lib_termcap_tgetent+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ltermcap $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char tgetent ();
+int
+main ()
+{
+return tgetent ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_termcap_tgetent=yes
+else
+ ac_cv_lib_termcap_tgetent=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_termcap_tgetent" >&5
+$as_echo "$ac_cv_lib_termcap_tgetent" >&6; }
+if test "x$ac_cv_lib_termcap_tgetent" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBTERMCAP 1
+_ACEOF
+
+ LIBS="-ltermcap $LIBS"
+
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if ${ac_cv_prog_CPP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ # Double quotes because CPP needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+ # Broken: success on invalid input.
+continue
+else
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$GREP"; then
+ ac_path_GREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in grep ggrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+ # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'GREP' >> "conftest.nl"
+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_GREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_GREP="$ac_path_GREP"
+ ac_path_GREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_GREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_GREP"; then
+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ if test -z "$EGREP"; then
+ ac_path_EGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in egrep; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+ ac_count=0
+ $as_echo_n 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ $as_echo 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP="$ac_path_EGREP"
+ ac_path_EGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_EGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_EGREP=$EGREP
+fi
+
+ fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_header_stdc=yes
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "free" >/dev/null 2>&1; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then :
+ :
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+ (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ return 2;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+ ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+ conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+ac_header_dirent=no
+for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do
+ as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh`
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5
+$as_echo_n "checking for $ac_hdr that defines DIR... " >&6; }
+if eval \${$as_ac_Header+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <$ac_hdr>
+
+int
+main ()
+{
+if ((DIR *) 0)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$as_ac_Header=yes"
+else
+ eval "$as_ac_Header=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$as_ac_Header
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1
+_ACEOF
+
+ac_header_dirent=$ac_hdr; break
+fi
+
+done
+# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
+if test $ac_header_dirent = dirent.h; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
+$as_echo_n "checking for library containing opendir... " >&6; }
+if ${ac_cv_search_opendir+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char opendir ();
+int
+main ()
+{
+return opendir ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' dir; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_search_opendir=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_opendir+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_opendir+:} false; then :
+
+else
+ ac_cv_search_opendir=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
+$as_echo "$ac_cv_search_opendir" >&6; }
+ac_res=$ac_cv_search_opendir
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5
+$as_echo_n "checking for library containing opendir... " >&6; }
+if ${ac_cv_search_opendir+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char opendir ();
+int
+main ()
+{
+return opendir ();
+ ;
+ return 0;
+}
+_ACEOF
+for ac_lib in '' x; do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_search_opendir=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext
+ if ${ac_cv_search_opendir+:} false; then :
+ break
+fi
+done
+if ${ac_cv_search_opendir+:} false; then :
+
+else
+ ac_cv_search_opendir=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5
+$as_echo "$ac_cv_search_opendir" >&6; }
+ac_res=$ac_cv_search_opendir
+if test "$ac_res" != no; then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+fi
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ inttypes.h stdint.h unistd.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in limits.h stat.h strings.h stdarg.h sys/stat.h termcap.h termlib.h unistd.h
+do :
+ as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
+$as_echo_n "checking for an ANSI C-conforming const... " >&6; }
+if ${ac_cv_c_const+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+#ifndef __cplusplus
+ /* Ultrix mips cc rejects this sort of thing. */
+ typedef int charset[2];
+ const charset cs = { 0, 0 };
+ /* SunOS 4.1.1 cc rejects this. */
+ char const *const *pcpcc;
+ char **ppc;
+ /* NEC SVR4.0.2 mips cc rejects this. */
+ struct point {int x, y;};
+ static struct point const zero = {0,0};
+ /* AIX XL C 1.02.0.0 rejects this.
+ It does not let you subtract one const X* pointer from another in
+ an arm of an if-expression whose if-part is not a constant
+ expression */
+ const char *g = "string";
+ pcpcc = &g + (g ? g-g : 0);
+ /* HPUX 7.0 cc rejects these. */
+ ++pcpcc;
+ ppc = (char**) pcpcc;
+ pcpcc = (char const *const *) ppc;
+ { /* SCO 3.2v4 cc rejects this sort of thing. */
+ char tx;
+ char *t = &tx;
+ char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+ *t++ = 0;
+ if (s) return 0;
+ }
+ { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */
+ int x[] = {25, 17};
+ const int *foo = &x[0];
+ ++foo;
+ }
+ { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+ typedef const int *iptr;
+ iptr p = 0;
+ ++p;
+ }
+ { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying
+ "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+ struct s { int j; const int *ap[3]; } bx;
+ struct s *b = &bx; b->j = 5;
+ }
+ { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+ const int foo = 10;
+ if (!foo) return 0;
+ }
+ return !cs[0] && !zero.x;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_c_const=yes
+else
+ ac_cv_c_const=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5
+$as_echo "$ac_cv_c_const" >&6; }
+if test $ac_cv_c_const = no; then
+
+$as_echo "#define const /**/" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
+$as_echo_n "checking for inline... " >&6; }
+if ${ac_cv_c_inline+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo () {return 0; }
+$ac_kw foo_t foo () {return 0; }
+#endif
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_c_inline=$ac_kw
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ test "$ac_cv_c_inline" != no && break
+done
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5
+$as_echo "$ac_cv_c_inline" >&6; }
+
+case $ac_cv_c_inline in
+ inline | yes) ;;
+ *)
+ case $ac_cv_c_inline in
+ no) ac_val=;;
+ *) ac_val=$ac_cv_c_inline;;
+ esac
+ cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+ ;;
+esac
+
+ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
+if test "x$ac_cv_type_size_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define size_t unsigned int
+_ACEOF
+
+fi
+
+ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t"
+case $ac_cv_c_uint64_t in #(
+ no|yes) ;; #(
+ *)
+
+$as_echo "#define _UINT64_T 1" >>confdefs.h
+
+
+cat >>confdefs.h <<_ACEOF
+#define uint64_t $ac_cv_c_uint64_t
+_ACEOF
+;;
+ esac
+
+
+for ac_func in vprintf
+do :
+ ac_fn_c_check_func "$LINENO" "vprintf" "ac_cv_func_vprintf"
+if test "x$ac_cv_func_vprintf" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_VPRINTF 1
+_ACEOF
+
+ac_fn_c_check_func "$LINENO" "_doprnt" "ac_cv_func__doprnt"
+if test "x$ac_cv_func__doprnt" = xyes; then :
+
+$as_echo "#define HAVE_DOPRNT 1" >>confdefs.h
+
+fi
+
+fi
+done
+
+
+for ac_func in access closedir fileno isatty opendir readdir stat strcasecmp strdup strlwr strtol
+do :
+ as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+ cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+ac_fn_c_check_decl "$LINENO" "stpcpy" "ac_cv_have_decl_stpcpy" "$ac_includes_default"
+if test "x$ac_cv_have_decl_stpcpy" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STPCPY $ac_have_decl
+_ACEOF
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether PCRE regular expressions are enabled" >&5
+$as_echo_n "checking whether PCRE regular expressions are enabled... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_pcre" >&5
+$as_echo "$enable_pcre" >&6; }
+if test "$enable_pcre" = "yes"; then
+ # Extract the first word of "pcre-config", so it can be a program name with args.
+set dummy pcre-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_WITH_PCRE+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$WITH_PCRE"; then
+ ac_cv_prog_WITH_PCRE="$WITH_PCRE" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_WITH_PCRE="yes"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+ test -z "$ac_cv_prog_WITH_PCRE" && ac_cv_prog_WITH_PCRE="no"
+fi
+fi
+WITH_PCRE=$ac_cv_prog_WITH_PCRE
+if test -n "$WITH_PCRE"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WITH_PCRE" >&5
+$as_echo "$WITH_PCRE" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ if test "$WITH_PCRE" = "yes"; then
+
+$as_echo "#define HAVE_PCRE 1" >>confdefs.h
+
+ CFLAGS="${CFLAGS} $(pcre-config --cflags-posix)"
+ LDFLAGS="${LDFLAGS} $(pcre-config --libs-posix)"
+ else
+ $as_echo "#define HAVE_PCRE 0" >>confdefs.h
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: PCRE library not found." >&5
+$as_echo "$as_me: WARNING: PCRE library not found." >&2;}
+ fi
+else
+ $as_echo "#define HAVE_PCRE 0" >>confdefs.h
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: PCRE regular expressions not enabled." >&5
+$as_echo "$as_me: WARNING: PCRE regular expressions not enabled." >&2;}
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for POSIX extended regular expressions" >&5
+$as_echo_n "checking for POSIX extended regular expressions... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <regex.h>
+ #ifdef REG_EXTENDED
+ yes
+ # endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ $EGREP "yes" >/dev/null 2>&1; then :
+ posix_ere=yes
+else
+ posix_ere=no
+fi
+rm -f conftest*
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $posix_ere" >&5
+$as_echo "$posix_ere" >&6; }
+if test "$WITH_PCRE" = "yes"; then
+
+$as_echo "#define HAVE_POSIX_ERE 0" >>confdefs.h
+
+else
+ if test "$enable_posixre" = "yes"; then
+ if test "$posix_ere" = "yes"; then
+ $as_echo "#define HAVE_POSIX_ERE 1" >>confdefs.h
+
+ else
+ $as_echo "#define HAVE_POSIX_ERE 0" >>confdefs.h
+
+ fi
+ else
+ $as_echo "#define HAVE_POSIX_ERE 0" >>confdefs.h
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Regular expressions not enabled." >&5
+$as_echo "$as_me: WARNING: Regular expressions not enabled." >&2;}
+ fi
+fi
+
+
+ac_config_headers="$ac_config_headers config.h"
+
+ac_config_files="$ac_config_files stamp-h"
+
+ac_config_files="$ac_config_files Makefile deweb rmeheader ChkTeX.tex"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+
+ (set) 2>&1 |
+ case $as_nl`(ac_space=' '; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ # `set' does not quote correctly, so add quotes: double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \.
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;; #(
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+) |
+ sed '
+ /^ac_cv_env_/b end
+ t clear
+ :clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+ if test "x$cache_file" != "x/dev/null"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+ if test ! -f "$cache_file" || test -h "$cache_file"; then
+ cat confcache >"$cache_file"
+ else
+ case $cache_file in #(
+ */* | ?:*)
+ mv -f confcache "$cache_file"$$ &&
+ mv -f "$cache_file"$$ "$cache_file" ;; #(
+ *)
+ mv -f confcache "$cache_file" ;;
+ esac
+ fi
+ fi
+ else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+ ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
+ # will be set to the directory where LIBOBJS objects are built.
+ as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='print -r --'
+ as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in #(
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there. '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ $as_echo "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by ChkTeX $as_me 1.7.6, which was
+generated by GNU Autoconf 2.69. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration. Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number and configuration settings, then exit
+ --config print configuration, then exit
+ -q, --quiet, --silent
+ do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Report bugs to the package provider."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+ChkTeX config.status 1.7.6
+configured by $0, generated by GNU Autoconf 2.69,
+ with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=?*)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ --*=)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=
+ ac_shift=:
+ ;;
+ *)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+ $as_echo "$ac_cs_version"; exit ;;
+ --config | --confi | --conf | --con | --co | --c )
+ $as_echo "$ac_cs_config"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ '') as_fn_error $? "missing file argument" ;;
+ esac
+ as_fn_append CONFIG_FILES " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --he | --h)
+ # Conflict between --help and --header
+ as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+ --help | --hel | -h )
+ $as_echo "$ac_cs_usage"; exit ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+ *) as_fn_append ac_config_targets " $1"
+ ac_need_defaults=false ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+ shift
+ \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+ CONFIG_SHELL='$SHELL'
+ export CONFIG_SHELL
+ exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+ $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+ "stamp-h") CONFIG_FILES="$CONFIG_FILES stamp-h" ;;
+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "deweb") CONFIG_FILES="$CONFIG_FILES deweb" ;;
+ "rmeheader") CONFIG_FILES="$CONFIG_FILES rmeheader" ;;
+ "ChkTeX.tex") CONFIG_FILES="$CONFIG_FILES ChkTeX.tex" ;;
+
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+ esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+ tmp= ac_tmp=
+ trap 'exit_status=$?
+ : "${ac_tmp:=$tmp}"
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+ trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+ eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+ ac_cs_awk_cr='\\r'
+else
+ ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+ echo "cat >conf$$subs.awk <<_ACEOF" &&
+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+ echo "_ACEOF"
+} >conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ . ./conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+ if test $ac_delim_n = $ac_delim_num; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+ N
+ s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+ for (key in S) S_is_set[key] = 1
+ FS = ""
+
+}
+{
+ line = $ 0
+ nfields = split(line, field, "@")
+ substed = 0
+ len = length(field[1])
+ for (i = 2; i < nfields; i++) {
+ key = field[i]
+ keylen = length(key)
+ if (S_is_set[key]) {
+ value = S[key]
+ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+ len += length(value) + length(field[++i])
+ substed = 1
+ } else
+ len += 1 + keylen
+ }
+
+ print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+ cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
+h
+s///
+s/^/:/
+s/[ ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[ ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[ ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+ ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+ if test -z "$ac_tt"; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any. Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[ ]*#[ ]*define[ ][ ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ for (key in D) D_is_set[key] = 1
+ FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+ line = \$ 0
+ split(line, arg, " ")
+ if (arg[1] == "#") {
+ defundef = arg[2]
+ mac1 = arg[3]
+ } else {
+ defundef = substr(arg[1], 2)
+ mac1 = arg[2]
+ }
+ split(mac1, mac2, "(") #)
+ macro = mac2[1]
+ prefix = substr(line, 1, index(line, defundef) - 1)
+ if (D_is_set[macro]) {
+ # Preserve the white space surrounding the "#".
+ print prefix "define", macro P[macro] D[macro]
+ next
+ } else {
+ # Replace #undef with comments. This is necessary, for example,
+ # in the case of _POSIX_SOURCE, which is predefined and required
+ # on some systems where configure will not decide to define it.
+ if (defundef == "undef") {
+ print "/*", prefix defundef, macro, "*/"
+ next
+ }
+ }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS "
+shift
+for ac_tag
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+ :[FH]-) ac_tag=-:-;;
+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+ esac
+ ac_save_IFS=$IFS
+ IFS=:
+ set x $ac_tag
+ IFS=$ac_save_IFS
+ shift
+ ac_file=$1
+ shift
+
+ case $ac_mode in
+ :L) ac_source=$1;;
+ :[FH])
+ ac_file_inputs=
+ for ac_f
+ do
+ case $ac_f in
+ -) ac_f="$ac_tmp/stdin";;
+ *) # Look for the file first in the build tree, then in the source tree
+ # (if the path is not absolute). The absolute path cannot be DOS-style,
+ # because $ac_f cannot contain `:'.
+ test -f "$ac_f" ||
+ case $ac_f in
+ [\\/$]*) false;;
+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+ esac ||
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+ esac
+ case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ as_fn_append ac_file_inputs " '$ac_f'"
+ done
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ configure_input='Generated from '`
+ $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ `' by configure.'
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+ fi
+ # Neutralize special characters interpreted by sed in replacement strings.
+ case $configure_input in #(
+ *\&* | *\|* | *\\* )
+ ac_sed_conf_input=`$as_echo "$configure_input" |
+ sed 's/[\\\\&|]/\\\\&/g'`;; #(
+ *) ac_sed_conf_input=$configure_input;;
+ esac
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+ esac
+ ;;
+ esac
+
+ ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ case $ac_mode in
+ :F)
+ #
+ # CONFIG_FILE
+ #
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+ esac
+ ac_MKDIR_P=$MKDIR_P
+ case $MKDIR_P in
+ [\\/$]* | ?:[\\/]* ) ;;
+ */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+ esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_datarootdir_hack='
+ s&@datadir@&$datadir&g
+ s&@docdir@&$docdir&g
+ s&@infodir@&$infodir&g
+ s&@localedir@&$localedir&g
+ s&@mandir@&$mandir&g
+ s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
+ "$ac_tmp/out"`; test -z "$ac_out"; } &&
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&2;}
+
+ rm -f "$ac_tmp/stdin"
+ case $ac_file in
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+ esac \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+ :H)
+ #
+ # CONFIG_HEADER
+ #
+ if test x"$ac_file" != x-; then
+ {
+ $as_echo "/* $configure_input */" \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+ } >"$ac_tmp/config.h" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ rm -f "$ac_file"
+ mv "$ac_tmp/config.h" "$ac_file" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ fi
+ else
+ $as_echo "/* $configure_input */" \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+ || as_fn_error $? "could not create -" "$LINENO" 5
+ fi
+ ;;
+
+
+ esac
+
+
+ case $ac_file$ac_mode in
+ "stamp-h":F) echo timestamp > stamp-h ;;
+
+ esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
diff --git a/support/chktex/configure.in b/support/chktex/configure.in
new file mode 100644
index 0000000000..0508bcac25
--- /dev/null
+++ b/support/chktex/configure.in
@@ -0,0 +1,193 @@
+dnl
+dnl ChkTeX, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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, 1.7.6)
+AC_SUBST(SCRIPTS)
+AC_SUBST(BUILT_SCRIPTS)
+AC_SUBST(CLEAN)
+CLEAN=
+
+AC_ARG_ENABLE(pcre,[
+ --enable-pcre: Use PCRE to allow regular expressions in
+ user warnings. (Default: yes, if available).],,
+enable_pcre=yes)
+
+AC_ARG_ENABLE(posixre,[
+ --enable-posixre: Use POSIX extended regular expressions in
+ user warnings. (Default: yes, unless using PCRE).],,
+enable_posixre=yes)
+
+AC_ARG_ENABLE(lacheck-replace,[
+ --enable-lacheck-replace: Installs a lacheck replacement. (Default: no).],,
+enable_lacheck_replace=no)
+
+AC_ARG_ENABLE(debug-info,[
+ --enable-debug-info: Compile in miscellaneous runtime debugging
+ information. (Default: yes).],,
+enable_debug_info=yes)
+
+AC_ARG_ENABLE(coverage-testing,[
+ --enable-coverage-testing: Activate coverage testing with gcov. (Default: no)],,
+enable_coverage_testing=no)
+
+AC_MSG_CHECKING(whether lacheck replacement should be installed)
+if test "$enable_lacheck_replace" = "yes"; then
+ SCRIPTS="$SCRIPTS lacheck"
+ AC_MSG_RESULT(yes)
+else
+ 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, Strip debug info)
+ AC_MSG_RESULT(no)
+fi
+
+AC_MSG_CHECKING(whether coverage testing is enabled)
+if test "$enable_coverage_testing" = "yes"; then
+ AC_MSG_RESULT(yes)
+ CFLAGS="${CFLAGS} -fprofile-arcs -ftest-coverage -O0"
+ CLEAN="${CLEAN} \$(wildcard *.bb *.bbg *.da *.gcov)"
+else
+ AC_MSG_RESULT(no)
+fi
+
+
+dnl Check compiler and flags
+AC_PROG_CC
+AX_CFLAGS_STRICT_PROTOTYPES
+VL_PROG_CC_WARNINGS
+
+dnl Checks for programs.
+AC_PROG_INSTALL
+AC_PROG_LN_S
+AC_PROG_MKDIR_P
+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
+ BUILT_SCRIPTS="$BUILT_SCRIPTS deweb"
+ SCRIPTS="$SCRIPTS chkweb"
+else
+ AC_MSG_WARN(chkweb 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, no)
+dnl if test "$LATEX" = no; then
+dnl AC_MSG_ERROR([No LaTeX on the system, cannot find latex program.])
+dnl fi
+
+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_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
+AC_TYPE_UINT64_T
+
+dnl Checks for library functions.
+AC_FUNC_VPRINTF
+AC_CHECK_FUNCS(access closedir fileno isatty opendir readdir stat dnl
+strcasecmp strdup strlwr strtol)
+
+dnl Checks for declarations.
+AC_CHECK_DECLS([stpcpy])
+
+dnl Check for PCRE regular expression support
+AC_MSG_CHECKING(whether PCRE regular expressions are enabled)
+AC_MSG_RESULT($enable_pcre)
+if test "$enable_pcre" = "yes"; then
+ AC_CHECK_PROG(WITH_PCRE, pcre-config, yes, no)
+ if test "$WITH_PCRE" = "yes"; then
+ AC_DEFINE(HAVE_PCRE, 1, Whether PCRE can be used for user warnings.)
+ CFLAGS="${CFLAGS} $(pcre-config --cflags-posix)"
+ LDFLAGS="${LDFLAGS} $(pcre-config --libs-posix)"
+ else
+ AC_DEFINE(HAVE_PCRE, 0)
+ AC_MSG_WARN(PCRE library not found.)
+ fi
+else
+ AC_DEFINE(HAVE_PCRE, 0)
+ AC_MSG_WARN(PCRE regular expressions not enabled.)
+fi
+
+dnl Check for POSIX extended regular expression support
+AC_MSG_CHECKING(for POSIX extended regular expressions)
+AC_EGREP_CPP([yes],
+ [#include <regex.h>
+ #ifdef REG_EXTENDED
+ yes
+ # endif
+ ], posix_ere=yes, posix_ere=no)
+AC_MSG_RESULT($posix_ere)
+if test "$WITH_PCRE" = "yes"; then
+ AC_DEFINE(HAVE_POSIX_ERE, 0, Whether POSIX ERE can be used for user warnings.)
+else
+ if test "$enable_posixre" = "yes"; then
+ if test "$posix_ere" = "yes"; then
+ AC_DEFINE(HAVE_POSIX_ERE, 1)
+ else
+ AC_DEFINE(HAVE_POSIX_ERE, 0)
+ fi
+ else
+ AC_DEFINE(HAVE_POSIX_ERE, 0)
+ AC_MSG_WARN(Regular expressions not enabled.)
+ fi
+fi
+
+
+AC_CONFIG_HEADER(config.h)
+AC_CONFIG_FILES([stamp-h], [echo timestamp > stamp-h])
+AC_OUTPUT(Makefile deweb rmeheader ChkTeX.tex)
diff --git a/support/chktex/deweb.1 b/support/chktex/deweb.1
new file mode 100644
index 0000000000..43770aa1fd
--- /dev/null
+++ b/support/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.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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/support/chktex/deweb.in b/support/chktex/deweb.in
new file mode 100644
index 0000000000..fff7fb919a
--- /dev/null
+++ b/support/chktex/deweb.in
@@ -0,0 +1,133 @@
+#! @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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Contact the author at:
+# Jens Berger
+# Spektrumvn. 4
+# N-0666 Oslo
+# Norway
+# E-mail: <jensthi@ifi.uio.no>
+#
+#
+#
+
+print STDERR "DeWEB v1.3 - Copyright 1996 Jens T. Berger Thielemann\n";
+
+undef $/;
+my @FILES = @ARGV;
+FILE:
+while( my $file = shift @FILES ) {
+
+ my $success = open my $fh, '<', "$file";
+ if ( ! $success ) {
+ print STDERR "Couldn't open file '$file'\n";
+ next FILE;
+ }
+
+ $texmode = 1;
+ $_ = <$fh>;
+
+ 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/support/chktex/input.tex b/support/chktex/input.tex
new file mode 100644
index 0000000000..76bc301ff2
--- /dev/null
+++ b/support/chktex/input.tex
@@ -0,0 +1 @@
+\this is a test of whether the file is actually inputted...
diff --git a/support/chktex/install-sh b/support/chktex/install-sh
new file mode 100755
index 0000000000..0b0fdcbba6
--- /dev/null
+++ b/support/chktex/install-sh
@@ -0,0 +1,501 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2013-12-25.23; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# 'make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+tab=' '
+nl='
+'
+IFS=" $tab$nl"
+
+# Set DOITPROG to "echo" to test this script.
+
+doit=${DOITPROG-}
+doit_exec=${doit:-exec}
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+is_target_a_directory=possibly
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+ or: $0 [OPTION]... SRCFILES... DIRECTORY
+ or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+ or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+ --help display this help and exit.
+ --version display version info and exit.
+
+ -c (ignored)
+ -C install only if different (preserve the last data modification time)
+ -d create directories instead of installing files.
+ -g GROUP $chgrpprog installed files to GROUP.
+ -m MODE $chmodprog installed files to MODE.
+ -o USER $chownprog installed files to USER.
+ -s $stripprog installed files.
+ -t DIRECTORY install into DIRECTORY.
+ -T report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+ CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+ RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+ case $1 in
+ -c) ;;
+
+ -C) copy_on_change=true;;
+
+ -d) dir_arg=true;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift;;
+
+ --help) echo "$usage"; exit $?;;
+
+ -m) mode=$2
+ case $mode in
+ *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
+ echo "$0: invalid mode: $mode" >&2
+ exit 1;;
+ esac
+ shift;;
+
+ -o) chowncmd="$chownprog $2"
+ shift;;
+
+ -s) stripcmd=$stripprog;;
+
+ -t)
+ is_target_a_directory=always
+ dst_arg=$2
+ # Protect names problematic for 'test' and other utilities.
+ case $dst_arg in
+ -* | [=\(\)!]) dst_arg=./$dst_arg;;
+ esac
+ shift;;
+
+ -T) is_target_a_directory=never;;
+
+ --version) echo "$0 $scriptversion"; exit $?;;
+
+ --) shift
+ break;;
+
+ -*) echo "$0: invalid option: $1" >&2
+ exit 1;;
+
+ *) break;;
+ esac
+ shift
+done
+
+# We allow the use of options -d and -T together, by making -d
+# take the precedence; this is for compatibility with GNU install.
+
+if test -n "$dir_arg"; then
+ if test -n "$dst_arg"; then
+ echo "$0: target directory not allowed when installing a directory." >&2
+ exit 1
+ fi
+fi
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+ # When -d is used, all remaining arguments are directories to create.
+ # When -t is used, the destination is already specified.
+ # Otherwise, the last argument is the destination. Remove it from $@.
+ for arg
+ do
+ if test -n "$dst_arg"; then
+ # $@ is not empty: it contains at least $arg.
+ set fnord "$@" "$dst_arg"
+ shift # fnord
+ fi
+ shift # arg
+ dst_arg=$arg
+ # Protect names problematic for 'test' and other utilities.
+ case $dst_arg in
+ -* | [=\(\)!]) dst_arg=./$dst_arg;;
+ esac
+ done
+fi
+
+if test $# -eq 0; then
+ if test -z "$dir_arg"; then
+ echo "$0: no input file specified." >&2
+ exit 1
+ fi
+ # It's OK to call 'install-sh -d' without argument.
+ # This can happen when creating conditional directories.
+ exit 0
+fi
+
+if test -z "$dir_arg"; then
+ if test $# -gt 1 || test "$is_target_a_directory" = always; then
+ if test ! -d "$dst_arg"; then
+ echo "$0: $dst_arg: Is not a directory." >&2
+ exit 1
+ fi
+ fi
+fi
+
+if test -z "$dir_arg"; then
+ do_exit='(exit $ret); exit $ret'
+ trap "ret=129; $do_exit" 1
+ trap "ret=130; $do_exit" 2
+ trap "ret=141; $do_exit" 13
+ trap "ret=143; $do_exit" 15
+
+ # Set umask so as not to create temps with too-generous modes.
+ # However, 'strip' requires both read and write access to temps.
+ case $mode in
+ # Optimize common cases.
+ *644) cp_umask=133;;
+ *755) cp_umask=22;;
+
+ *[0-7])
+ if test -z "$stripcmd"; then
+ u_plus_rw=
+ else
+ u_plus_rw='% 200'
+ fi
+ cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+ *)
+ if test -z "$stripcmd"; then
+ u_plus_rw=
+ else
+ u_plus_rw=,u+rw
+ fi
+ cp_umask=$mode$u_plus_rw;;
+ esac
+fi
+
+for src
+do
+ # Protect names problematic for 'test' and other utilities.
+ case $src in
+ -* | [=\(\)!]) src=./$src;;
+ esac
+
+ if test -n "$dir_arg"; then
+ dst=$src
+ dstdir=$dst
+ test -d "$dstdir"
+ dstdir_status=$?
+ else
+
+ # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+ # might cause directories to be created, which would be especially bad
+ # if $src (and thus $dsttmp) contains '*'.
+ if test ! -f "$src" && test ! -d "$src"; then
+ echo "$0: $src does not exist." >&2
+ exit 1
+ fi
+
+ if test -z "$dst_arg"; then
+ echo "$0: no destination specified." >&2
+ exit 1
+ fi
+ dst=$dst_arg
+
+ # If destination is a directory, append the input filename; won't work
+ # if double slashes aren't ignored.
+ if test -d "$dst"; then
+ if test "$is_target_a_directory" = never; then
+ echo "$0: $dst_arg: Is a directory" >&2
+ exit 1
+ fi
+ dstdir=$dst
+ dst=$dstdir/`basename "$src"`
+ dstdir_status=0
+ else
+ dstdir=`dirname "$dst"`
+ test -d "$dstdir"
+ dstdir_status=$?
+ fi
+ fi
+
+ obsolete_mkdir_used=false
+
+ if test $dstdir_status != 0; then
+ case $posix_mkdir in
+ '')
+ # Create intermediate dirs using mode 755 as modified by the umask.
+ # This is like FreeBSD 'install' as of 1997-10-28.
+ umask=`umask`
+ case $stripcmd.$umask in
+ # Optimize common cases.
+ *[2367][2367]) mkdir_umask=$umask;;
+ .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+ *[0-7])
+ mkdir_umask=`expr $umask + 22 \
+ - $umask % 100 % 40 + $umask % 20 \
+ - $umask % 10 % 4 + $umask % 2
+ `;;
+ *) mkdir_umask=$umask,go-w;;
+ esac
+
+ # With -d, create the new directory with the user-specified mode.
+ # Otherwise, rely on $mkdir_umask.
+ if test -n "$dir_arg"; then
+ mkdir_mode=-m$mode
+ else
+ mkdir_mode=
+ fi
+
+ posix_mkdir=false
+ case $umask in
+ *[123567][0-7][0-7])
+ # POSIX mkdir -p sets u+wx bits regardless of umask, which
+ # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+ ;;
+ *)
+ tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+ if (umask $mkdir_umask &&
+ exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+ then
+ if test -z "$dir_arg" || {
+ # Check for POSIX incompatibilities with -m.
+ # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+ # other-writable bit of parent directory when it shouldn't.
+ # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+ ls_ld_tmpdir=`ls -ld "$tmpdir"`
+ case $ls_ld_tmpdir in
+ d????-?r-*) different_mode=700;;
+ d????-?--*) different_mode=755;;
+ *) false;;
+ esac &&
+ $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+ ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+ test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+ }
+ }
+ then posix_mkdir=:
+ fi
+ rmdir "$tmpdir/d" "$tmpdir"
+ else
+ # Remove any dirs left behind by ancient mkdir implementations.
+ rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+ fi
+ trap '' 0;;
+ esac;;
+ esac
+
+ if
+ $posix_mkdir && (
+ umask $mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+ )
+ then :
+ else
+
+ # The umask is ridiculous, or mkdir does not conform to POSIX,
+ # or it failed possibly due to a race condition. Create the
+ # directory the slow way, step by step, checking for races as we go.
+
+ case $dstdir in
+ /*) prefix='/';;
+ [-=\(\)!]*) prefix='./';;
+ *) prefix='';;
+ esac
+
+ oIFS=$IFS
+ IFS=/
+ set -f
+ set fnord $dstdir
+ shift
+ set +f
+ IFS=$oIFS
+
+ prefixes=
+
+ for d
+ do
+ test X"$d" = X && continue
+
+ prefix=$prefix$d
+ if test -d "$prefix"; then
+ prefixes=
+ else
+ if $posix_mkdir; then
+ (umask=$mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+ # Don't fail if two instances are running concurrently.
+ test -d "$prefix" || exit 1
+ else
+ case $prefix in
+ *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) qprefix=$prefix;;
+ esac
+ prefixes="$prefixes '$qprefix'"
+ fi
+ fi
+ prefix=$prefix/
+ done
+
+ if test -n "$prefixes"; then
+ # Don't fail if two instances are running concurrently.
+ (umask $mkdir_umask &&
+ eval "\$doit_exec \$mkdirprog $prefixes") ||
+ test -d "$dstdir" || exit 1
+ obsolete_mkdir_used=true
+ fi
+ fi
+ fi
+
+ if test -n "$dir_arg"; then
+ { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+ { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+ else
+
+ # Make a couple of temp file names in the proper directory.
+ dsttmp=$dstdir/_inst.$$_
+ rmtmp=$dstdir/_rm.$$_
+
+ # Trap to clean up those temp files at exit.
+ trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+ # Copy the file name to the temp name.
+ (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+ # and set any options; do chmod last to preserve setuid bits.
+ #
+ # If any of these fail, we abort the whole thing. If we want to
+ # ignore errors from any of these, just make sure not to ignore
+ # errors from the above "$doit $cpprog $src $dsttmp" command.
+ #
+ { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+ { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+ { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+ # If -C, don't bother to copy if it wouldn't change the file.
+ if $copy_on_change &&
+ old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
+ new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
+ set -f &&
+ set X $old && old=:$2:$4:$5:$6 &&
+ set X $new && new=:$2:$4:$5:$6 &&
+ set +f &&
+ test "$old" = "$new" &&
+ $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+ then
+ rm -f "$dsttmp"
+ else
+ # Rename the file to the real destination.
+ $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+ # The rename failed, perhaps because mv can't rename something else
+ # to itself, or perhaps because mv is so ancient that it does not
+ # support -f.
+ {
+ # Now remove or move aside any old file at destination location.
+ # We try this two ways since rm can't unlink itself on some
+ # systems and the destination file might be busy for other
+ # reasons. In this case, the final cleanup might fail but the new
+ # file should still install successfully.
+ {
+ test ! -f "$dst" ||
+ $doit $rmcmd -f "$dst" 2>/dev/null ||
+ { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+ { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+ } ||
+ { echo "$0: cannot unlink or rename $dst" >&2
+ (exit 1); exit 1
+ }
+ } &&
+
+ # Now rename the file to the real destination.
+ $doit $mvcmd "$dsttmp" "$dst"
+ }
+ fi || exit 1
+
+ trap '' 0
+ fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/support/chktex/lacheck b/support/chktex/lacheck
new file mode 100755
index 0000000000..da75d360de
--- /dev/null
+++ b/support/chktex/lacheck
@@ -0,0 +1,27 @@
+#! /bin/sh
+
+# lacheck replacement 1.0, lacheck <-> ChkTeX interface (UNIX).
+# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Contact the author at:
+# Jens Berger
+# Spektrumvn. 4
+# N-0666 Oslo
+# Norway
+# E-mail: <jensthi@ifi.uio.no>
+
+chktex -v3 $*
diff --git a/support/chktex/m4/ax_cflags_strict_prototypes.m4 b/support/chktex/m4/ax_cflags_strict_prototypes.m4
new file mode 100644
index 0000000000..06ec9e2f27
--- /dev/null
+++ b/support/chktex/m4/ax_cflags_strict_prototypes.m4
@@ -0,0 +1,170 @@
+# ===========================================================================
+# http://autoconf-archive.cryp.to/ax_cflags_strict_prototypes.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AX_CFLAGS_STRICT_PROTOTYPES [(shellvar [,default, [A/NA]]
+#
+# DESCRIPTION
+#
+# Try to find a compiler option that requires strict prototypes.
+#
+# The sanity check is done by looking at sys/signal.h which has a set of
+# macro-definitions SIG_DFL and SIG_IGN that are cast to the local
+# signal-handler type. If that signal-handler type is not fully qualified
+# then the system headers are not seen as strictly prototype clean.
+#
+# For the GNU CC compiler it will be -fstrict-prototypes
+# -Wstrict-prototypes The result is added to the shellvar being CFLAGS by
+# default.
+#
+# DEFAULTS:
+#
+# - $1 shell-variable-to-add-to : CFLAGS
+# - $2 add-value-if-not-found : nothing
+# - $3 action-if-found : add value to shellvariable
+# - $4 action-if-not-found : nothing
+#
+# LAST MODIFICATION
+#
+# 2008-04-12
+#
+# COPYLEFT
+#
+# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>
+#
+# This program is free software; you can 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, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception, the respective Autoconf Macro's copyright owner
+# gives unlimited permission to copy, distribute and modify the configure
+# scripts that are the output of Autoconf when processing the Macro. You
+# need not follow the terms of the GNU General Public License when using
+# or distributing such scripts, even though portions of the text of the
+# Macro appear in them. The GNU General Public License (GPL) does govern
+# all other use of the material that constitutes the Autoconf Macro.
+#
+# This special exception to the GPL applies to versions of the Autoconf
+# Macro released by the Autoconf Macro Archive. When you make and
+# distribute a modified version of the Autoconf Macro, you may extend this
+# special exception to the GPL to apply to your modified version as well.
+
+AC_DEFUN([AX_CFLAGS_STRICT_PROTOTYPES],[dnl
+AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl
+AS_VAR_PUSHDEF([VAR],[ac_cv_cflags_strict_prototypes])dnl
+AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for strict prototypes],
+VAR,[VAR="no, unknown"
+ AC_LANG_SAVE
+ AC_LANG_C
+ ac_save_[]FLAGS="$[]FLAGS"
+for ac_arg dnl
+in "-pedantic % -fstrict-prototypes -Wstrict-prototypes" dnl GCC
+ "-pedantic % -Wstrict-prototypes" dnl try to warn atleast
+ "-pedantic % -Wmissing-prototypes" dnl or another warning
+ "-pedantic % -Werror-implicit-function-declaration" dnl
+ "-pedantic % -Wimplicit-function-declaration" dnl
+ #
+do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
+ AC_TRY_COMPILE([],[return 0;],
+ [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break])
+done
+case ".$VAR" in
+ .|.no|.no,*) ;;
+ *) # sanity check with signal() from sys/signal.h
+ cp config.log config.tmp
+ AC_TRY_COMPILE([#include <signal.h>],[
+ if (signal (SIGINT, SIG_IGN) == SIG_DFL) return 1;
+ if (signal (SIGINT, SIG_IGN) != SIG_DFL) return 2;],
+ dnl the original did use test -n `$CC testprogram.c`
+ [if test `diff config.log config.tmp | grep -i warning | wc -l` != 0
+then if test `diff config.log config.tmp | grep -i warning | wc -l` != 1
+then VAR="no, suppressed, signal.h," ; fi ; fi],
+ [VAR="no, suppressed, signal.h"])
+ rm config.tmp
+ ;;
+esac
+ FLAGS="$ac_save_[]FLAGS"
+ AC_LANG_RESTORE
+])
+case ".$VAR" in
+ .ok|.ok,*) m4_ifvaln($3,$3) ;;
+ .|.no|.no,*) m4_ifvaln($4,$4,[m4_ifval($2,[
+ AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"])
+ m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"])]) ;;
+ *) m4_ifvaln($3,$3,[
+ if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $VAR " 2>&1 >/dev/null
+ then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $VAR])
+ else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"])
+ m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"
+ fi ]) ;;
+esac
+AS_VAR_POPDEF([VAR])dnl
+AS_VAR_POPDEF([FLAGS])dnl
+])
+
+dnl the only difference - the LANG selection... and the default FLAGS
+
+AC_DEFUN([AX_CXXFLAGS_STRICT_PROTOTYPES],[dnl
+AS_VAR_PUSHDEF([FLAGS],[CXXFLAGS])dnl
+AS_VAR_PUSHDEF([VAR],[ac_cv_cxxflags_strict_prototypes])dnl
+AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for strict prototypes],
+VAR,[VAR="no, unknown"
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ ac_save_[]FLAGS="$[]FLAGS"
+for ac_arg dnl
+in "-pedantic -Werror % -fstrict-prototypes -Wstrict-prototypes" dnl GCC
+ "-pedantic -Werror % -Wstrict-prototypes" dnl try to warn atleast
+ "-pedantic -Werror % -Wmissing-prototypes" dnl try to warn atleast
+ "-pedantic -Werror % -Werror-implicit-function-declaration" dnl
+ "-pedantic -Werror % -Wimplicit-function-declaration" dnl
+ "-pedantic % -Wstrict-prototypes %% no, unsupported in C++" dnl oops
+ #
+do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'`
+ AC_TRY_COMPILE([],[return 0;],
+ [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break])
+done
+case ".$VAR" in
+ .|.no|.no,*) ;;
+ *) # sanity check with signal() from sys/signal.h
+ cp config.log config.tmp
+ AC_TRY_COMPILE([#include <signal.h>],[
+ if (signal (SIGINT, SIG_IGN) == SIG_DFL) return 1;
+ if (signal (SIGINT, SIG_IGN) != SIG_DFL) return 2;],
+ dnl the original did use test -n `$CC testprogram.c`
+ [if test `diff config.log config.tmp | grep -i warning | wc -l` != 0
+then if test `diff config.log config.tmp | grep -i warning | wc -l` != 1
+then VAR="no, suppressed, signal.h," ; fi ; fi],
+ [VAR="no, suppressed, signal.h"])
+ rm config.tmp
+ ;;
+esac
+ FLAGS="$ac_save_[]FLAGS"
+ AC_LANG_RESTORE
+])
+case ".$VAR" in
+ .ok|.ok,*) m4_ifvaln($3,$3) ;;
+ .|.no|.no,*) m4_ifvaln($4,$4,[m4_ifval($2,[
+ AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"])
+ m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"])]) ;;
+ *) m4_ifvaln($3,$3,[
+ if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $VAR " 2>&1 >/dev/null
+ then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $VAR])
+ else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"])
+ m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"
+ fi ]) ;;
+esac
+AS_VAR_POPDEF([VAR])dnl
+AS_VAR_POPDEF([FLAGS])dnl
+])
diff --git a/support/chktex/m4/vl_prog_cc_warnings.m4 b/support/chktex/m4/vl_prog_cc_warnings.m4
new file mode 100644
index 0000000000..fe2f614545
--- /dev/null
+++ b/support/chktex/m4/vl_prog_cc_warnings.m4
@@ -0,0 +1,111 @@
+AC_DEFUN([VL_PROG_CC_WARNINGS], [
+ ansi=$1
+ if test -z "$ansi"; then
+ msg="for C compiler warning flags"
+ else
+ msg="for C compiler warning and ANSI conformance flags"
+ fi
+ AC_CACHE_CHECK($msg, vl_cv_prog_cc_warnings, [
+ if test -n "$CC"; then
+ cat > conftest.c <<EOF
+int main(int argc, char **argv) { return 0; }
+EOF
+
+ dnl GCC
+ if test "$GCC" = "yes"; then
+ if test -z "$ansi"; then
+ vl_cv_prog_cc_warnings="-Wall"
+ else
+ vl_cv_prog_cc_warnings="-Wall -ansi -pedantic"
+ fi
+
+ dnl Most compilers print some kind of a version string with some command
+ dnl line options (often "-V"). The version string should be checked
+ dnl before doing a test compilation run with compiler-specific flags.
+ dnl This is because some compilers (like the Cray compiler) only
+ dnl produce a warning message for unknown flags instead of returning
+ dnl an error, resulting in a false positive. Also, compilers may do
+ dnl erratic things when invoked with flags meant for a different
+ dnl compiler.
+
+ dnl Solaris C compiler
+ elif $CC -V 2>&1 | grep -i "WorkShop" > /dev/null 2>&1 &&
+ $CC -c -v -Xc conftest.c > /dev/null 2>&1 &&
+ test -f conftest.o; then
+ if test -z "$ansi"; then
+ vl_cv_prog_cc_warnings="-v"
+ else
+ vl_cv_prog_cc_warnings="-v -Xc"
+ fi
+
+ dnl Digital Unix C compiler
+ elif $CC -V 2>&1 | grep -i "Digital UNIX Compiler" > /dev/null 2>&1 &&
+ $CC -c -verbose -w0 -warnprotos -std1 conftest.c > /dev/null 2>&1 &&
+ test -f conftest.o; then
+ if test -z "$ansi"; then
+ vl_cv_prog_cc_warnings="-verbose -w0 -warnprotos"
+ else
+ vl_cv_prog_cc_warnings="-verbose -w0 -warnprotos -std1"
+ fi
+
+ dnl C for AIX Compiler
+ elif $CC 2>&1 | grep -i "C for AIX Compiler" > /dev/null 2>&1 &&
+ $CC -c -qlanglvl=ansi -qinfo=all conftest.c > /dev/null 2>&1 &&
+ test -f conftest.o; then
+ if test -z "$ansi"; then
+ vl_cv_prog_cc_warnings="-qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd"
+ else
+ vl_cv_prog_cc_warnings="-qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd -qlanglvl=ansi"
+ fi
+
+ dnl IRIX C compiler
+ elif $CC -version 2>&1 | grep -i "MIPSpro Compilers" > /dev/null 2>&1 &&
+ $CC -c -fullwarn -ansi -ansiE conftest.c > /dev/null 2>&1 &&
+ test -f conftest.o; then
+ if test -z "$ansi"; then
+ vl_cv_prog_cc_warnings="-fullwarn"
+ else
+ vl_cv_prog_cc_warnings="-fullwarn -ansi -ansiE"
+ fi
+
+ dnl HP-UX C compiler
+ elif what $CC 2>&1 | grep -i "HP C Compiler" > /dev/null 2>&1 &&
+ $CC -c -Aa +w1 conftest.c > /dev/null 2>&1 &&
+ test -f conftest.o; then
+ if test -z "$ansi"; then
+ vl_cv_prog_cc_warnings="+w1"
+ else
+ vl_cv_prog_cc_warnings="+w1 -Aa"
+ fi
+
+ dnl The NEC SX-5 (Super-UX 10) C compiler
+ elif $CC -V 2>&1 | grep "/SX" > /dev/null 2>&1 &&
+ $CC -c -pvctl[,]fullmsg -Xc conftest.c > /dev/null 2>&1 &&
+ test -f conftest.o; then
+ if test -z "$ansi"; then
+ vl_cv_prog_cc_warnings="-pvctl[,]fullmsg"
+ else
+ vl_cv_prog_cc_warnings="-pvctl[,]fullmsg -Xc"
+ fi
+
+ dnl The Cray C compiler (Unicos)
+ elif $CC -V 2>&1 | grep -i "Cray" > /dev/null 2>&1 &&
+ $CC -c -h msglevel 2 conftest.c > /dev/null 2>&1 &&
+ test -f conftest.o; then
+ if test -z "$ansi"; then
+ vl_cv_prog_cc_warnings="-h msglevel 2"
+ else
+ vl_cv_prog_cc_warnings="-h msglevel 2 -h conform"
+ fi
+
+ fi
+ rm -f conftest.*
+ fi
+ if test -n "$vl_cv_prog_cc_warnings"; then
+ CFLAGS="$CFLAGS $vl_cv_prog_cc_warnings"
+ else
+ vl_cv_prog_cc_warnings="unknown"
+ fi
+ ])
+])dnl
+
diff --git a/support/chktex/rmeheader.in b/support/chktex/rmeheader.in
new file mode 100644
index 0000000000..56ca58ae76
--- /dev/null
+++ b/support/chktex/rmeheader.in
@@ -0,0 +1,19 @@
+Short: v@PACKAGE_VERSION@. Finds typographic errors in LaTeX
+Author: <chktex@ev-en.org> (Baruch Even)
+Uploader: <chktex@ev-en.org> (Baruch Even)
+Type: text/tex
+Replaces: text/tex/ChkTeX.lha
+Version: @PACKAGE_VERSION@
+URL: http://www.freesoftware.fsf.org/chktex
+
+
+ ##### ### ### ######## ### ##
+ ### ## ## ## ## ## #
+ @@ @@ @@@ @@ @@ @@ ####### @@ @
+ @@ @@@ @@ @@ @@ @@ ## # @@
+ && && && &&&& && @@ & &&
+ &&& && && && && && && @@@@ & &&
+ %%%%% %%% %%% %%% %%% %% && %%% %%% v@PACKAGE_VERSION@
+ && &
+ %%%%%%%
+
diff --git a/support/chktex/stamp-h.in b/support/chktex/stamp-h.in
new file mode 100644
index 0000000000..9788f70238
--- /dev/null
+++ b/support/chktex/stamp-h.in
@@ -0,0 +1 @@
+timestamp
diff --git a/support/chktex/types.h b/support/chktex/types.h
new file mode 100644
index 0000000000..a26b95295e
--- /dev/null
+++ b/support/chktex/types.h
@@ -0,0 +1,17 @@
+/*
+ * 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
+
+#ifndef TRUE
+# define TRUE 1L
+#endif
+#ifndef FALSE
+# define FALSE 0L
+#endif
+
+#endif