diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/chktex |
Initial commit
Diffstat (limited to 'support/chktex')
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 |