diff options
author | Karl Berry <karl@freefriends.org> | 2006-01-17 21:41:51 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2006-01-17 21:41:51 +0000 |
commit | 487ca4806cc046076293cf6cc5fbba0db282bac7 (patch) | |
tree | 847b412ab5158dd7bdd7ed7e5a4cc3fbca94be32 /Build/source/texk/chktex | |
parent | a3d3111bfe26b8e5f5bc6049dfb2a4ca2edc7881 (diff) |
texk 1
git-svn-id: svn://tug.org/texlive/trunk@1485 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/chktex')
34 files changed, 15044 insertions, 0 deletions
diff --git a/Build/source/texk/chktex/COPYING b/Build/source/texk/chktex/COPYING new file mode 100644 index 00000000000..10d1e0b82d3 --- /dev/null +++ b/Build/source/texk/chktex/COPYING @@ -0,0 +1,325 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your freedom to +share and change it. By contrast, the GNU General Public License is intended +to guarantee your freedom to share and change free software--to make sure the +software is free for all its users. This General Public License applies to +most of the Free Software Foundation's software and to any other program whose +authors commit to using it. (Some other Free Software Foundation software is +covered by the GNU Library General Public License instead.) You can apply it +to your programs, too. + + When we speak of free software, we are referring to freedom, not price. Our +General Public Licenses are designed to make sure that you have the freedom to +distribute copies of free software (and charge for this service if you wish), +that you receive source code or can get it if you want it, that you can change +the software or use pieces of it in new free programs; and that you know you +can do these things. + + To protect your rights, we need to make restrictions that forbid anyone to +deny you these rights or to ask you to surrender the rights. These +restrictions translate to certain responsibilities for you if you distribute +copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether gratis or +for a fee, you must give the recipients all the rights that you have. You +must make sure that they, too, receive or can get the source code. And you +must show them these terms so they know their rights. + + We protect your rights with two steps: (1) copyright the software, and (2) +offer you this license which gives you legal permission to copy, distribute +and/or modify the software. + + Also, for each author's protection and ours, we want to make certain that +everyone understands that there is no warranty for this free software. If the +software is modified by someone else and passed on, we want its recipients to +know that what they have is not the original, so that any problems introduced +by others will not reflect on the original authors' reputations. + + Finally, any free program is threatened constantly by software patents. We +wish to avoid the danger that redistributors of a free program will +individually obtain patent licenses, in effect making the program proprietary. +To prevent this, we have made it clear that any patent must be licensed for +everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and modification +follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains a notice +placed by the copyright holder saying it may be distributed under the terms of +this General Public License. The "Program", below, refers to any such program +or work, and a "work based on the Program" means either the Program or any +derivative work under copyright law: that is to say, a work containing the +Program or a portion of it, either verbatim or with modifications and/or +translated into another language. (Hereinafter, translation is included +without limitation in the term "modification".) Each licensee is addressed as +"you". + +Activities other than copying, distribution and modification are not covered +by this License; they are outside its scope. The act of running the Program +is not restricted, and the output from the Program is covered only if its +contents constitute a work based on the Program (independent of having been +made by running the Program). Whether that is true depends on what the +Program does. + + 1. You may copy and distribute verbatim copies of the Program's source code +as you receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice and +disclaimer of warranty; keep intact all the notices that refer to this License +and to the absence of any warranty; and give any other recipients of the +Program a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you may +at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion of it, +thus forming a work based on the Program, and copy and distribute such +modifications or work under the terms of Section 1 above, provided that you +also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices stating + that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in whole + or in part contains or is derived from the Program or any part thereof, + to be licensed as a whole at no charge to all third parties under the + terms of this License. + + c) If the modified program normally reads commands interactively when run, + you must cause it, when started running for such interactive use in the + most ordinary way, to print or display an announcement including an + appropriate copyright notice and a notice that there is no warranty (or + else, saying that you provide a warranty) and that users may + redistribute the program under these conditions, and telling the user + how to view a copy of this License. (Exception: if the Program itself + is interactive but does not normally print such an announcement, your + work based on the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If identifiable +sections of that work are not derived from the Program, and can be reasonably +considered independent and separate works in themselves, then this License, +and its terms, do not apply to those sections when you distribute them as +separate works. But when you distribute the same sections as part of a whole +which is a work based on the Program, the distribution of the whole must be on +the terms of this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your +rights to work written entirely by you; rather, the intent is to exercise the +right to control the distribution of derivative or collective works based on +the Program. + +In addition, mere aggregation of another work not based on the Program with +the Program (or with a work based on the Program) on a volume of a storage or +distribution medium does not bring the other work under the scope of this +License. + + 3. You may copy and distribute the Program (or a work based on it, under +Section 2) in object code or executable form under the terms of Sections 1 and +2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable source + code, which must be distributed under the terms of Sections 1 and 2 + above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three years, to + give any third party, for a charge no more than your cost of physically + performing source distribution, a complete machine-readable copy of the + corresponding source code, to be distributed under the terms of + Sections 1 and 2 above on a medium customarily used for software + interchange; or, + + c) Accompany it with the information you received as to the offer to + distribute corresponding source code. (This alternative is allowed + only for noncommercial distribution and only if you received the + program in object code or executable form with such an offer, in accord + with Subsection b above.) + +The source code for a work means the preferred form of the work for making +modifications to it. For an executable work, complete source code means all +the source code for all modules it contains, plus any associated interface +definition files, plus the scripts used to control compilation and +installation of the executable. However, as a special exception, the source +code distributed need not include anything that is normally distributed (in +either source or binary form) with the major components (compiler, kernel, and +so on) of the operating system on which the executable runs, unless that +component itself accompanies the executable. + +If distribution of executable or object code is made by offering access to +copy from a designated place, then offering equivalent access to copy the +source code from the same place counts as distribution of the source code, +even though third parties are not compelled to copy the source along with the +object code. + + 4. You may not copy, modify, sublicense, or distribute the Program except as +expressly provided under this License. Any attempt otherwise to copy, modify, +sublicense or distribute the Program is void, and will automatically terminate +your rights under this License. However, parties who have received copies, or +rights, from you under this License will not have their licenses terminated so +long as such parties remain in full compliance. + + 5. You are not required to accept this License, since you have not signed +it. However, nothing else grants you permission to modify or distribute the +Program or its derivative works. These actions are prohibited by law if you +do not accept this License. Therefore, by modifying or distributing the +Program (or any work based on the Program), you indicate your acceptance of +this License to do so, and all its terms and conditions for copying, +distributing or modifying the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the original +licensor to copy, distribute or modify the Program subject to these terms and +conditions. You may not impose any further restrictions on the recipients' +exercise of the rights granted herein. You are not responsible for enforcing +compliance by third parties to this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or otherwise) +that contradict the conditions of this License, they do not excuse you from +the conditions of this License. If you cannot distribute so as to satisfy +simultaneously your obligations under this License and any other pertinent +obligations, then as a consequence you may not distribute the Program at all. +For example, if a patent license would not permit royalty-free redistribution +of the Program by all those who receive copies directly or indirectly through +you, then the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply and +the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or +other property right claims or to contest validity of any such claims; this +section has the sole purpose of protecting the integrity of the free software +distribution system, which is implemented by public license practices. Many +people have made generous contributions to the wide range of software +distributed through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing to +distribute software through any other system and a licensee cannot impose that +choice. + +This section is intended to make thoroughly clear what is believed to be a +consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in certain +countries either by patents or by copyrighted interfaces, the original +copyright holder who places the Program under this License may add an explicit +geographical distribution limitation excluding those countries, so that +distribution is permitted only in or among countries not thus excluded. In +such case, this License incorporates the limitation as if written in the body +of this License. + + 9. The Free Software Foundation may publish revised and/or new versions of +the General Public License from time to time. Such new versions will be +similar in spirit to the present version, but may differ in detail to address +new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any later +version", you have the option of following the terms and conditions either of +that version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of this License, +you may choose any version ever published by the Free Software Foundation. + + 10. If you wish to incorporate parts of the Program into other free programs +whose distribution conditions are different, write to the author to ask for +permission. For software which is copyrighted by the Free Software +Foundation, write to the Free Software Foundation; we sometimes make +exceptions for this. Our decision will be guided by the two goals of +preserving the free status of all derivatives of our free software and of +promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR +THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE +STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE +PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND +PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, +YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO +LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR +THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest possible +use to the public, the best way to achieve this is to make it free software +which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest to +attach them to the start of each source file to most effectively convey the +exclusion of warranty; and each file should have at least the "copyright" line +and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) 19yy <name of author> + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this when it +starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may be +called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General Public +License instead of this License. diff --git a/Build/source/texk/chktex/ChkTeX.readme b/Build/source/texk/chktex/ChkTeX.readme new file mode 100644 index 00000000000..9d9dc96ae3c --- /dev/null +++ b/Build/source/texk/chktex/ChkTeX.readme @@ -0,0 +1,515 @@ +Short: v1.5. Finds typographic errors in LaTeX +Author: <jensthi@ifi.uio.no> (Jens T. Berger Thielemann) +Uploader: <jensthi@ifi.uio.no> (Jens T. Berger Thielemann) +Type: text/tex +Replaces: text/tex/ChkTeX.lha +Version: 1.5 +URL: http://www.ifi.uio.no/~jensthi/chktex/ +Porting: <bjort@ifi.uio.no> (Bjørn Ove Thue) [MSDOS] + <fritsch@hmi.de> (Wolfgang Fritsch) [OS/2] + + + ##### ### ### ######## ### ## + ### ## ## ## ## ## # + @@ @@ @@@ @@ @@ @@ ####### @@ @ + @@ @@@ @@ @@ @@ @@ ## # @@ + && && && &&&& && @@ & && + &&& && && && && && && @@@@ & && + %%%%% %%% %%% %%% %%% %% && %%% %%% v1.5 + && & + %%%%%%% + + Introduction + + This program has been written in frustration because some constructs + in LaTeX are sometimes non-intuitive, and easy to forget. It is _not_ + a replacement for the built-in checker in LaTeX; however it catches + some typographic errors LaTeX oversees. In other words, it is Lint for + LaTeX. Filters are also provided for checking the LaTeX parts of CWEB + documents. + + It is written in ANSI C and compiles silently under GCC using ``-Wall + -ansi -pedantic'' and almost all warning flags. This means that you + can compile & use the program on your favorite machine. Full source + included. + + The program also supports output formats suitable for further + processing by editors or other programs, making errors easy to cycle + through. Software is provided for beautifully interfacing against the + AUC-TeX Emacs mode, CygnusED, GoldEd and various Amiga message + browsers. + + The program itself does not have any machine requirements; Amiga, + MSDOS and OS/2 binaries are available. Of course, you'll need ARexx + and ScMsg or VBrowse to benefit from the ARexx scripts. + + Features + + ChkTeX begins to get quite a few bells & whistles now. However, you + should be aware of that in most cases, all this is transparent to the + user. As you will see, ChkTeX offers the ability to adapt to many + environments and configurations. + +New features + + Modifications and additions since v1.4: + + Program + + Modifications to the executable itself: + * As usual, a few more warnings: + + No space or similar in front/after parenthesis. + + Demands a consistent quote style. + + Double spaces in input which will not be rendered as one. + + Punctuation malplaced regarding to math mode. + + Warns about TeX primitives. + + Space in front of footnotes. + + Bogus \left and \right commands. + * The abbreviation recognizer has (for the last time?) been + redesigned. We now produce far less false warnings, catch more + cases and do all this faster than before. Seems like a win. + Done much of the same with the italic correction detection part, + too... + * Some bugs have been silently fixed. Hot spots in the program have + been optimized; in certain cases this in fact doubles the speed! + Along with this goes more code elegance and utilization of macro + processing and the C language. Take a look at ``Resource.[ch]''. + * It's possible to specify separate output-formats depending on + whether you are sending the output to a file/pipe or to a + terminal. + * Column positions are finally correct; we now expand tabs + correctly. + * ChkTeX will now recursively search for \input'ed files, both in + the document and on the commandline. See the ``chktexrc'' file for + more info. + * The debug switch is now more intelligent; if you wish to hack a + bit on ChkTeX for yourself, it is possible to produce selective + debugging output. The feature can also be disabled altogether. + * MS-DOS and OS/2 version of the program is now more flexible and + well-behaved, thanks to Gerd Böhm. + * You may now say ``-wall'' to make all messages warnings, and turn + them on. + * Uses termcap on UNIX boxes; this should ensure that ``-v2'' (or + more precisely: ``%i'' and ``%I'') works regardless to what + terminal you are using. + + Resource file + + New concepts introduced in the setup file: + * You may now specify both case-sensitive and case-insensitive user + patterns in the ``chktexrc'' file. In addition; it is now possible + to reset/clear lists. + * It is possible to specify how many arguments (optional/required) + ``WIPEARG'' should wipe; it behaves also somewhat more intelligent + when the arguments stretch over multiple lines. + * Global files will be read _in addition_ to local ones. The + searching order has also been reversed in order to make this more + intelligent. + + Other + + Various other stuff I've done to the product: + + * The documentation has been polished and should now be easier to + use in practical situations. + * ``check'' target in ``Makefile'', so you can check that the + installation succeeded. In fact, the ``Makefile'' has been + enhanced in several other ways too, amongst other it is now GNU + conforming. + * ``deweb'' is now documented; you may say ``man deweb'' to get a + few words of advice. The support script (chkweb) does now behave + as the remaining package (accepting stdin input and flags). + * I've written an Emacs hack which magically adds ChkTeX to the list + of AUC-TeX commands; thus making the use of the program even more + trivial. + For those of you who don't wish to mess with Emacs, I've included + a trivial lacheck <-> ChkTeX interface. + This means that you now can use ChkTeX just as easily as lacheck + when you're running AUC-TeX. + * Added an ARexx script which lets ChkTeX talk to VBrowse, the + message browser of Volker Barthelmann's freely distributable ANSI + C compiler. The browser itself is available on Aminet as + ``dev/c/vbcc.lha''. + +Feature list + + * Supports over 40 warnings. Warnings include: + + Commands terminated with space. Ignores ``\tt'', etc. + + Space in front of references instead of ``~''. + + Forgetting to group parenthesis characters when + sub-/superscripting. + + Italic correction (``\/'') mistakes (double, missing, + unnecessary). + + Parenthesis and environment matching. + + Ellipsis detection; also checks whether to use ``\dots'', + ``\cdots'' or ``\ldots''. + + Enforcement of normal space after abbreviation. Detects most + abbreviations automagically. + + Enforcement of end-of-sentence space when the last sentence + ended with capital letter. + + Math-mode on/off detection. + + Quote checking, both wrong types (``"'') and wrong direction. + + Recommends splitting three quotes in a row. + + Searching for user patterns. + + Displays comments. + + Space in front of ``\label'' and similar commands. + + Use of ``x'' instead of ``$\times$'' between numbers. + + Multiple spaces in input which will be rendered as one space + (or multiple spaces, where that is undesirable). + + Warns about text which may be ignored. + + Mathematical operators typeset as variables. + + No space in front of/after parenthesis. + + Demands a consistent quote style. + + Punctuation inside inner math mode/outside display math mode. + + Use of TeX primitives where LaTeX equivalents are available. + + Space in front of footnotes. + + Bogus characters following commands. + * Fully customizable. Intelligent resource format makes it possible + to make ChkTeX respect your LaTeX setup. Even command-line options + may be specified globally in the ``chktexrc'' file. + * Supports ``\input'' command; both TeX and LaTeX version. Actually + includes the files. ``TEXINPUTS''-equivalent search path. + * Intelligent warning/error handling. The user may promote/mute + warnings to suit his preferences. You may also mute warnings in + the header of a file; thus killing much unwanted garbage. + * Scripts included for checking CWEB files written in LaTeX. + (Requires perl v5). + * Supports both LaTeX 2.09 and LaTeX2e. + * Flexible output handling. Has some predefined formats and lets the + user specify his own format. Uses a ``printf()'' similar syntax. + ``lacheck'' compatible mode included for interfacing with the + AUC-TeX Emacs mode. + * ARexx scripts for interfacing with ScMsg and VBrowse are included. + Special scripts included for CygnusED/GoldED, for binding to + hotkey. + * Amiga Workbench support. Parameters may be passed by + shift-clicking the LaTeX files and setting the remaining options + in the tooltypes. + * Wildcard matching (Amiga only). Matches file patterns internally, + thus saving a lot of work. This is, however, platform-specific + code -- on UNIX boxes this is done by the shell. + * Written in ANSI C. ``configure'' script included for easy setup + and installation on UNIX systems. + + Still, it is important to realize that the output from ChkTeX is only + intended as a _guide_ to fixing faults. However, it is by no means + always correct. This means that correct LaTeX code may produce errors + in ChkTeX, and vice versa: Incorrect LaTeX code may pass silently + through. + + Legal stuff + + ChkTeX, documentation, installations scripts, CWEB filters and other + materials provided are copyright © 1995-96 Jens T. Berger Thielemann, + unless explicitly stated otherwise. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at + your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to: + + The Free Software Foundation, Inc. + 675 Mass Ave + Cambridge + MA 02139 + USA + +Registration + + `ChkTeX' is made available under the concept of Gift-Ware, which is a + variant of Share-Ware. Share-Ware software authors often release + `crippled' versions of their products, i.e. these programs do not + support the same functionality as the registered versions you get when + sending monetary contributions to the authors. It all comes down to + `pay for the software you are using' in Share-Ware terms. With + Gift-Ware registration it is different, you are not required to + contribute money, but a gift will do. With `ChkTeX' you always get a + fully functional program, there is no `crippled' test release which + you can try for a limited time and then have to pay for in order to + receive the working registered version. + + It may seem as if `ChkTeX' was free, but this is not the case. + Although there is no need to pay the author in order to get a fully + functional version of the program you should consider making a + contribution. You don't need to feel guilty if you cannot or do not + want to give me something in return for the work I have put into + `ChkTeX'. Show me that it was worth spending so much time listening to + users, updating, rewriting and enhancing this program. Your + contributions will provide the motivation for me to keep developing + the program. + + Send your contribution to the following address: + + Jens Berger + Spektrumvn. 4 + N-0666 Oslo + Norway + + Availability + + This program will be uploaded to AmiNet and CTAN; thus it can be found + at any mirrors of those. + + Please note that earlier versions of ChkTeX have been uploaded to + Aminet under the same archive name, to keep consistent with Aminet's + policy of keeping versions out of filenames. Please read the file + ``ChkTeX.readme'' (which is in the same directory as the archive) to + find out the version number. + + I'm now uploading the archive uncompressed to CTAN; however, most of + the ftpservers in that network allow you to retrieve a directory + compressed in whatever way you prefer. Aminet will as usual receive a + LhArc archive. + + Mirrors of both networks include: + +Comprehensive TeX Archive Network (CTAN) + + Directory: support/chktex + * ftp://ftp.adfa.oz.au/pub/tex/ctan/, (Australia) + * ftp://ftp.cs.rmit.edu.au/tex-archive/, (Australia) + * ftp://gw.pacbell.com/mirror/ftp.shsu.edu/tex-archive/, + (California, USA) + * ftp://sunsite.queensu.ca/pub/tex-archive/, (Canada) + * ftp://ftp.dante.de/pub/tex/, (Deutschland) + * ftp://ftp.germany.eu.net/pub/packages/TeX/, (Deutschland) + * ftp://ftp.gwdg.de/pub/dante/, (Deutschland) + * ftp://ftp.tex.ac.uk/pub/tex /, (England) + * ftp://src.doc.ic.ac.uk/packages/tex/uk-tex/, (England) + * ftp://kadri.ut.ee/pub/tex/, (Estonia) + * ftp://ftp.funet.fi/pub/TeX/CTAN/, (Finland) + * ftp://ftp.jussieu.fr/pub4/TeX/CTAN/, (France) + * ftp://ftp.loria.fr/pub/unix/tex/ctan/, (France) + * ftp://ftp.comp.hkbu.edu.hk/pub/TeX/CTAN/, (Hong Kong) + * ftp://ftp.unina.it/pub/TeX/, (Italia) + * ftp://sunsite.dsi.unimi.it/pub/TeX/, (Italia) + * ftp://ftp.riken.go.jp/pub/tex-archive/, (Japan) + * ftp://wuarchive.wustl.edu/packages/TeX/, (Missouri, USA) + * ftp://ftp.rge.com/pub/tex/, (New York, USA) + * ftp://ftp.duke.edu/tex-archive/, (North Carolina, USA) + * ftp://sunsite.unc.edu/pub/packages/TeX/, (North Carolina, USA) + * ftp://sunsite.icm.edu.pl/pub/CTAN/, (Poland) + * ftp://ftpserver.nus.sg/pub/zi/TeX/, (Singapore) + * ftp://ftp.ee.up.ac.za/tex-archive/, (South Africa) + * ftp://nic.switch.ch/mirror/tex/, (Switzerland) + * ftp://dongpo.math.ncu.edu.tw/tex-archive/, (Taiwan) + * ftp://ftp.ccu.edu.tw/pub/tex/, (Taiwan) + * ftp://ftp.fcu.edu.tw/pub2/tex/, (Taiwan) + * ftp://ftp.shsu.edu/pub/tex/, (Texas, USA) + * ftp://ftp.muni.cz/pub/tex/CTAN/, (The Czech Republic) + * ftp://ftp.cs.ruu.nl/pub/tex-archive/, (The Netherlands) + * ftp://ftp.uu.net/pub/text-processing/TeX/, (Virginia, USA) + * ftp://ftp.cdrom.com/pub/tex/ctan/, (West coast, USA) + * ftp://ftp.univie.ac.at/packages/tex/, (\"Osterreich) + +Aminet + + I'm only uploading the Amiga version of the archive to Aminet (so that + unsuspecting Amiga users won't have to download hundreds of unwanted + kilobytes). If you wish to use ChkTeX on another machine, please refer + to CTAN. + + Directory: text/tex/, filename: chktex.lha + * ftp://ftp.wustl.edu/pub/aminet/text/tex/, (USA (MO)) + * ftp://ftp.netnet.net/pub/aminet/text/tex/, (USA (WI)) + * ftp://ftp.ninemoons.com/pub/aminet/text/tex/, (USA (AZ)) + * ftp://ftp.livewire.com.au/pub/aminet/text/tex/, (Australia) + * ftp://ftp.tas.gov.au/pub/aminet/text/tex/, (Australia) + * ftp://ftp.luth.se/pub/aminet/text/tex/, (Scandinavia) + * ftp://ftp.eunet.ch/pub/aminet/text/tex/, (Switzerland) + * ftp://ftp.germany.aminet.org/pub/aminet/text/tex/, (Germany) + * ftp://ftp.pb.aminet.org/pub/aminet/text/tex/, (Germany) + * ftp://ftp.uni-stuttgart.de/pub/aminet/text/tex/, (Germany) + * ftp://ftp.uni-erlangen.de/pub/aminet/text/tex/, (Germany) + * ftp://ftp.cs.tu-berlin.de/pub/aminet/text/tex/, (Germany) + * ftp://ftp.tu-chemnitz.de/pub/aminet/text/tex/, (Germany) + * ftp://ftp.fh-augsburg.de/pub/aminet/text/tex/, (Germany) + * ftp://ftp.uni-bremen.de/pub/aminet/text/tex/, (Germany) + * ftp://ftp.uni-kl.de/pub/aminet/text/tex/, (Germany) + * ftp://ftp.uni-trier.de/pub/aminet/text/tex/, (Germany) + * ftp://ftp.informatik.rwth-aachen.de/pub/aminet/text/tex/, + (Germany) + * ftp://ftp.uni-siegen.de/pub/aminet/text/tex/, (Germany) + * ftp://ftp.uni-regensburg.de/pub/aminet/text/tex/, (Germany) + * ftp://sunsite.cnam.fr/pub/aminet/text/tex/, (France) + * ftp://aminet.grolier.fr/pub/aminet/text/tex/, (France) + * ftp://ftp.giga.or.at/pub/aminet/text/tex/, (Austria) + * ftp://sunsite.auc.dk/pub/aminet/text/tex/, (Denmark) + * ftp://ftp.acropolis.gr/pub/aminet/text/tex/, (Greece) + * ftp://aminet.iit.uni-miskolc.hu/pub/aminet/text/tex/, + (Hungary) + * ftp://ftp.italy.aminet.org/pub/aminet/text/tex/, (Italy) + * ftp://ftp.man.szczecin.pl/pub/aminet/text/tex/, (Poland) + * ftp://ftp.portugal.aminet.org/pub/aminet/text/tex/, (Portugal) + * ftp://ftp.gui.uva.es/pub/aminet/text/tex/, (Spain) + * ftp://ftp.uk.aminet.org/pub/aminet/text/tex/, (UK) + * ftp://micros.hensa.ac.uk/pub/aminet/text/tex/, (UK) + + Installation + + A few words on installation on various platforms: + + _Amiga:_ + Use the supplied Installer script. + + _MS-DOS & OS/2:_ + Copy the binary (``ChkTeX.exe'') to somewhere in your path, and + place the ``chktexrc'' file in the same directory. + + If you're running Emacs, you may wish to copy the file + ``chktex.el'' to your elisp source directory, and add the + following line to your ``.emacs'' file: + +(require 'chktex) + + _UNIX:_ + Type ``configure'', ``make'' and finally ``make install''. To + make sure everything proceeded correctly, type ``make check''. + If you don't have superuser privileges and thus access to the + default system areas, you should type ``configure -help'' to + help you set up correct paths. + + If you haven't installed any software like this before, that is + distributed in source form, here are some guidelines to help + you install it locally at your account. Please note that a mail + to the system administrator may be less work for you. :-) + + We assume that you have put the archive (``chktex.tar.gz'') in + a subdir of yours, with path ``~/tmp''. We further assume that + your shell is ``csh'' or ``tcsh''. Do the following: + + 1. First of all, unpack the archive contents. +> cd ~/tmp +> gunzip chktex.tar.gz +> tar xf chktex.tar + 2. Now, we can configure the program. There are some + configuration options you should know about: + + _``-enable-emacs-hack'':_ + Install a small file which adds ChkTeX to the + command menu of AUC-TeX. This is to be considered + as a hack, and may break in future versions of + AUC-TeX. It works fine under AUC-TeX v2.9, though. + + This option needs the path of your elisp directory + as argument, e.g. + ``-enable-emacs-hack=/home/myself/elisp'' or + similar. + + You'll also have to add the following line to your + ``.emacs'' file: + +(require 'chktex) + + You can now access ChkTeX from the ``Command'' menu in + AUC-TeX. To cycle through the messages, type C-x `. + + _``-enable-lacheck-replace''_ + This enables a quick hack for making the AUC-TeX + Emacs mode use ChkTeX instead of lacheck. This is + done by installing a stub script which + ``overrides'' the original lacheck executable. + + While more stable than the previous solution, this + is also significantly less elegant -- in computing + terms, this is the ``brute force'' approach. + + _``-enable-debug-info''_ + ChkTeX has an ability to spit out various + diagnostic messages using the ``-d'' flag. This + behaviour is on by default. By adding the flag + ``-disable-debug-info'' to the commandline, this + will not be compiled in. + + This may be useful if you're running short of disk + space (the time savings are neglible). + + If you are installing the program on your local account, use + the following command: +> configure --prefix ~/ + Add eventual extra flags as specified above. This command + will generate a significant amount of output, this can + usually be ignored. + 3. Finally, we can just build the program and install it. +> make +> make install + 4. Finished! The program is now installed and ready to use. You + may now tell other people to put your bindir in their path in + order to benefit from your work. All that remains is to make + the shell aware of your installation. +> rehash + To make the remaining parts of your system aware of this, + you'll have to log out and re-log in, I'm afraid. However, + you should delay this until you've completed this + installation procedure. + 5. If you wish to make sure that everything is OK (you ought + to), you may now ask ChkTeX to do a self-test: +> make check + + _Other platforms:_ + First of all, you have to copy the ``config.h.in'' file to a + file named ``config.h''. Then, edit it to reflect your system. + Do the same with ``OpSys.h'' (this file has been reduced + significantly). If you wish, you may define ``DATADIR'' to the + path you want the global resource file to be put. + + Now, I would suggest that you take a peak at the ``OpSys.c'' + file, and edit it appropiately, for more comfort. This should + not be necessary, though, at least not the first time. + + Finally, you may now compile and link all .cfiles. Define + ``HAVE_CONFIG_H'' to 1 (on the command-line, for instance). If + the ``config.h'' you wish to use has another name, define + ``CONFIG_H_NAME'' to that (in that case, don't define + ``HAVE_CONFIG_H''). + + Put the directory path of the ``chktexrc'' file in a + environment variable named ``CHKTEXRC''. The files ``deweb.in'' + and ``chkweb'' should be moved to a directory in your path. + These files may need further setup, as they haven't got the + location of perl initialized. + + If your compiler/the compiled program complains (or crashes!), + you may try the hints listed below. Please note that it only + makes sense to try these hints if your compiler fails to + produce a working program. + + 1. Increase the preprocessor buffers and line buffers. The + ChkTeX sources define macros sized 3-4k (expanding to about + the same), and passes arguments sized about 1k. + 2. Use the magic switch which lets us use large + ``switch(...){...}'' statements; some of these statements + have about 120 ``case'' entries. + 3. The sources require that at least the first 12 of each + identifier is significant. + + _Note:_ You _must_ install the new ``chktexrc'' file; ChkTeX will fail + to function unless! + + After doing this, you may enhance ChkTeX' behaviour by reading/editing + the ``chktexrc'' file. + + Contacting the author + + If you wish to contact me for any reason or would like to participate + in the development of ChkTeX, please write to: + + Jens Berger + Spektrumvn. 4 + N-0666 Oslo + Norway + E-mail: <jensthi@ifi.uio.no> + + Any signs of intelligent life are welcomed; that should exclude + piracy. + + Have fun. + diff --git a/Build/source/texk/chktex/ChkTeX.tex b/Build/source/texk/chktex/ChkTeX.tex new file mode 100644 index 00000000000..1c80942b5af --- /dev/null +++ b/Build/source/texk/chktex/ChkTeX.tex @@ -0,0 +1,2111 @@ +%% +%% ChkTeX v1.5, LaTeX documentation for ChkTeX program. +%% Copyright (C) 1995-96 Jens T. Berger Thielemann +%% +%% This program is free software; you can redistribute it and/or modify +%% it under the terms of the GNU General Public License as published by +%% the Free Software Foundation; either version 2 of the License, or +%% (at your option) any later version. +%% +%% This program is distributed in the hope that it will be useful, +%% but WITHOUT ANY WARRANTY; without even the implied warranty of +%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +%% GNU General Public License for more details. +%% +%% You should have received a copy of the GNU General Public License +%% along with this program; if not, write to the Free Software +%% Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +%% +%% Contact the author at: +%% Jens Berger +%% Spektrumvn. 4 +%% N-0666 Oslo +%% Norway +%% E-mail: <jensthi@ifi.uio.no> +%% +%% NOTE: This file is written in LaTeX, and should be compiled +%% before viewing. If you don't know how to do this, consult +%% your local TeX guru. If you don't possess LaTeX, you are +%% assumed to not need this program; so there's no text version +%% of this file... +%% +%% You may still be able to view the DVI or PostScript versions of +%% this file, though, they are included in the archive. +%% + + + +%\documentstyle[a4, array, tabularx, verbatim, multicol]{article} +\documentclass[a4paper]{article} +\usepackage{ array, tabularx, verbatim, multicol} +%latex +\nonfrenchspacing +\newcounter{errornum} +\setcounter{errornum}{1} +%endlatex +\newcommand{\jtbt}{Jens~T. Berger~Thielemann} +\newcommand{\Cmd}[1]{``{\tt{}#1}''} +\newcommand{\rsrc}{``{\tt{}chktexrc}''} +\newcommand{\chktex}{Chk\TeX} +\newcommand{\smiley}{:-)} + +%latex +\newcolumntype{Y}{>{\raggedright\arraybackslash}X} +\newcommand{\fmted}[1]{% + {\noindent\large% + \begin{tabularx}{\linewidth}{lY}% + \bf Warning \theerrornum: & \tt #1% + \end{tabularx}}\stepcounter{errornum}\nopagebreak[4]} + +\newenvironment{errdesc}[1]{\noindent\fmted{#1}\begin{quote}}{\end{quote}% +\pagebreak[3]} + +\newenvironment{html}{\comment}{\endcomment} +\newenvironment{rawhtml}{\comment}{\endcomment} + +\makeatletter +\@namedef{errdesc*}#1{\begin{errdesc}{\textit{#1}}} +\@namedef{enderrdesc*}{\end{errdesc}} +\@ifundefined{textit}{\gdef\textit#1{{\it #1}}}\relax +\@ifundefined{LaTeXe}{\gdef\LaTeXe{\LaTeX2${}_{\textstyle\varepsilon}$}}\relax +\makeatother + + +\newenvironment{errexam} +{ +\vskip 0pt plus 5pt +\begin{center} +} +{\end{center}} +\columnseprule 0.1pt + +%!\newcommand{\LaTeXe}{\LaTeX 2e} +%!\newcommand{\BS}{\verb@\@} +%!\newcommand{\chktex}{ChkTeX} +%!\newcommand{\slash}{/} +%endlatex + + +\title{\chktex\ v1.5} +\author{Jens~T. Berger~Thielemann} +\date{\today} + + +\begin{document} +\maketitle + +%latex +\newcommand{\BS}{\char`\\} +%endlatex +\section{Introduction} + +This program has been written in frustration because some constructs in +\LaTeX\ are sometimes non-intuitive, and easy to forget. It is {\em + not\/} a replacement for the built-in checker in \LaTeX\@; however it +catches some typographic errors \LaTeX\ oversees. In other words, it +is Lint for \LaTeX. Filters are also provided for checking the +\LaTeX\ parts of CWEB documents. + +It is written in ANSI C and compiles silently under GCC using +\Cmd{-Wall -ansi -pedantic} and almost all warning flags. This means +that you can compile \& use the program on your favorite machine. +Full source included. + +The program also supports output formats suitable for further +processing by editors or other programs, making errors easy to cycle through. +Software is provided for beautifully interfacing against the +AUC-\TeX\ Emacs mode, CygnusED, GoldEd and various Amiga message browsers. + +The program itself does not have any machine requirements; Amiga, +MSDOS and OS/2 binaries are available. Of course, you'll need ARexx +and ScMsg or VBrowse to benefit from the ARexx scripts. + + + +\section{Features} +\chktex\ begins to get quite a few bells \& whistles now. However, you +should be aware of that in most cases, all this is transparent to the user. +As you will see, \chktex\ offers the ability to adapt to many environments +and configurations. + +\subsection{New features} +Modifications and additions since v1.4: + + +\subsubsection{Program} + +Modifications to the executable itself: +\begin{itemize} +\item As usual, a few more warnings: + \begin{itemize} + \item No space or similar in front/after parenthesis. + \item Demands a consistent quote style. + \item Double spaces in input which will not be rendered as one. + \item Punctuation malplaced regarding to math mode. + \item Warns about \TeX\ primitives. + \item Space in front of footnotes. + \item Bogus {\tt\BS{}left} and {\tt\BS{}right} commands. + \end{itemize} + +\item The abbreviation recognizer has (for the last time?) been + redesigned. We now produce far less false warnings, catch more + cases and do all this faster than before. Seems like a win. + + Done much of the same with the italic correction detection part, + too\ldots +\item Some bugs have been silently fixed. Hot spots in the program + have been optimized; in certain cases this in fact doubles the + speed! + + Along with this goes more code elegance and utilization of macro + processing and the C language. Take a look at \Cmd{Resource.[ch]}. + +\item It's possible to specify separate output-formats depending on + whether you are sending the output to a file/pipe or to a + terminal. + +\item Column positions are finally correct; we now expand tabs + correctly. +\item \chktex\ will now recursively search for {\tt\BS{}input}'ed + files, both in the document and on the commandline. See the + \rsrc\ file for more info. +\item The debug switch is now more intelligent; if you wish to hack + a bit on \chktex\ for yourself, it is possible to produce + selective debugging output. The feature can also be disabled + altogether. +\item MS-DOS and OS/2 version of the program is now more flexible + and well-behaved, thanks to Gerd B\"ohm. +\item You may now say \Cmd{-wall} to make all messages warnings, and + turn them on. +\item Uses termcap on UNIX boxes; this should ensure that \Cmd{-v2} + (or more precisely: \Cmd{\%i} and \Cmd{\%I}) works regardless to + what terminal you are using. +\end{itemize} + +\subsubsection{Resource file} + +New concepts introduced in the setup file: +\begin{itemize} +\item You may now specify both case-sensitive and case-insensitive + user patterns in the \rsrc\ file. In addition; it is now possible + to reset/clear lists. +\item It is possible to specify how many arguments + (optional/required) \Cmd{WIPEARG} should wipe; it behaves also + somewhat more intelligent when the arguments stretch over multiple + lines. +\item Global files will be read {\em in addition\/} to local ones. The + searching order has also been reversed in order to make this more + intelligent. +\end{itemize} + + +\subsubsection{Other} +Various other stuff I've done to the product: + +\begin{itemize} +\item The documentation has been polished and should now be easier + to use in practical situations. +\item \Cmd{check} target in \Cmd{Makefile}, so you can check that + the installation succeeded. In fact, the \Cmd{Makefile} has been + enhanced in several other ways too, amongst other it is now GNU + conforming. +\item \Cmd{deweb} is now documented; you may say \Cmd{man~deweb} to + get a few words of advice. The support script ({\tt chkweb}) does + now behave as the remaining package (accepting stdin input and flags). +\item I've written an Emacs hack which magically adds \chktex\ to the + list of AUC-\TeX\ commands; thus making the use of the program even + more trivial. + + For those of you who don't wish to mess with Emacs, I've included a trivial +%latex + $\mbox{lacheck}\leftrightarrow\mbox{\chktex}$ +%!lacheck <-> \chktex\ % +%endlatex + interface. + + This means that you now can use \chktex\ just as easily as lacheck + when you're running AUC-\TeX. + +\item Added an ARexx script which lets \chktex\ talk to VBrowse, the + message browser of Volker Barthelmann's freely distributable ANSI + C compiler. The browser itself is available on Aminet as + \Cmd{dev/c/vbcc.lha}. +\end{itemize} + +\subsection{Feature list} + +\begin{itemize} +\item Supports over 40 warnings. Warnings include: +%latex + \begin{multicols}{2} + \begin{flushleft} +%endlatex + \begin{itemize} + \item Commands terminated with space. Ignores \Cmd{\BS{}tt}, etc. + \item Space in front of references instead of \Cmd{\~{}}. + \item Forgetting to group parenthesis characters when + sub-\slash{}super\-scripting. + \item Italic correction (\Cmd{\BS/}) mistakes (double, + missing, unnecessary). + \item Parenthesis and environment matching. + \item Ellipsis detection; also checks whether to use + \Cmd{\BS{}dots}, \Cmd{\BS{}cdots} or \Cmd{\BS{}ldots}. + \item Enforcement of normal space after abbreviation. Detects + most abbreviations automagically. + \item Enforcement of end-of-sentence space when the last + sentence ended with capital letter. + \item Math-mode on/off detection. + \item Quote checking, both wrong types (\Cmd{"}) and wrong + direction. + \item Recommends splitting three quotes in a row. + \item Searching for user patterns. + \item Displays comments. + \item Space in front of \Cmd{\BS{}label} and similar commands. + \item Use of \Cmd{x} instead of \Cmd{\$\BS{}times\$} between numbers. + \item Multiple spaces in input which will be rendered as one + space (or multiple spaces, where that is undesirable). + \item Warns about text which may be ignored. + \item Mathematical operators typeset as variables. + \item No space in front of/after parenthesis. + \item Demands a consistent quote style. + \item Punctuation inside inner math mode/outside display math + mode. + \item Use of \TeX\ primitives where \LaTeX\ equivalents are + available. + \item Space in front of footnotes. + \item Bogus characters following commands. + \end{itemize} +%latex + \end{flushleft} + \end{multicols} +%endlatex +\item Fully customizable. Intelligent resource format makes it + possible to make \chktex\ respect your \LaTeX\ setup. Even + command-line options may be specified globally in the \rsrc\ file. +\item Supports \Cmd{\BS{}input} command; both \TeX\ and \LaTeX\ version. + Actually includes the files. \Cmd{TEXINPUTS}-equivalent search path. +\item Intelligent warning/error handling. The user may promote/mute + warnings to suit his preferences. You may also mute warnings in the + header of a file; thus killing much unwanted garbage. +\item Scripts included for checking CWEB files written in \LaTeX. + (Requires perl v5). +\item Supports both \LaTeX\ 2.09 and \LaTeXe. +\item Flexible output handling. Has some predefined formats and lets + the user specify his own format. Uses a \Cmd{printf()} similar + syntax. \Cmd{lacheck} compatible mode included for interfacing with + the AUC-\TeX\ Emacs mode. +\item ARexx scripts for interfacing with ScMsg and VBrowse are + included. Special scripts included for CygnusED/GoldED, for binding + to hotkey. +\item Amiga Workbench support. Parameters may be passed by + shift-clicking the \LaTeX\ files and setting the remaining options + in the tooltypes. +\item Wildcard matching (Amiga only). Matches file patterns + internally, thus saving a lot of work. This is, however, + platform-specific code --- on UNIX boxes this is done by the shell. +\item Written in ANSI C\@. \Cmd{configure} script included for easy + setup and installation on UNIX systems. +\end{itemize} + +Still, it is important to realize that the output from \chktex\ is +only intended as a {\em guide\/} to fixing faults. However, it is by +no means always correct. This means that correct \LaTeX\ code may +produce errors in \chktex, and vice versa: Incorrect \LaTeX\ code may pass +silently through. + + + +\section{Legal stuff} + +\chktex{}, documentation, installations scripts, CWEB filters and other +materials provided are copyright \copyright\ 1995--96 Jens~T. +Berger~Thielemann, unless explicitly stated otherwise. + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2 of the License, or (at your option) +any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY\@; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE\@. See the GNU General Public License for +more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to: +\begin{quote} + The Free Software Foundation, Inc. \\ + 675 Mass Ave \\ + Cambridge \\ + MA 02139 \\ + USA +\end{quote} + + + + +\subsection{Registration} + +`\chktex' is made available under the concept of Gift-Ware, which is a +variant of Share-Ware. Share-Ware software authors often release +`crippled' versions of their products, i.e.\ these programs do not +support the same functionality as the registered versions you get when +sending monetary contributions to the authors. It all comes down to +`pay for the software you are using' in Share-Ware terms. With +Gift-Ware registration it is different, you are not required to +contribute money, but a gift will do. With `\chktex' you always get a +fully functional program, there is no `crippled' test release which +you can try for a limited time and then have to pay for in order to +receive the working registered version. + +It may seem as if `\chktex' was free, but this is not the case. +Although there is no need to pay the author in order to get a fully +functional version of the program you should consider making a +contribution. You don't need to feel guilty if you cannot or do not +want to give me something in return for the work I have put into +`\chktex'. Show me that it was worth spending so much time listening +to users, updating, rewriting and enhancing this program. Your +contributions will provide the motivation for me to keep developing +the program. + +Send your contribution to the following address: +%latex +\begin{samepage} +%endlatex +\begin{quote} + Jens Berger \\ + Spektrumvn. 4 \\ + N-0666 Oslo \\ + Norway +\end{quote} +%latex +\end{samepage} +%endlatex + +\begin{html} +\section{Availability} + +This program will be uploaded to AmiNet and CTAN\@; thus it can be +found at any mirrors of those. + +Please note that earlier versions of \chktex\ have been uploaded to +Aminet under the same archive name, to keep consistent with Aminet's +policy of keeping versions out of filenames. Please read the file +\Cmd{ChkTeX.readme} (which is in the same directory as the archive) to +find out the version number. + +I'm now uploading the archive uncompressed to CTAN\@; however, most of +the ftpservers in that network allow you to retrieve a directory +compressed in whatever way you prefer. Aminet will as usual receive a +LhArc archive. + +Mirrors of both networks include: + + \subsection{Comprehensive \TeX\ Archive Network (CTAN)} +\end{html} + +\begin{rawhtml} + Directory: <tt> support/chktex</tt> + <ul> +<li> <a href="ftp://ftp.adfa.oz.au/pub/tex/ctan/support/chktex/"> + ftp://ftp.adfa.oz.au/pub/tex/ctan/</a>, (Australia) + +<li> <a href="ftp://ftp.cs.rmit.edu.au/tex-archive/support/chktex/"> + ftp://ftp.cs.rmit.edu.au/tex-archive/</a>, (Australia) + +<li> <a href="ftp://gw.pacbell.com/mirror/ftp.shsu.edu/tex-archive/support/chktex/"> + ftp://gw.pacbell.com/mirror/ftp.shsu.edu/tex-archive/</a>, (California, USA) + +<li> <a href="ftp://sunsite.queensu.ca/pub/tex-archive/support/chktex/"> + ftp://sunsite.queensu.ca/pub/tex-archive/</a>, (Canada) + +<li> <a href="ftp://ftp.dante.de/pub/tex/support/chktex/"> + ftp://ftp.dante.de/pub/tex/</a>, (Deutschland) + +<li> <a href="ftp://ftp.germany.eu.net/pub/packages/TeX/support/chktex/"> + ftp://ftp.germany.eu.net/pub/packages/TeX/</a>, (Deutschland) + +<li> <a href="ftp://ftp.gwdg.de/pub/dante/support/chktex/"> + ftp://ftp.gwdg.de/pub/dante/</a>, (Deutschland) + +<li> <a href="ftp://ftp.tex.ac.uk/pub/tex /support/chktex/"> + ftp://ftp.tex.ac.uk/pub/tex /</a>, (England) + +<li> <a href="ftp://src.doc.ic.ac.uk/packages/tex/uk-tex/support/chktex/"> + ftp://src.doc.ic.ac.uk/packages/tex/uk-tex/</a>, (England) + +<li> <a href="ftp://kadri.ut.ee/pub/tex/support/chktex/"> + ftp://kadri.ut.ee/pub/tex/</a>, (Estonia) + +<li> <a href="ftp://ftp.funet.fi/pub/TeX/CTAN/support/chktex/"> + ftp://ftp.funet.fi/pub/TeX/CTAN/</a>, (Finland) + +<li> <a href="ftp://ftp.jussieu.fr/pub4/TeX/CTAN/support/chktex/"> + ftp://ftp.jussieu.fr/pub4/TeX/CTAN/</a>, (France) + +<li> <a href="ftp://ftp.loria.fr/pub/unix/tex/ctan/support/chktex/"> + ftp://ftp.loria.fr/pub/unix/tex/ctan/</a>, (France) + +<li> <a href="ftp://ftp.comp.hkbu.edu.hk/pub/TeX/CTAN/support/chktex/"> + ftp://ftp.comp.hkbu.edu.hk/pub/TeX/CTAN/</a>, (Hong Kong) + +<li> <a href="ftp://ftp.unina.it/pub/TeX/support/chktex/"> + ftp://ftp.unina.it/pub/TeX/</a>, (Italia) + +<li> <a href="ftp://sunsite.dsi.unimi.it/pub/TeX/support/chktex/"> + ftp://sunsite.dsi.unimi.it/pub/TeX/</a>, (Italia) + +<li> <a href="ftp://ftp.riken.go.jp/pub/tex-archive/support/chktex/"> + ftp://ftp.riken.go.jp/pub/tex-archive/</a>, (Japan) + +<li> <a href="ftp://wuarchive.wustl.edu/packages/TeX/support/chktex/"> + ftp://wuarchive.wustl.edu/packages/TeX/</a>, (Missouri, USA) + +<li> <a href="ftp://ftp.rge.com/pub/tex/support/chktex/"> + ftp://ftp.rge.com/pub/tex/</a>, (New York, USA) + +<li> <a href="ftp://ftp.duke.edu/tex-archive/support/chktex/"> + ftp://ftp.duke.edu/tex-archive/</a>, (North Carolina, USA) + +<li> <a href="ftp://sunsite.unc.edu/pub/packages/TeX/support/chktex/"> + ftp://sunsite.unc.edu/pub/packages/TeX/</a>, (North Carolina, USA) + +<li> <a href="ftp://sunsite.icm.edu.pl/pub/CTAN/support/chktex/"> + ftp://sunsite.icm.edu.pl/pub/CTAN/</a>, (Poland) + +<li> <a href="ftp://ftpserver.nus.sg/pub/zi/TeX/support/chktex/"> + ftp://ftpserver.nus.sg/pub/zi/TeX/</a>, (Singapore) + +<li> <a href="ftp://ftp.ee.up.ac.za/tex-archive/support/chktex/"> + ftp://ftp.ee.up.ac.za/tex-archive/</a>, (South Africa) + +<li> <a href="ftp://nic.switch.ch/mirror/tex/support/chktex/"> + ftp://nic.switch.ch/mirror/tex/</a>, (Switzerland) + +<li> <a href="ftp://dongpo.math.ncu.edu.tw/tex-archive/support/chktex/"> + ftp://dongpo.math.ncu.edu.tw/tex-archive/</a>, (Taiwan) + +<li> <a href="ftp://ftp.ccu.edu.tw/pub/tex/support/chktex/"> + ftp://ftp.ccu.edu.tw/pub/tex/</a>, (Taiwan) + +<li> <a href="ftp://ftp.fcu.edu.tw/pub2/tex/support/chktex/"> + ftp://ftp.fcu.edu.tw/pub2/tex/</a>, (Taiwan) + +<li> <a href="ftp://ftp.shsu.edu/pub/tex/support/chktex/"> + ftp://ftp.shsu.edu/pub/tex/</a>, (Texas, USA) + +<li> <a href="ftp://ftp.muni.cz/pub/tex/CTAN/support/chktex/"> + ftp://ftp.muni.cz/pub/tex/CTAN/</a>, (The Czech Republic) + +<li> <a href="ftp://ftp.cs.ruu.nl/pub/tex-archive/support/chktex/"> + ftp://ftp.cs.ruu.nl/pub/tex-archive/</a>, (The Netherlands) + +<li> <a href="ftp://ftp.uu.net/pub/text-processing/TeX/support/chktex/"> + ftp://ftp.uu.net/pub/text-processing/TeX/</a>, (Virginia, USA) + +<li> <a href="ftp://ftp.cdrom.com/pub/tex/ctan/support/chktex/"> + ftp://ftp.cdrom.com/pub/tex/ctan/</a>, (West coast, USA) + +<li> <a href="ftp://ftp.univie.ac.at/packages/tex/support/chktex/"> + ftp://ftp.univie.ac.at/packages/tex/</a>, (\"Osterreich) + + + </ul> +\end{rawhtml} + +\begin{html} +\subsection{Aminet} +\end{html} +\begin{rawhtml} + I'm only uploading the Amiga version of the archive to Aminet (so + that unsuspecting Amiga users won't have to download hundreds of + unwanted kilobytes). If you wish to use ChkTeX on another machine, + please refer to CTAN. + + <p> Directory: <tt> text/tex/</tt>, filename: <tt>chktex.lha</tt> + <ul> +<li> <a href="ftp://ftp.wustl.edu/pub/aminet/text/tex/chktex.lha"> + ftp://ftp.wustl.edu/pub/aminet/text/tex/</a>, (USA (MO)) + +<li> <a href="ftp://ftp.netnet.net/pub/aminet/text/tex/chktex.lha"> + ftp://ftp.netnet.net/pub/aminet/text/tex/</a>, (USA (WI)) + +<li> <a href="ftp://ftp.ninemoons.com/pub/aminet/text/tex/chktex.lha"> + ftp://ftp.ninemoons.com/pub/aminet/text/tex/</a>, (USA (AZ)) + +<li> <a href="ftp://ftp.livewire.com.au/pub/aminet/text/tex/chktex.lha"> + ftp://ftp.livewire.com.au/pub/aminet/text/tex/</a>, (Australia) + +<li> <a href="ftp://ftp.tas.gov.au/pub/aminet/text/tex/chktex.lha"> + ftp://ftp.tas.gov.au/pub/aminet/text/tex/</a>, (Australia) + +<li> <a href="ftp://ftp.luth.se/pub/aminet/text/tex/chktex.lha"> + ftp://ftp.luth.se/pub/aminet/text/tex/</a>, (Scandinavia) + +<li> <a href="ftp://ftp.eunet.ch/pub/aminet/text/tex/chktex.lha"> + ftp://ftp.eunet.ch/pub/aminet/text/tex/</a>, (Switzerland) + +<li> <a href="ftp://ftp.germany.aminet.org/pub/aminet/text/tex/chktex.lha"> + ftp://ftp.germany.aminet.org/pub/aminet/text/tex/</a>, (Germany) + +<li> <a href="ftp://ftp.pb.aminet.org/pub/aminet/text/tex/chktex.lha"> + ftp://ftp.pb.aminet.org/pub/aminet/text/tex/</a>, (Germany) + +<li> <a href="ftp://ftp.uni-stuttgart.de/pub/aminet/text/tex/chktex.lha"> + ftp://ftp.uni-stuttgart.de/pub/aminet/text/tex/</a>, (Germany) + +<li> <a href="ftp://ftp.uni-erlangen.de/pub/aminet/text/tex/chktex.lha"> + ftp://ftp.uni-erlangen.de/pub/aminet/text/tex/</a>, (Germany) + +<li> <a href="ftp://ftp.cs.tu-berlin.de/pub/aminet/text/tex/chktex.lha"> + ftp://ftp.cs.tu-berlin.de/pub/aminet/text/tex/</a>, (Germany) + +<li> <a href="ftp://ftp.tu-chemnitz.de/pub/aminet/text/tex/chktex.lha"> + ftp://ftp.tu-chemnitz.de/pub/aminet/text/tex/</a>, (Germany) + +<li> <a href="ftp://ftp.fh-augsburg.de/pub/aminet/text/tex/chktex.lha"> + ftp://ftp.fh-augsburg.de/pub/aminet/text/tex/</a>, (Germany) + +<li> <a href="ftp://ftp.uni-bremen.de/pub/aminet/text/tex/chktex.lha"> + ftp://ftp.uni-bremen.de/pub/aminet/text/tex/</a>, (Germany) + +<li> <a href="ftp://ftp.uni-kl.de/pub/aminet/text/tex/chktex.lha"> + ftp://ftp.uni-kl.de/pub/aminet/text/tex/</a>, (Germany) + +<li> <a href="ftp://ftp.uni-trier.de/pub/aminet/text/tex/chktex.lha"> + ftp://ftp.uni-trier.de/pub/aminet/text/tex/</a>, (Germany) + +<li> <a href="ftp://ftp.informatik.rwth-aachen.de/pub/aminet/text/tex/chktex.lha"> + ftp://ftp.informatik.rwth-aachen.de/pub/aminet/text/tex/</a>, (Germany) + +<li> <a href="ftp://ftp.uni-siegen.de/pub/aminet/text/tex/chktex.lha"> + ftp://ftp.uni-siegen.de/pub/aminet/text/tex/</a>, (Germany) + +<li> <a href="ftp://ftp.uni-regensburg.de/pub/aminet/text/tex/chktex.lha"> + ftp://ftp.uni-regensburg.de/pub/aminet/text/tex/</a>, (Germany) + +<li> <a href="ftp://sunsite.cnam.fr/pub/aminet/text/tex/chktex.lha"> + ftp://sunsite.cnam.fr/pub/aminet/text/tex/</a>, (France) + +<li> <a href="ftp://aminet.grolier.fr/pub/aminet/text/tex/chktex.lha"> + ftp://aminet.grolier.fr/pub/aminet/text/tex/</a>, (France) + +<li> <a href="ftp://ftp.giga.or.at/pub/aminet/text/tex/chktex.lha"> + ftp://ftp.giga.or.at/pub/aminet/text/tex/</a>, (Austria) + +<li> <a href="ftp://sunsite.auc.dk/pub/aminet/text/tex/chktex.lha"> + ftp://sunsite.auc.dk/pub/aminet/text/tex/</a>, (Denmark) + +<li> <a href="ftp://ftp.acropolis.gr/pub/aminet/text/tex/chktex.lha"> + ftp://ftp.acropolis.gr/pub/aminet/text/tex/</a>, (Greece) + +<li> <a href="ftp://aminet.iit.uni-miskolc.hu/pub/aminet/text/tex/chktex.lha"> + ftp://aminet.iit.uni-miskolc.hu/pub/aminet/text/tex/</a>, (Hungary) + +<li> <a href="ftp://ftp.italy.aminet.org/pub/aminet/text/tex/chktex.lha"> + ftp://ftp.italy.aminet.org/pub/aminet/text/tex/</a>, (Italy) + +<li> <a href="ftp://ftp.man.szczecin.pl/pub/aminet/text/tex/chktex.lha"> + ftp://ftp.man.szczecin.pl/pub/aminet/text/tex/</a>, (Poland) + +<li> <a href="ftp://ftp.portugal.aminet.org/pub/aminet/text/tex/chktex.lha"> + ftp://ftp.portugal.aminet.org/pub/aminet/text/tex/</a>, (Portugal) + +<li> <a href="ftp://ftp.gui.uva.es/pub/aminet/text/tex/chktex.lha"> + ftp://ftp.gui.uva.es/pub/aminet/text/tex/</a>, (Spain) + +<li> <a href="ftp://ftp.uk.aminet.org/pub/aminet/text/tex/chktex.lha"> + ftp://ftp.uk.aminet.org/pub/aminet/text/tex/</a>, (UK) + +<li> <a href="ftp://micros.hensa.ac.uk/pub/aminet/text/tex/chktex.lha"> + ftp://micros.hensa.ac.uk/pub/aminet/text/tex/</a>, (UK) + + </ul> +\end{rawhtml} + +\section{Installation} + +A few words on installation on various platforms: + +\begin{description} +\item[Amiga:] Use the supplied Installer script. +\item[MS-DOS \& OS/2:] Copy the binary (\Cmd{ChkTeX.exe}) to somewhere in + your path, and place the \rsrc\ file in the same directory. + + If you're running Emacs, you may wish to copy the file \Cmd{chktex.el} + to your elisp source directory, and add the following line to your + \Cmd{.emacs} file: +\begin{verbatim} +(require 'chktex) +\end{verbatim} + +\item[UNIX:] Type \Cmd{configure}, \Cmd{make} and finally + \Cmd{make~install}. To make sure everything proceeded correctly, + type \Cmd{make~check}. If you don't have superuser privileges and thus + access to the default system areas, you should type + \Cmd{configure~--help} to help you set up correct paths. + + If you haven't installed any software like this before, that is + distributed in source form, here are some guidelines to help you + install it locally at your account. Please note that a mail to the + system administrator may be less work for you. \smiley + + We assume that you have put the archive (\Cmd{chktex.tar.gz}) in a + subdir of yours, with path \Cmd{\~{}/tmp}. We further assume that + your shell is \Cmd{csh} or \Cmd{tcsh}. Do the following: + + \begin{enumerate} + \item First of all, unpack the archive contents. + +\begin{verbatim} +> cd ~/tmp +> gunzip chktex.tar.gz +> tar xf chktex.tar +\end{verbatim} + + \item Now, we can configure the program. There are some + configuration options you should know about: + \begin{description} + \item[\Cmd{--enable-emacs-hack}:] Install a small file which + adds \chktex\ to the command menu of AUC-\TeX. This is to be + considered as a hack, and may break in future versions of + AUC-\TeX. It works fine under AUC-\TeX\ v2.9, though. + + This option needs the path of your elisp directory as argument, + e.g. \Cmd{--enable-emacs-hack=/home/myself/elisp} or similar. + + You'll also have to add the following line to your \Cmd{.emacs} + file: +\begin{verbatim} +(require 'chktex) +\end{verbatim} + You can now access \chktex\ from the \Cmd{Command} menu in + AUC-\TeX. To cycle through the messages, type \verb#C-x `#. + + \item[\Cmd{--enable-lacheck-replace}] This enables a quick + hack for making the AUC-\TeX\ Emacs mode use \chktex\ instead of + lacheck. This is done by installing a stub script which + ``overrides'' the original lacheck executable. + + While more stable than the previous solution, this is also + significantly less elegant --- in computing terms, this is the + ``brute force'' approach. + + \item[\Cmd{--enable-debug-info}] \chktex\ has an ability to spit + out various diagnostic messages using the \Cmd{-d} flag. This + behaviour is on by default. By adding the flag + \Cmd{--disable-debug-info} to the commandline, this will not be + compiled in. + + This may be useful if you're running short of disk space (the + time savings are neglible). + \end{description} + + If you are installing the program on your local account, use the + following command: + +\begin{verbatim} +> configure --prefix ~/ +\end{verbatim} + + Add eventual extra flags as specified above. This command will + generate a significant amount of output, this can usually be ignored. + + \item Finally, we can just build the program and install it. + +\begin{verbatim} +> make +> make install +\end{verbatim} + + \item Finished! The program is now installed and ready to use. You + may now tell other people to put your bindir in their path in + order to benefit from your work. All that remains is to make the + shell aware of your installation. + +\begin{verbatim} +> rehash +\end{verbatim} + + To make the remaining parts of your system aware of this, you'll + have to log out and re-log in, I'm afraid. However, you should delay this + until you've completed this installation procedure. + + \item If you wish to make sure that everything is OK (you ought to), + you may now ask \chktex\ to do a self-test: + +\begin{verbatim} +> make check +\end{verbatim} + + \end{enumerate} + +\item[Other platforms:] First of all, you have to copy the + \Cmd{config.h.in} file to a file named \Cmd{config.h}. Then, edit + it to reflect your system. Do the same with \Cmd{OpSys.h} (this + file has been reduced significantly). If you wish, you may define + \Cmd{DATADIR} to the path you want the global resource file to be + put. + + Now, I would suggest that you take a peak at the \Cmd{OpSys.c} + file, and edit it appropiately, for more + comfort. This should not be necessary, though, at least not the + first time. + + Finally, you may now compile and link all \verb@.c@ files. Define + \Cmd{HAVE\_CONFIG\_H} to 1 (on the command-line, for instance). If + the \Cmd{config.h} you wish to use has another name, define + \Cmd{CONFIG\_H\_NAME} to that (in that case, don't define + \Cmd{HAVE\_CONFIG\_H}). + + Put the directory path of the \rsrc\ file in a environment variable + named \Cmd{CHKTEXRC}. The files \Cmd{deweb.in} and \Cmd{chkweb} + should be moved to a directory in your path. These files may need + further setup, as they haven't got the location of perl + initialized. + + If your compiler/the compiled program complains (or crashes!), you + may try the hints listed below. Please note that it only makes + sense to try these hints if your compiler fails to produce a working + program. + + \begin{enumerate} + \item Increase the preprocessor buffers and line buffers. The + \chktex{} sources define macros sized 3--4k (expanding to about + the same), and passes arguments sized about 1k. + \item Use the magic switch which lets us use large + \Cmd{switch(\dots)\{\dots\}} statements; some of these statements + have about 120 \Cmd{case} entries. + \item The sources require that at least the first 12 of each + identifier is significant. + \end{enumerate} +\end{description} +{\bf Note:\/} You {\em must\/} install the new \rsrc\ file; \chktex\ will +fail to function unless! + + After doing this, you may enhance \chktex' behaviour by +reading/editing the \rsrc\ file. + +%latex +\section{Usage} + +\subsection{\chktex} + +Amiga v2.04+ users may wish to note that you may pass the files that +\chktex\ is to process by shift-clicking them. In addition, you may +specify the arguments as tooltypes to the main program icon, using the +{\sf Info} menu option. For instance, if you wish to make the `fancy' +output the default when starting from Workbench, enter the following +as a tooltype: +% +\begin{verbatim} +Verbosity=2 +\end{verbatim} +% +We use the WB2Argv package (also developed by me, available on Aminet as +\Cmd{dev/c/WB2Argv.lha}), and +will fold case until the \Cmd{=} character, in tradition with the +case-insensitivity of Amiga OS\@. In all other respects (and platforms), the +options listed below are case-sensitive. + + + +\subsubsection{Synopsis} + +A UNIX-compliant template format follows: + +\newcommand{\Group}[1]{\mbox{[#1]}} +\begin{tabularx}\textwidth{lY} + \tt chktex & \tt \Group{-hiqrW} \Group{-v[0-\dots]} \Group{-l + <rcfile>} \Group{-[wemn] <[1-42]|all>} \Group{-d[0-...]} \Group{-p + <pseudoname>} \Group{-o <outputfile>} \Group{-[btxgI][0|1]} + file1 file2 \dots +\end{tabularx} + + +\subsubsection{Options} + +These are the options \chktex\ currently accepts. +Please note that single-lettered options requiring a numerical or no +argument may be concatenated. E.g.\ saying \Cmd{-v0qb0w2} is the +same as saying \Cmd{-v0~-q~-b0~-w2}, except for being less to +type. + +Enough general talk; here's a rather detailed description of all +options: +\begin{description} +\item[Misc.\ options:] General options which aren't related to some + specific subpart of \chktex. + \begin{description} + \item[{\tt -h [--help]}] Gives you a command summary. + \item[{\tt -i [--license]}] Shows distribution information. + \item[{\tt -l [--localrc]}] Reads a resource-file formatted + as the global resource-file \rsrc, in addition to the global + resource-file. This option needs the name of the resource-file + as a parameter. See also {\tt -g}. + \item[{\tt -r [--reset]}] This will reset all settings to their + defaults. This may be useful if you use the {\tt CMDLINE} + directive in your \rsrc\ file, and wish to do something + unusual. + \item[{\tt -d [--debug]}] Needs a numeric argument; a bitmask + telling what to output. The values below may be added in order + to output multiple debugging info. + + \begin{tabularx}\linewidth{cX} + \bf Value & \bf Dumps\ldots\\ + 1 & All warnings available and their current status. \\ + 2 & Statistics for all lists in the resource file. \\ + 4 & The contents of all lists in the resource file. \\ + 8 & Misc.\ other status information. \\ + 16 & Run-time info (note that this isn't widely used). \\ + \end{tabularx} + The info is produced after all switches and resource files have + been processed. + + It is possible to install versions of \chktex\ that ignore this + flag; this means that it is not certain that this flag works. + \item[{\tt -W [--version]}] Displays version information, and exits. + \end{description} +\item[Muting warning messages:] Controls whether and in what form + error messages will appear. Usually they accept a specific warning + number (e.g.\ \Cmd{-w2}), but you may also say \Cmd{all} (e.g.\ + \Cmd{-wall}) which does the operation on {\em all\/} warnings. + \begin{description} + \item[{\tt -w [--warnon]}] Makes the message number passed as + parameter a warning and turns it on. + \item[{\tt -e [--erroron]}] Makes the message number passed as + parameter an error and turns it on. + \item[{\tt -m [--msgon]}] Makes the message number passed as + parameter a message and turns it on. Messages are not counted. + \item[{\tt -n [--nowarn]}] Turns the warning/error number passed + as a parameter off. + \end{description} +\item[Output control flags:] Determines the appearance and + destination of the error reports. + \begin{description} + \item[{\tt -q [--quiet]}] Shuts up about copyright information. + \item[{\tt -o [--output]}] Normally, all errors are piped to {\tt stdout}. + Using this option with a parameter, errors will be sent to the + named file instead. Only information relative to the \LaTeX\ file + will be sent to that file. Memory problems and similar will as as + always be sent to {\tt stderr}. If a file with the name given + already exists, it will be renamed to \Cmd{foobar.bak} + (\Cmd{foobar.\$cl} under MS-DOS), \Cmd{foobar} being the name of + the file. See also \Cmd{-b}. + + \item[{\tt -v [--verbosity]}] Specifies how much and how you + wish the error reports to be displayed. This is specified in the + \rsrc\ file; we'll list the default values below. If you wish, + you may thus edit the \rsrc\ file to add or modify new formats. + + The default is mode 1 (that is, the {\em second\/} entry in the + \rsrc\ file), using {\tt -v} without any parameter will give you + mode 2. + + \begin{description} + \item[0] Will show the information in a way that should be + suitable for further parsing by {\tt awk}, {\tt sed} or + similar. The format is as follows: +\begin{verbatim} +File:Line:Column:Warning number:Warning message +\end{verbatim} + The colons may be replaced with another string; use the + \verb@-s@ switch for this. + + As the program does not output all errors in quite order, this + output format is also suitable for piping through \Cmd{sort}. + \item[1] Shows the information in a way which is more + comprehensible for humans, but which still doesn't need + anything but a glass tty. + \item[2] Shows the information in a fancy way, using escape + codes and stuff. It is the indeed most readable of all + modes; however, it needs proper set up of the \Cmd{ChkTeX.h} + at compilation time. UNIX boxes, however, will find the + information automatically. + \item[3] Shows the information suitable for parsing by Emacs; + this is the same format as {\tt lacheck} uses. More formally, + it is the following: +\begin{verbatim} +"File", line Line: Warning message +\end{verbatim} + + To utilize this, type \verb@M-x compile RET@. Delete whatever + is written in the minibuffer, and type + \verb@chktex -v3 texfile.tex@, and you should be able to + browse through the + error messages. Use \verb@C-x `@ to parse the messages. + \item[4] More or less the same as \verb@-v3@, but also includes + information on where the error actually was found. Takes somewhat + longer time to parse, but much more informative in use. + \end{description} + + \item[{\tt -f [--format]}] Specifies the format of the output. + This is done using a format similar to \Cmd{printf()}, where we + support the specifiers listed below. + + \smallskip + \newcommand{\Pf}[1]{\tt \%#1 &} + \begin{tabularx}{\linewidth}{cX} + \bf Code & \bf Description \\ + \Pf{b} String to print {\bf b\/}etween fields (from {\tt + -s} option). \\ + \Pf{c} {\bf C\/}olumn position of error. \\ + \Pf{d} Length of error ({\bf d\/}igit). \\ + \Pf{f} Current {\bf f\/}ilename.\\ + \Pf{i} Turn on {\bf i\/}nverse printing mode.\\ + \Pf{I} Turn off {\bf i\/}nverse printing mode.\\ + \Pf{k} {\bf k\/}ind of error (warning, error, message).\\ + \Pf{l} {\bf l\/}ine number of error.\\ + \Pf{m} Warning {\bf m\/}essage.\\ + \Pf{n} Warning {\bf n\/}umber.\\ + \Pf{u} An {\bf u\/}nderlining line (like the one which + appears when using \Cmd{-v1}).\\ + \Pf{r} Part of line in front of error ($\mbox{`S'} - + 1$).\\ + \Pf{s} Part of line which contains error ({\bf + s\/}tring).\\ + \Pf{t} Part of line after error ($\mbox{`S'} + 1$). + \end{tabularx} + \smallskip + + Other characters will be passed literally; thus you can say + \Cmd{\%\%} to achieve a single percent sign in the output. + Please note that we may introduce other specifiers in the future, + so don't abuse this feature for other characters. + + Also, note that we do {\em not\/} support field lengths (yet). + This may come in the future, if I get the time\dots + + The {\tt -v} command is implemented by indexing into the \rsrc\ + file; read that for seeing how each format is implemented. If + you find yourself using a particular format often by using the + -f switch, consider putting it in the \rsrc\ file instead. + \item[{\tt -V [--pipeverb]}] Which entry we'll use in the \rsrc\ + file whenever {\tt stdout} isn't a terminal. + + The default is to use the same mode as specified with the + {\tt -v} switch; using {\tt -V} without any parameter will give you + mode 1. + + This switch was implemented because GNU less has problems with + the escape codes \chktex\ uses for displaying inverse text. + Under UNIX, there's another way around, though, which is slightly + more elegant. Add the following line to your \Cmd{.envir} file: +\begin{verbatim} +setenv LESS -r +\end{verbatim} + + \item[{\tt -p [--pseudoname]}] With this switch, you can provide + the filename which will be used when we report the errors. This + may be useful in scripts, especially when doing pipes. It is in + other words similar to C's \verb@#line@ directive. + + We will only assume this name for the uppermost file; files that + this one in turn \verb@\@\verb@input@ are presented under their original + names. This seems most logical to me. + + \item[{\tt -s [--splitchar]}] String to use instead of the + colons when doing {\tt -v0}; e.g.\ this string will be output + between the fields. + + \end{description} +\item[Boolean switches:] Common for all of these are that they + take an optional parameter. If it is {\tt 0}, the feature will + be disabled, if it is {\tt 1}, it will be enabled. All these + features are on by default; and are toggled if you don't give + any parameter. + + \begin{description} + \item[{\tt -b [--backup]}] If you use the {\tt -o} switch, and the + named outputfile exists, it will be renamed to {\tt filename.bak}. + \item[{\tt -I [--inputfiles]}] Execute \verb@\@\verb@input@ + statements; e.g.\ include the file in the input. Our input parsing + does of course nest; we use an input-stack to keep track of this. + \item[{\tt -H [--headererr]}] Show errors found in front of the + \verb@\begin{document}@ line. Some people keep {\em lots\/} of + pure \TeX\ code there, which errors can't be detected reliably + (in other words, we will in most cases just produce a lot of + garbage). + \item[{\tt -g [--globalrc]}] Read in the global resource file. This + switch may be useful together with the {\tt -l} option. + \item[{\tt -t [--tictoc]}] Display a twirling baton, to show that + we're working. {\tt -v0} does an {\tt -t0}, too, as it assumes + that the user then uses the program non-interactively. This is + now a no-op. + \item[{\tt -x [--wipeverb]}] Ignore the ``\verb@\verb@'' command + found within the \LaTeX\ file and its argument is completely by + the checking routines. This is done by simply overwriting them. + If you somehow don't like that (for instance, you would like to + count brackets inside those commands, too), use this switch. + \end{description} +\end{description} + + +If you don't specify any input \LaTeX-files on the commandline, we'll +read from {\tt stdin}. To abort {\tt stdin} input, press the +following keycombinations: + +\smallskip +\begin{tabular}{ll} + \bf Machine & \bf Key-combination \\ + Amiga & $\fbox{\tt Ctrl} + \fbox{\tt\BS}$ \\ + UNIX & $\fbox{\tt Ctrl} + \fbox{\tt D}$ \\ + MS-DOS & $\fbox{\tt Ctrl} + \fbox{Z}$, followed by return. +\end{tabular} +\smallskip + +By default, we're using the 1994 version of GNU's \Cmd{getopt()} +routine. For those of you who have only used the Amiga's \Cmd{ReadArgs()}, +here are some quick instructions: + +\begin{itemize} +\item Options may be given in any order; the names of the \LaTeX-files + do not have to be the last arguments. This behaviour may be turned + off by creating an environment variable named \Cmd{POSIXLY\_CORRECT}. +\item The special argument \Cmd{--} forces an end of + option-scanning. +\item Long-named options begin with \Cmd{--} instead of \Cmd{-}. + Their names may be abbreviated as long as the abbreviation is unique + or is an exact match for some defined option. If they have an + argument, it follows the option name in the argument, separated from + the option name by a \Cmd{=}, or else the in next argument. +\end{itemize} + +\subsubsection{The \rsrc\ file} + +You should also take a look at the \rsrc\ file. As the file is +self-documenting; you should be able to get the meaning of each +keyword by simply reading the file. The method for {\em finding it}, +however, has grown rather complex. An outline is given below. + +If \chktex\ finds multiple files when searching, each and everyone +will be read in the order specified below. The \Cmd{Keyword = \{ item + item \dots \}} may thus be necessary to reset previously defined +lists. + +In this list, \Cmd{\$foo} is assumed to be the environment variable +\Cmd{foo}: + +\begin{enumerate} +\item First, we'll take a look at the directory which was specified as + \Cmd{DATADIR} during compilation (this does not happen on Amiga + machines). On UNIX boxes, this usually evaluates to + \Cmd{/usr/local/share/chktexrc} or similar, under MS-DOS it is set + to \Cmd{\BS{}emtex\BS{}data\BS{}chktexrc}. + +\item Look in the following system directories: + + \begin{tabular}{ll} + \bf Machine & \bf Directory \\ + 2.04+ Amiga & {\tt ENV:.chktexrc} \\ + 1.3 Amiga & {\tt S:.chktexrc} \\ + UNIX & \Cmd{\$HOME/.chktexrc} or \Cmd{\$LOGDIR/.chktexrc} \\ + MSDOS & Program installation path + \end{tabular} + +\item Look for it in the directory pointed to by an environment + variable, as specified in the table below: + + \begin{tabularx}\linewidth{lY} + \bf Machine & \bf Directory \\ + Amiga & \Cmd{\$CHKTEXRC/.chktexrc} \\ + UNIX & \Cmd{\$CHKTEXRC/.chktexrc} \\ + MSDOS & \Cmd{\$CHKTEXRC\BS{}chktexrc}, \Cmd{\$CHKTEX\_HOME\BS + chktexrc} or \Cmd{\$EMTEXDIR\BS{}data\BS{}chktexrc} + \end{tabularx} + +\item Look for it in the current directory. On UNIX and Amiga boxes, + we expect the filename to be \Cmd{.chktexrc}; on other machines + \Cmd{chktexrc}. + +\end{enumerate} + +If you for some reason wish to undo what the previous files may have +done, you may say \Cmd{CmdLine \{ -g0 -r \}} somewhere in the \rsrc\ +file; this will reset all previous settings. + + +\subsubsection{Hints} +I've tried to collect some advice that may be useful --- if you have a +favourite hint, feel free to send it to me! + +\begin{itemize} +\item If you use \Cmd{german.sty}; it may be wise to put \Cmd{-n18} in + the \Cmd{CmdLine} entry in the \rsrc\ file. This will probably reduce + the amount of false warnings significantly. +\item Put \Cmd{-v} in the \Cmd{CmdLine} entry of the \rsrc\ file; this + makes the fancy printing the default. +\item If you're working on a large project, it may pay off to make a + local resource file which is included in addition to the global + one. In this one, add the necessary info to reduce the amount of + false warnings --- these usually don't do anything but hide the + real warnings. +\item Create a total ignore environment, which \chktex\ will ignore + completely. In here, you can place all that code which outsmarts + \chktex\ completely. For instance, add the following lines at the top + of your \LaTeX\ file: +\begin{verbatim} +% ChkTeX will ignore material within this environment +\newenvironment{ignore}{}{} +\end{verbatim} + In addition, you should add the item \Cmd{ignore} to the \Cmd{VerbEnvir} + entry in the \rsrc\ file. +\end{itemize} +\subsubsection{Bugs} + +No fatal ones, I think, but the program currently has some problems when a +\LaTeX\ command/parameter stretch over a two lines --- some extra spaces +may be inserted into the input. I regard the program as fairly well +tested; using the SAS/C \Cmd{cover} utility I was able to make sure that +approximately 95\% of the code has actually been run successfully in the +final version. This does indeed leave some lines; most of these are +procedure terminating brackets or ``can't happen'' lines, though. + +We've got some problems when isolating the arguments of a command. +Although improved, it will certainly fail in certain cases; \chktex\ +can for instance not handle arguments stretching over two lines. This +also means that \Cmd{WIPEARG} entries in the \rsrc\ file will only +have the first half of their argument wiped if the argument stretches +over two lines. We will, however, take care not to wipe parenthesis +in such cases, in order to avoid false warnings. + +Before submitting a bug report, please first see whether the problem can be +solved by editing the \rsrc\ file appropiately. + + + +\subsection{ChkWEB} + +This shell script is provided for checking CWEB files. The template is +as follows: +\begin{verbatim} +chkweb [options] file1 file2 ... +\end{verbatim} +As you may see from the script, it is only a trivial interface towards +{\tt deweb} and \chktex. It does not support any individual options +on the command line --- all options found will be passed onto \chktex. +If \Cmd{--} or a filename is found, the remaining parameters will be +ignored. +The only real intelligence it features is that it will try to append +\verb@.w@ to filenames it can't find. + +If no filenames are given, we will read from {\tt stdin}. + +\subsection{DeWEB} + +This program strips away C code and CWEB commands from CWEB sources. +It is called with the following synopsis: + +\begin{verbatim} +deweb file1 file2 ... +\end{verbatim} + +{\tt deweb} filters away all C \&\ CWEB commands from a CWEB source code. +This leaves only the \LaTeX\ code. This stripped code, in turn, may then +be passed to a suitable syntax checker for \LaTeX, like \chktex\ and {\tt + lacheck}, or spell-checkers like {\tt ispell}. + +When {\tt deweb} strips away the C code from your CWEB source, it tries to +preserve line breaks. This means that the error reports from {\it your + favorite tool\/} will be correct regarding to line numbers. In most +cases, the column position will also be correct. This significantly +simplifies finding the errors in the \LaTeX\ source (in contrast to the +output from {\tt cweave}, which output is truly difficult to figure +anything out from). + +{\tt deweb} accepts a list of filenames on the argument line, and will send +its output to {\tt stdout}. If no filenames are given, it will read from +stdin, acting as a filter. No options are currently accepted. + +Macho users may try to pipe the output from {\tt deweb} directly into +\LaTeX, theoretically, this should work. This would ease the debugging of +the \LaTeX\ code significantly, as when \LaTeX\ complains about wrong +syntax, you'll be able to find the erroneous line much more easily. Don't +expect that the output looks very much like the final one, though. + +{\tt deweb} should now understand all correct {\tt CWEB} opcodes. If it +complains about not understanding a correct opcode, please inform the +author. + +\subsubsection{Bugs} + +{\tt deweb} will not even {\em compile\/} under Perl versions before perl +v5. Unfortunately, this means that we can't even tell the user why we +failed; Perl will just complain about not being able to compile the +regexps. + +\section{Explanation of error messages} +Below is a description of all error-messages \chktex\ outputs. +Error messages set in {\it italic type\/} are turned off by default. +Where margin paragraphs are listed in the text, they refer to the +keyword in the \rsrc\ file which controls the discussed warning. + +\newcommand\Keyword[1]{\marginpar{\large\tt\hfill\\ #1}} + +\smallskip\pagebreak[2] +\Keyword{Silent} +\begin{errdesc}{Command terminated with space.} + You tried to terminate a command with a blank space. Usually, this + is an error as these are ignored by \LaTeX. In most cases, you would + like to have a real space there. + + \begin{errexam} + \verb@\LaTeX@\underline{\tt }\verb@is a typesetter.@ \\* + \LaTeX is a typesetter. \\* + \smallskip + \verb@\LaTeX\ is a typesetter.@ \\* + \LaTeX\ is a typesetter. \\* + \end{errexam} +\end{errdesc} + +\Keyword{Linker} +\begin{errdesc}{Non-breaking space (`\~{}') should have been used.} + When reading a document, it is not very pretty when references are + split across lines. If you use the \verb@~@ character, \LaTeX\ will + assign a very high penalty for splitting a line at that point. + \chktex\ issues this warning if you have forgot to do this. + + \begin{errexam} + \verb@Please refer to figure@\underline{\tt\ }\verb@\ref{foo}.@ \\* + Please refer to figure 11. \\* % Gotta cheat here! :) + \smallskip + \verb@Please refer to figure~\ref{foo}.@ \\* + Please refer to figure~11. \\* + \end{errexam} +\end{errdesc} + +\begin{errdesc}{You should enclose the previous parenthesis with `\{\}'.} + + This is a warning which you may ignore, but for maximum aestethic + pleasure, you should enclose your bracket characters with `\{\}'s. + + \begin{errexam} + \verb@$@\underline{\tt\ }\verb@[(ab)^{-1}]@\underline{\tt\ }\verb@\^{-2}$@ \\* + $[(ab)^{-1}]^{-2}$ \\* + \smallskip + \verb@${[{(ab)}^{-1}]}^{-2}$@ \\* + ${[(ab)^{-1}]}^{-2}$ \\* + \end{errexam} +\end{errdesc} + +\Keyword{Italic\\ItalCmd\\NonItalic} +\begin{errdesc}{Italic correction (`\BS/') found in non-italic + buffer.} + If you try to use the \verb@\/@ command when \chktex\ believes that + the buffer is not outputted as italic, you'll get this warning. + + \begin{errexam} + \verb@This is an@\underline{\tt\BS/}\verb@ example@ \\* + This is an\/ example. \\* + \smallskip + \verb@This is an example.@ \\* + This is an example. \\* + \end{errexam} +\end{errdesc} + +\Keyword{Italic\\ItalCmd\\NonItalic} +\begin{errdesc}{Italic correction (`\BS/') found more than once.} + If the buffer is italic, and you try to use the \verb@\/@ command + more than once, you'll get this warning. + + \begin{errexam} + \verb@This {\it example\/@\underline{\tt\BS/}\verb@} is not amusing.@ \\* + This {\it example\/\/} is not amusing. \\* + \smallskip + \verb@This {\it example\/} is not amusing.@ \\* + This {\it example\/} is not amusing. \\* + \end{errexam} +\end{errdesc} + +\Keyword{Italic\\ItalCmd\\NonItalic} +\begin{errdesc}{No italic correction (`\BS/') found.} + You get this error if \chktex\ believes that you are switching from + italic to non-italic, and you've forgot to use the \verb@\/@ command + to insert that extra little spacing. If you use the \Cmd{em} option, + you may ignore this warning. + + \begin{errexam} + \verb@This {\it example@\underline{\tt\ }\verb@} is not amusing, either.@ \\* + This {\it example} is not amusing, either. \\* + \smallskip + \verb@This {\it example\/} is not amusing, either.@ \\* + This {\it example\/} is not amusing, either. \\* + \end{errexam} +\end{errdesc} + +\Keyword{IJAccent} +\begin{errdesc}{Accent command `command' needs use of `command'.} + If you're using accenting commands, `i' and `j' should lose their + dots before they get accented. This is accomplished by using the + \verb@\i@, \verb@\j@, \verb@\imath@ and \verb@\jmath@ command. + + \begin{errexam} + \verb@This is an example of use of accents: \'{@\underline{\tt i}\verb@}.@ \\* + This is an example of use of accents: \'{i}. \\* + \smallskip + \verb@This is an example of use of accents: \'{\i}.@ \\* + This is an example of use of accents: \'{\i}. \\* + \end{errexam} +\end{errdesc} + +\Keyword{HyphDash\\NumDash\\WordDash} +\begin{errdesc}{Wrong length of dash may have been used.} + This warning suggests that a wrong number of dashes may have been + used. It does this by classifying the dash according to the the + character in front and after the dashes. + + If they are of the same type, \chktex\ will determine which keyword + to use in the \rsrc\ file. If not, it will shut up and accept that + it doesn't know. + + \begin{tabular}{ll} + \bf Character type & \bf Keyword in \rsrc\ file \\* + Space & \tt WordDash \\* + Number & \tt NumDash \\* + Alphabetic character & \tt HyphDash \\* + \end{tabular} + + This is more or less correct, according to my references. Hopefully + this check can be even more improved (suggestions?). + + \begin{errexam} + \verb@It wasn't anything @\underline{\tt-}\verb@ just a 2@\underline + {\tt---}\verb@3 star@\underline{\tt--}\verb@shots.@ \\* + It wasn't anything - just a 2---3 star--shots. \\* + \smallskip + \verb@It wasn't anything --- just a 2--3 star-shots@ \\* + It wasn't anything --- just a 2--3 star-shots. \\* + \end{errexam} +\end{errdesc} + + +\fmted{`\%s' expected, found `\%s'.} +\begin{errdesc}{Solo `\%s' found.} + You get this warning whenever brackets or environments don't match. + \chktex\ expect to find matching brackets/environments in the + same order as their opposites were found, and no closing delimiters + which haven't been preceded by an opening one. + + While bracket matching is not an explicit error, it is usually a + sign that something is wrong. + +\end{errdesc} + +\Keyword{CenterDots\\LowDots} +\begin{errdesc}{You should use `\%s' to achieve an ellipsis.} + Simply typing three \Cmd{.} in a row will not give a perfect spacing + withing the between the dots. The \verb@\ldots@ is much more + suitable for this. + + In math mode, you should also distinguish between \verb@\cdots@ and + \verb@\ldots@; take a look at the example below. + + \begin{errexam} + \newcommand{\td}{\underline{\tt...}} + \verb@Foo@\td\verb@bar. $1,@\td\verb@,3$. $1+@\td\verb@+3$. $1,@% + \underline{\tt\BS{}cdots}\verb@,3$.@ \\* + Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. \\* + \smallskip + \verb@Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$.@ \\* + Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. \\ + \end{errexam} +\end{errdesc} + +\Keyword{Abbrev} +\begin{errdesc}{Interword spacing (`\BS\ ') should perhaps be used.} + + One of the specified abbreviations were found. Unless you have + previously said \verb@\frenchspacing@, you'll have incorrect + spacing, which one should avoid if possible. + + \begin{errexam} + \verb@This is an example, i.e.@\underline{\tt\ }\verb@an demonstration.@ \\* + This is an example, i.e. an demonstration. \\* + \smallskip + \verb@This is an example, i.e.\ an demonstration.@ \\* + This is an example, i.e.\ an demonstration. \\* + \end{errexam} +\end{errdesc} + +\begin{errdesc}{Intersentence spacing (`\BS{}@') should perhaps be used.} + + \LaTeX' detection of whether a period ends a sentence or not, is + only based upon the character in front of the period. If it's + uppercase, it assumes that it does not end a sentence. While this + may be correct in many cases, it may be incorrect in others. + \chktex\ thus outputs this warning in every such case. + + \begin{errexam} + \verb@I've seen an UFO!@\underline{\tt\ }\verb@Right over there!@ \\* + I've seen an UFO! Right over there! \\* + \smallskip + \verb+I've seen an UFO\@! Right over there!+ \\* + I've seen an UFO\@! Right over there! \\* + \end{errexam} +\end{errdesc} + +\begin{errdesc}{Could not find argument for command.} + + \chktex\ will in some cases need the argument of a function to + detect an error. As \chktex\ currently processes the \LaTeX\ file on + a line-by-line basis, it won't find the argument if the command + which needed it was on the previous line. On the other hand, this + {\em may\/} also be an error; you ought to check it to be safe. + + \begin{errexam} + \verb@$\hat$@ \\* + This will give a \LaTeX\ error\dots \\* + \smallskip + \verb@$\hat{a}$@ \\* + $\hat{a}$ \\* + \end{errexam} +\end{errdesc} + +\begin{errdesc}{No match found for `\%s'.} + + This warning is triggered if we find a single, {\em opening\/} + bracket or environment. While bracket matching is not an explicit + error, it is usually a sign that something is wrong. + +\end{errdesc} + +\Keyword{MathEnvir} +\begin{errdesc}{Mathmode still on at end of LaTeX file.} + This error is triggered if you at some point have turned on + mathmode, and \chktex\ couldn't see that you remembered to turn it + off. + +\end{errdesc} + +\begin{errdesc}{Number of `character' doesn't match the number of `character'.} + + Should be self-explanatory. \chktex\ didn't find the same number of + an opening bracket as it found of a closing bracket. + +\end{errdesc} + +\begin{errdesc}{You should use either `` or '' as an alternative to `\,"\,'.} + Self-explanatory. Look in the example, and you'll understand why. + + \begin{errexam} + \verb@This is an @\underline{\tt"}\verb@example@\underline{\tt"} \\* + This is an "example" \\* + \smallskip + \verb@This is an ``example''@ \\* + This is an ``example'' \\* + \end{errexam} +\end{errdesc} + +\begin{errdesc}{You should use "'" (ASCII 39) instead of + "'" (ASCII 180).} On some keyboards you might get the wrong quote. + This quote looks, IMHO, {\em ugly\/} compared to the standard + quotes, it doesn't even come out as a quote! Just see in the + example. + + + \begin{errexam} + \verb@``There@\underline{\tt '}\verb@s quotes and there@\underline{\tt '}\verb@s quotes@ + \underline{\tt ''} \\* % '' + ``There´s quotes and there´s quotes´´ \\* % '' + \smallskip + \verb@``There's quotes and there's quotes''@ \\* + ``There's quotes and there's quotes'' \\* + \end{errexam} +\end{errdesc} + +\Keyword{Userwarn} +\begin{errdesc}{User-specified pattern found.} + A substring you've specified using {\tt USERWARN} in the \rsrc\ file, + has been found. +\end{errdesc} + +\begin{errdesc*}{This command might not be intended.} + I implemented this because a friend of mine kept on making these + mistakes. Easily done if you haven't gotten quite into the syntax + of \LaTeX. + + \begin{errexam} + \verb@\LaTeX\ is an extension of \TeX@\underline{\tt\BS.}\verb@ Right?@ \\* + \LaTeX\ is an extension of \TeX\. Right? \\* + \smallskip + \verb@\LaTeX\ is an extension of \TeX. Right?@ \\* + \LaTeX\ is an extension of \TeX. Right? \\* + \end{errexam} +\end{errdesc*} + +\begin{errdesc*}{Comment displayed.} + \chktex\ dumps all comments it finds, which in some cases is useful. + I usually keep all my notes in the comments, and like to review them + before I ship the final version. For commenting out parts of the + document, the \Cmd{comment} environment is better suited. + +\end{errdesc*} + + +\begin{errdesc}{Either ''\BS,' or '\BS,'' will look better.} + + This error is generated whenever you try to typeset three quotes in + a row; this will not look pretty, and one of them should be + separated from the rest. + + \begin{errexam} + \underline{\tt```}\verb@Hello', I heard him said'', she remembered.@ \\* + ```Hello', I heard him said'', she remembered. \\* + \smallskip + \verb@``\,`Hello', I heard him said'', she remembered.@ \\* + ``\,`Hello', I heard him said'', she remembered. + \end{errexam} +\end{errdesc} + +\Keyword{PostLink} +\begin{errdesc}{Delete this space to maintain correct pagereferences.} + This message, issued when a space is found in front of a + \verb@\index@, \verb@\label@ or similar command (can be set in the + \rsrc\ file). Sometimes, this space may cause that the word and the + index happens on separate pages, if a pagebreak happens just there. + + You might also use this warning to warn you about spaces in front of + footnotes; however, the warning text may not be entirely correct + then. + + \begin{errexam} + \verb@Indexing text@\underline{\tt\ }\verb@\index{text} is fun!@ \\* + \smallskip + \verb@Indexing text\index{text} is fun!@ \\* + \end{errexam} +\end{errdesc} + +\begin{errdesc}{You might wish to put this between a pair of `\{\}'} + + This warning is given whenever \chktex\ finds a \Cmd{\^{ }}' or a + \Cmd{\_} followed by either two or more numberic digits or two or + more alphabetic characters. In most situations, this means that + you've forgotten some \{\}'s. + + \begin{errexam} + \verb@$5\cdot10^@\underline{\tt10}\verb@$@ \\* + $5\cdot10^10$ \\* + \smallskip + \verb@$5\cdot10^{10}$@ \\* + $5\cdot10^{10}$ + \end{errexam} +\end{errdesc} + +\begin{errdesc}{You ought to remove spaces in front of punctuation.} + + This warning is issued if \chktex\ finds space in front of an + end-of-sentence character. + + \begin{errexam} + \verb@Do you understand@\underline{\tt\ }\verb@?@ \\* + Do you understand ? \\* + \smallskip + \verb@Do you understand?@ \\* + Do you understand? \\* + \end{errexam} +\end{errdesc} + +\begin{errdesc}{Could not execute LaTeX command.} + + Some \LaTeX\ commands will be interpreted by \chktex; however, some + of them are sensible to errors in the \LaTeX\ source. Most notably, + the \verb@\@\verb@input@ command relies on that the input file exists\dots + +\end{errdesc} + +\Keyword{Italic\\ItalCmd\\NonItalic} +\begin{errdesc}{Don't use \BS/ in front of small punctuation.} + Italic correction should generally {\em not\/} be used in front of + small punctuation characters like `.' and `,'; as it looks better + when the preceding italic character leans ``over'' the punctum or + comma. + + \begin{errexam} + \verb@It is just a {\it test@\underline{\tt\BS/}\verb@}, don't think anything else.@ \\* + It is just a {\it test\/}, don't think anything else. \\* + \smallskip + \verb@It is just a {\it test}, don't think anything else.@ \\* + It is just a {\it test}, don't think anything else. + \end{errexam} +\end{errdesc} + +\begin{errdesc}{\$\BS{}times\$ may look prettier here.} + In ASCII environments, it is usual to use the `x' character as an + infix operator to denote a dimension. The mathemathical symbol + $\times$ provided by the \verb@$\times$@ command is better suited for + this. + + \begin{errexam} + \verb@The program opens a screen sized 640@\underline{\tt x}\verb@200 pixels.@ \\* + The program opens a screen sized 640x200 pixels. \\* + \smallskip + \verb@The program opens a screen sized $640\times200$ pixels.@ \\* + The program opens a screen sized $640\times200$ pixels. + \end{errexam} +\end{errdesc} + +\begin{errdesc*}{Multiple spaces detected in output.} + + This warning, intended for the novice, will remind you that even if + you {\em type\/} multiple spaces in your input, only a single space + will come out. Some ways to come around this is listed below. + + \begin{errexam} + \verb@White is a beautiful colour.@ \\* + White is a beautiful colour. \\* + \smallskip + \verb@White~~~~~{ }{ }{ }\ \ \ is a beautiful colour.@ \\* + White~~~~~{ }{ }{ }\ \ \ is a beautiful colour. \\ + \end{errexam} +\end{errdesc*} + +\Keyword{VerbEnvir} +\begin{errdesc}{This text may be ignored.} + Certain implementations of the \verb@verbatim@ environment and + derivations of that, ignore all text on the same line as + \verb@\end{verbatim}@. This will warn you about this. + + +\end{errdesc} + +\fmted{Use ` to begin quotation, not '.}\hfill\\ +\fmted{Use ' to end quotation, not `.}\hfill\\ +\begin{errdesc}{Don't mix quotes.} + + Proper quotations should start with a \verb@`@ and end with a + \verb@'@; anything else isn't very pretty. Both these warnings are + relative to this; look in the example below. + + \begin{errexam} + \verb@There are @\underline{\tt`'}% + \verb@examples'' and there are ``examples@\underline{\tt``}\verb@.@ \\* + There are `'examples'' and there are ``examples``. \\* + \smallskip + \verb@There are ``examples'' and there are ``examples''.@ \\* + There are ``examples'' and there are ``examples''. + \end{errexam} +\end{errdesc} + +\Keyword{MathRoman} +\begin{errdesc}{You should perhaps use `cmd' instead.} + Most mathematical operators should be set as standard roman font, + instead of the math italic \LaTeX\ uses for variables. For many + operators, \LaTeX\ provides a pre-defined command which will typeset + the operator correctly. Look below for an illustration of the point. + + \begin{errexam} + \verb@$@\underline{\tt sin}\verb@^2 x + @\underline{\tt cos}\verb@^2 x = 1$@ \\* + $sin^2 x + cos^2 x= 1$ \\* + \smallskip + \verb@$\sin^2 x + \cos^2 x = 1$@ \\* + $\sin^2 x + \cos^2 x = 1$ + \end{errexam} +\end{errdesc} + +\fmted{You should put a space in front of/after parenthesis.}\hfill\\ +\begin{errdesc}{You should avoid spaces in front of/after parenthesis.} + Outside math mode, you should put a space in front of any group of + opening parenthesis, and no spaces after. If you have several after + each other, you should of course not put a space in between each; + look in the example below. Likewise, there should not be spaces in + front of closing parenthesis, but there should be at least one + after. + + + + \begin{errexam} + \verb@This@\underline{\tt( }\verb@an example@\underline{\tt( }% + \verb@Nuff said@\underline{\tt\ }\verb@)), illustrates@\underline{\tt( }% + \verb@``my''@\underline{\tt\ )}\verb@point.@\\ + This( an example( Nuff said )), illustrates( ``my'' )point. \\ + \smallskip + \verb@This (an example (Nuff said)), illustrates (``my'') point.@\\ + This (an example (Nuff said)), illustrates (``my'') point.\\ + \end{errexam} +\end{errdesc} + +\Keyword{QuoteStyle} +\begin{errdesc}{You should not use punctuation in front of/after + quotes.} + % + For best looking documents, you should decide on how you + wish to put quotes relative to punctuation. \chktex\ recognizes two + styles; you may specify which you use in the \rsrc\ file. A + description on each style follows: + \begin{description} + \item[Traditional:] This style is the most visually pleasing. It + always puts the punctuation {\em in front of\/} the quotes, which + gives a continuous bottom line. + + However, it may in certain cases be ambigious. Consider the + following example from a fictious \Cmd{vi(1)} + tutorial (quote taken from the Jargon file): + \begin{center} + \verb@Then delete a line from the file by typing ``dd.''@ \\* + Then delete a line from the file by typing ``dd.'' + \end{center} + That would be very bad --- because the reader would be prone to + type the string d-d-dot, and it happens that in \Cmd{vi(1)} dot + repeats the last command accepted. The net result would be to + delete {\em two\/} lines! This problem is avoided using logical + style, described below. + \pagebreak[3] + \item[Logical:] This style uses quotes as balanced delimiters like + parentheses. While this is not the most visual pleasing, it is + can't be misunderstood. The above sentence would then become: + \nopagebreak + \begin{center} + \verb@Then delete a line from the file by typing ``dd''.@ \\* + Then delete a line from the file by typing ``dd''. + \end{center} + \nopagebreak + \end{description} + +\end{errdesc} + +\begin{errdesc}{Double space found.} + This warning is triggered whenever \chktex\ finds a space in front + of a hard space, or vice versa. This will be rendered as two spaces + (which you usually don't wish). + + \begin{errexam} + \verb@For output codes, see table@\underline{\tt\ }% + \verb@~@\underline{\tt\ }\verb@\ref{foo}.@ \\* + For output codes, see table ~ 1.1.\\* + \smallskip + \verb@For output codes, see table~\ref{foo}.@ \\* + For output codes, see table~1.1. + \end{errexam} +\end{errdesc} + +\Keyword{MathEnvir} +\begin{errdesc}{You should put punctuation outside inner/inside + display math mode.} + As recommended in the \TeX{}book, you should try to put punctuation + outside inner math mode, as this is gets formatted better. + + Similarily, you should let any final punctuation in display math + mode end up within it. Look at the following example, which was + taken from the \TeX{}book: + \begin{errexam} + \verb@for $x = a@\underline{\tt,}\verb@b$, or $c$.@\\* + for $x = a,b$, or $c$. \\* + \smallskip + \verb@for $x = a$, $b$, or $c$.@\\* + for $x = a$, $b$, or $c$.\\* + \end{errexam} + +\end{errdesc} + +\Keyword{Primitives} +\begin{errdesc*}{You ought to not use primitive TeX in LaTeX code.} + This warning is triggered whenever you use a raw \TeX\ command + which has been replaced by a \LaTeX\ equivalent. If you consider + yourself a purist (or want to be sure your code works under \LaTeX3), + you should use the \LaTeX\ equivalent. +\end{errdesc*} + +\Keyword{NotPreSpaced} +\begin{errdesc}{You should remove spaces in front of `\%s'} + + Some commands should not be prepended by a space character, for cosmetical + reasons. This notes you of this whenever this has happened. + + \begin{errexam} + \verb@This is a footnote@\underline{\tt\ }\verb@\footnotemark[1] mark.@\\* + This is a footnote ${}^1$ mark. \\* + \smallskip + \verb@This is a footnote\footnotemark[1] mark.@\\* + This is a footnote${}^1$ mark. \\* + \end{errexam} +\end{errdesc} + +\Keyword{NoCharNext} +\begin{errdesc}{`\%s' is normally not followed by `\%c'.} + \LaTeX' error message when calling \verb@\left \{@ instead of + \verb@left \{@ is unfortunately rather poor. This warning detects + this and similar errors. +\end{errdesc} + +\section{Future plans} + +In a somewhat prioritized sequence, this is what I'd like to put into the +program --- if I have the time. + +\begin{itemize} +\item Do a final fix for maths mode. Currently, \chktex\ doesn't + recognize embedded math mode (i.e.\ constructions like + \verb@$$a+b\text{for $a \leq 0$}$$@). + +\item Support for regular expressions as user patterns. I'll do it at + once I get the GNU \Cmd{rx} package up and running (it doesn't + produce correct include files). + +\item De-linearize the checker. Currently, it works on a line-by-line + basis, in most respects, at least. I hope to be able to remove this + barrier; as this will reduce the amount of false warnings + somewhat. + +\item Probably some more warnings/errors; just have to think them out + first. Suggestions are appreciated --- I've ``stolen'' most that + similar programs provides, and am running out of ideas, really. + + It would also be nice to investigate the field of ``globally'' + oriented warnings; i.e.\ warnings regarding the document as a + whole. Currently, \chktex\ operates mainly on a local/``greedy'' + basis. + + If you have suggestions/ideas on this topic, they're certainly + welcome, including references to literature. + +\item Fix a few more bugs. \smiley +\end{itemize} + +\section{Notes} + +\subsection{Wish to help?} + +As most other living creatures, I have only a limited amount of time. If +you like \chktex\ and would like to help improving it, here's a few things +I would like to receive. The following ideas are given: + +\begin{itemize} +\item Does anyone have a $\mbox{\LaTeX}\rightarrow \mbox{{\tt troff}}$ + conversion program? It would be really nice if I could extract the + relevant sections from this manual, and present them as a man page. + I will not, however, convert this manual to \TeX{}info in order to + be able to do this; IMHO \TeX{}info documents have far too limited + typographic possibilities. + + This doesn't mean that I'm not willing to restructure the document + at all. This manual already uses some kind of preprocessing in order + to achieve HTML output via \LaTeX2{\tt html}, I'm willing to do the + same in order to produce {\tt troff} output. + +\item Help me port the program! This is a prioritized one. It's no fun + writing ANSI C when people haven't got a C compiler. + + Of course, I'll provide whatever help necessary to modify the sources + to fit to the new platform. Take contact if you're interested. I will + include your compiled binary in the distribution, and give you + credit where appropiate. + + Just one request: If you have to modify the sources in order to make + \chktex\ compile \& work on the new platform, {\em please\/} enclose your + changes in something like \Cmd{\#ifdef \_\_PLATFORM\_\_\dots code\dots\#endif}! + It makes life so much easier later, when we try to merge the two + source trees. + +\item Reports on problems configuring and compiling \chktex\ on supported + (and unsupported) systems are welcomed. + +\item Filters for other file formats. I do believe that there are + several formats using \LaTeX\ for its formatting purposes, combining + that with something else. If you can write a program or script which + filters everything away but the \LaTeX\ code, it will surely be + appreciated (and included). Look at the \verb@deweb@ script to see + what I mean. + +\item Arexx interfaces for other editors are also welcomed; these + should be rather fast to write. They should to the following: + \begin{enumerate} + \item Get the filename of the active file. + \item If possible, save the file to disk if there has been any + changes. + \item Call the program \Cmd{ChkTeX.rexx} with the filename as the + only parameter. + \end{enumerate} + +\item If somebody out there actually possesses (and uses) GoldED, it + would be nice if they checked whether the ARexx script included + actually work. If not, please send me a fixed copy; perhaps also + one which supports point 2 above, too. If it does work, then please + tell me so, so I can remove this item. + + I don't have GoldEd in my possession; the script was just modelled + after Juergen Zeschky's, ({\tt <juergen@sokrates.nbg.de>}) + $\mbox{PGP}\leftrightarrow\mbox{GoldED}$ interface. + +\item If you update the \rsrc\ file in anyway that is not strictly + local, I would appreciate to receive your updated version. + +\item Suggestions for new warnings are always welcomed. Both formal + (i.e.\ regexps or similar) and non-formal (plain English) descriptions + are welcomed. +\end{itemize} + +Of course, people doing any of this will be mentioned in this document, and +thus receive eternal glory and appreciation. + +\subsection{Caps and stuff} + +This program uses the \Cmd{getopt()} routine, as supplied from GNU\@. +The source included in this distribution has been modified slightly. +To make the use of C2LOCAL easier, portions which were +\verb@#ifdef@'ed out, have now been commented out. + +Where trademarks have been used, the author is aware of that they +belong to someone, and has tried to stick to the original caps. + +\section{About the author} + +A quick summary of who I am and what I do: + +I'm 21 years old, and live in Oslo, the capital of Norway. I'm +currently studying maths and computer science at the +University~of~Oslo; planning to get a degree within mathematical +modeling, with a dash of physics and emphazing the computer part of +the study. More precisely, in autumn'96 my studies consist of +mathematical analysis, statistics \& probability calculations plus +studying the relationship between society and computers. + +At home I now possess 4 computers, of which 1 is regular use: A +vanilla Amiga 1200, expanded only by a HD\@. The others are a {\tt + 80286} PC and an Amiga 500, both semi-out-of-order. The last one is +a Commodore VIC-20, which for some peculiar reason never seems to be +used. Plans are to get a Linux-capable PC, though. + +Most of the time in front of these computers (including SGI Indy's and +SPARC stations at our university) is spent on C and shell programming, +plus some text-processing. + + % I am also involved in writing the document + % for {\sc Isaac} --- Interactive Simulation as an Alternative to + % Advanced Calculations. This is planned to help newcomers to physics, + % by providing a computer program which enables one to simulate most + % experiments relating to classical mechanics. + % + +C and shell programming are not my only knowledge areas regarding +computers, however. I write the following languages more or less: +Perl, Motorola {\tt 68000} assembly code, ARexx, Simula, C++, \LaTeX, +HTML, AmigaGuide, Amos Basic and Installer LISP\@. Once I also +mastered Commodore Basic V2, the ``language'' included with my VIC-20. + +However, I also try to not to end up as a computer nerd. Thus, in +addition to the compulsory (?) interest for computers, I am a scout. +Still running into the woods, climbing the trees, falling down and +climbing up once more, in other words. To be more specific, I am a +now a troop leader for `Ulven' scout-group; Norwegian Scouts +Association. I am also a active rover in `V{\aa}lerenga' scout-group. + +Certainly a lot more to tell (I play the piano and like cross-country +skiing, for instance); but I'll stop here before you fall +asleep\dots\smiley + + +\section{Thanks} + +The author wishes to thank the following people (in alphabetical order): + +\def\Name#1#2{% +\item[] + \setbox0=\hbox{ + \begin{tabular}{l} + \bf #1 \\ + \tt #2 \\ + \end{tabular} + } \usebox0\\ } + +\begin{description} + + \Name{Russ Bubley}{russ@scs.leeds.ac.uk} + He has been the main external beta-tester for this program, sending + me loads and loads of understandable and reproducible bug reports. + If you somehow think that \chktex\ is well-behaved and free from + bugs, send warm thoughts to Russ. He has also provided ideas for + enhanced checks and so forth. + + In addition, he sent me a huge list of 238 common English + abbreviations, for inclusion in the \rsrc\ file! Together with the + enhanced abbreviation recognizer, I do now believe most + abbreviations should be catched\dots\smiley + + Finally, he has also given me valuable hints for improving the + program's outputting routine, and given me lots of suggestions for + filtering unnecessary/false warnings away. + + \Name{Gerd B\"ohm}{Gerd.Boehm@physik.uni-regensburg.de} + Improved and bug-fixed the MS-DOS port of \chktex\ v1.4, sending me + ready-to-yank code patches. The original port didn't respect all + the peculiarities of the MS-DOS file-system, unfortunately. + + \Name{Lars Frellesen}{frelle@math-tech.dk} Sent a few bug reports + regarding the filtering of messages. He has also helped me to + expand the \Cmd{SILENT} keyword in the \rsrc\ file. + + \Name{Wolfgang Fritsch}{fritsch@hmi.de} + Author of the OS/2 port, which he did using the emx compiler. + Please direct questions regarding strictly to that port to him (I + would like to receive a carbon copy, though). + + \Name{Stefan Gerberding}{stefan@inferenzsysteme.informatik.th-darmstadt.de} + First one to report the Enforcer hit in v1.2 when using \chktex\ as + a pipe. Also came with suggestions to make \chktex\ more easily + compile on early gcc compilers. + + He has also kept on beta-testing later versions of \chktex, giving + me bug-reports and enhancements requests. + + \Name{Kasper B. Graversen}{kbg2001@internet.dk} Lots of creative + suggestions and improvements. Several of the warnings implemented + were based on his ideas. In addition, he has given advice for + improving the existing warnings. + + Has also provided some OS-oriented code. + + \Name{Frank Luithle}{f\_luithle@outside.sb.sub.de} + Wrote a translation for v1.0. Unfortunately, he remained unreachable + after that\dots:-/ + + \Name{Nat}{nat@nataa.frmug.fr.net} + Reported the same bug as Gerberding. In addition, he taught me a + few tricks regarding the use of gcc + made me understand that the + ANSI standard isn't unambigious; at least the \verb@getenv()@ call + seem to be open for interpretations. Many possible + incompatibilities have been removed due to these lessons. + + \Name{Michael Sanders}{sanders@umich.edu} + Has found some of the bugs in this beast; both obscure and + long-lived. Has also provided motivation to clarify this document. + + \Name{Bj\o rn Ove Thue}{bjort@ifi.uio.no} + Author of the MSDOS port; please direct questions regarding + strictly to that port to him (I would like to receive a carbon + copy, though). + + \Name{Martin Ward}{Martin.Ward@durham.ac.uk} + Sent a few bug-reports; also gave me information upon where to find + regexp code. He also provided a Perl script for checking ordinary + text, which ideas I was able to implement in \chktex. In addition, + he sent me the source code for \verb@lacheck@; which also inspired some + of the warnings. +\end{description} + +%endlatex +\section{Contacting the author} + +If you wish to contact me for any reason or would like to participate in +the development of \chktex, please write to: +%latex +\begin{samepage} +%endlatex + \begin{quote} + Jens Berger \\ + Spektrumvn. 4 \\ + N-0666 Oslo \\ + Norway \\ + E-mail: {\tt <jensthi@ifi.uio.no>} + \end{quote} +%latex +\end{samepage} +%endlatex +Any signs of intelligent life are welcomed; that should exclude piracy. + +\medskip\noindent +Have fun. + +\end{document} + + + diff --git a/Build/source/texk/chktex/FindErrs.c b/Build/source/texk/chktex/FindErrs.c new file mode 100644 index 00000000000..2014e3923cc --- /dev/null +++ b/Build/source/texk/chktex/FindErrs.c @@ -0,0 +1,1485 @@ +/* + * ChkTeX v1.5, error searching & report routines. + * Copyright (C) 1995-96 Jens T. Berger Thielemann + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Contact the author at: + * Jens Berger + * Spektrumvn. 4 + * N-0666 Oslo + * Norway + * E-mail: <jensthi@ifi.uio.no> + * + * + */ + + +#include "ChkTeX.h" +#include "FindErrs.h" +#include "OpSys.h" +#include "Utility.h" +#include "Resource.h" + +/***************************** ERROR MESSAGES ***************************/ + +#undef MSG +#define MSG(num, type, inuse, ctxt, text) {num, type, inuse, ctxt, text}, + +struct ErrMsg LaTeXMsgs [emMaxFault + 1] = +{ + ERRMSGS + {emMaxFault, etErr, iuOK, 0, INTERNFAULT} +}; + +#define istex(c) (isalpha(c) || (AtLetter && (c == '@'))) +#define CTYPE(func) \ +static int my_##func(int c) \ +{ \ + return(func(c)); \ +} + +#define INUSE(c) (LaTeXMsgs[(enum ErrNum) c].InUse == iuOK) + +#define PSERR2(pos,len,err,a,b) \ + PrintError(CurStkName(&InputStack), RealBuf, pos, len, Line, err, a, b) + +#define PSERRA(pos,len,err,a) \ + PrintError(CurStkName(&InputStack), RealBuf, pos, len, Line, err, a) + +#define HEREA(len, err, a) PSERRA(BufPtr - Buf - 1, len, err, a) +#define PSERR(pos,len,err) PSERRA(pos,len,err,"") + +#define HERE(len, err) HEREA(len, err, "") + +#define SKIP_BACK(ptr, c, check) \ + while((c = *ptr--)) \ + { \ + ifn(check) break; \ + } \ + ptr++; + +#define SKIP_AHEAD(ptr, c, check) \ + while((c = *ptr++)) \ + { \ + ifn(check) \ + break; \ + } \ + ptr--; + + +/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ + +static ULONG Line; + +static STRPTR RealBuf, LineCpy, BufPtr; + +static int ItFlag = efNone; + +NEWBUF(Buf, BUFSIZ); +NEWBUF(CmdBuffer, BUFSIZ); +NEWBUF(ArgBuffer, BUFSIZ); + +static enum ErrNum PerformCommand(const STRPTR Cmd, STRPTR Arg); + +#ifdef isdigit +CTYPE(isdigit) +#else +# define my_isdigit isdigit +#endif + +#ifdef isalpha +CTYPE(isalpha) +#else +# define my_isalpha isalpha +#endif + +/* + * Reads in a TeX token from Src and puts it in Dest. + * + */ + + +static STRPTR GetLTXToken(STRPTR Src, STRPTR Dest) +{ + int Char; + + if(Src && *Src) + { + if(*Src == '\\') + { + *Dest++ = *Src++; + Char = *Dest++ = *Src++; + + if(istex(Char)) + { + while(istex(Char)) + Char = *Dest++ = *Src++; + + Src--; + Dest--; + } + + } + else + *Dest++ = *Src++; + *Dest = 0; + } + else + Src = NULL; + + return(Src); +} + + +/* + * Scans the `SrcBuf' for a LaTeX arg, and puts that arg into `Dest'. + * `Until' specifies what we'll copy. Assume the text is + * "{foo}bar! qux} baz". + * GET_TOKEN => "{foo}" + * GET_STRIP_TOKEN => "foo" + * '!' => "{foo}bar!" (i.e. till the first "!") + * Returns NULL if we can't find the argument, ptr to the first character + * after the argument in other cases. + * + * If one of the tokens found is in the wl wordlist, and we're in the + * outer most paren, and Until isn't a single character, we'll stop. + * You may pass NULL as wl. + * + * We assume that you've previously skipped over leading spaces. + * + */ + +#define GET_TOKEN 256 +#define GET_STRIP_TOKEN 257 + +static STRPTR GetLTXArg(STRPTR SrcBuf, + const STRPTR OrigDest, + const int Until, + struct WordList *wl) + +{ + STRPTR Retval, TmpPtr, Dest = OrigDest; + ULONG DeliCnt = 0; + + *Dest = 0; + TmpPtr = SrcBuf; + + switch(Until) + { + case GET_STRIP_TOKEN: + case GET_TOKEN: + while((Retval = GetLTXToken(TmpPtr, Dest))) + { + switch(*Dest) + { + case '{': + DeliCnt++; + break; + case '}': + DeliCnt--; + } + Dest += Retval - TmpPtr; + TmpPtr = Retval; + + if(!DeliCnt || ((DeliCnt == 1) && wl && HasWord(Dest, wl))) + break; + } + + if(Retval && (*OrigDest == '{') && (Until == GET_STRIP_TOKEN)) + { + strcpy(OrigDest, OrigDest + 1); + OrigDest[strlen(OrigDest) - 1] = 0; + } + break; + default: + DeliCnt = TRUE; + while((Retval = GetLTXArg(TmpPtr, Dest, GET_TOKEN, NULL))) + { + if(*Dest == Until) + DeliCnt = FALSE; + + Dest += Retval - TmpPtr; + TmpPtr = Retval; + + if(!DeliCnt) + break; + } + break; + } + *Dest = 0; + + return(Retval); +} + + +static STRPTR MakeCpy(void) +{ + if(!LineCpy) + LineCpy = strdup(RealBuf); + + if(!LineCpy) + PrintPrgErr(pmStrDupErr); + + return(LineCpy); +} + +static STRPTR PreProcess(void) +{ + /* First, kill comments. */ + + STRPTR TmpPtr; + + strcpy(Buf, RealBuf); + + TmpPtr = Buf; + + while((TmpPtr = strchr(TmpPtr, '%'))) + { + if(TmpPtr[-1] != '\\') + { + PSERR(TmpPtr - Buf, 1, emComment); + *TmpPtr = 0; + break; + } + TmpPtr++; + } + return(Buf); +} + +/* + * Interpret environments + */ + +static void PerformEnv(STRPTR Env, BOOL Begin) +{ +static + TEXT VBStr [BUFSIZ] = ""; + + if(HasWord(Env, &MathEnvir)) + { + MathMode += Begin ? 1 : -1; + MathMode = max(MathMode, 0); + } + + if(Begin && HasWord(Env, &VerbEnvir)) + { + VerbMode = TRUE; + strcpy(VBStr, "\\end{"); + strcat(VBStr, Env); + strcat(VBStr, "}"); + VerbStr = VBStr; + } +} + +static STRPTR SkipVerb(void) +{ + STRPTR TmpPtr = BufPtr; + int TmpC; + + if(VerbMode && BufPtr) + { + ifn(TmpPtr = strstr(BufPtr, VerbStr)) + BufPtr = &BufPtr[strlen(BufPtr)]; + else + { + VerbMode = FALSE; + BufPtr = &TmpPtr[strlen(VerbStr)]; + SKIP_AHEAD(BufPtr, TmpC, LATEX_SPACE(TmpC)); + if(*BufPtr) + PSERR(BufPtr - Buf, strlen(BufPtr) - 2, emIgnoreText); + } + } + return(TmpPtr); +} + +#define CHECKDOTS(wordlist, dtval) \ +for(i = 0; (i < wordlist.Stack.Used) && !(Back && Front); i++) \ + { if(!strafter(PstPtr, wordlist.Stack.Data[i])) \ + Back = dtval; \ + if(!strinfront(PrePtr, wordlist.Stack.Data[i])) \ + Front = dtval; } + + + +/* + * Checks that the dots are correct + */ + +static enum DotLevel CheckDots(STRPTR PrePtr, STRPTR PstPtr) +{ + ULONG i; + int TmpC; + enum DotLevel Front = dtUnknown, Back = dtUnknown; + + if(MathMode) + { + PrePtr--; +#define SKIP_EMPTIES(macro, ptr) macro(ptr, TmpC, \ +(LATEX_SPACE(TmpC) || (TmpC == '{') || (TmpC == '}'))) + + SKIP_EMPTIES(SKIP_BACK, PrePtr); + SKIP_EMPTIES(SKIP_AHEAD, PstPtr); + + CHECKDOTS(CenterDots, dtCDots); + + ifn(Front && Back) + { + CHECKDOTS(LowDots, dtLDots); + } + return(Front & Back); + } + else + return(dtLDots); + +} + +static STRPTR Dot2Str(enum DotLevel dl) +{ + STRPTR Retval = INTERNFAULT; + switch(dl) + { + case dtUnknown: + Retval = "\\cdots or \\ldots"; + break; + case dtDots: + Retval = "\\dots"; + break; + case dtCDots: + Retval = "\\cdots"; + break; + case dtLDots: + Retval = "\\ldots"; + break; + } + return Retval; +} + +/* + * Wipes a command, according to the definition in WIPEARG + */ + +static void WipeArgument(STRPTR Cmd, STRPTR CmdPtr) +{ + ULONG CmdLen = strlen(Cmd); + STRPTR Format, TmpPtr; + int c, TmpC; + + if(Cmd && *Cmd) + { + TmpPtr = &CmdPtr[CmdLen]; + Format = &Cmd[CmdLen + 1]; + + while(TmpPtr && *TmpPtr && *Format) + { + switch(c = *Format++) + { + case '*': + SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC)); + if(*TmpPtr == '*') + TmpPtr++; + break; + case '[': + SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC)); + if(*TmpPtr == '[') + TmpPtr = GetLTXArg(TmpPtr, ArgBuffer, ']', NULL); + break; + case '{': + SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC)); + TmpPtr = GetLTXArg(TmpPtr, ArgBuffer, GET_TOKEN, NULL); + case '}': + case ']': + break; + default: + PrintPrgErr(pmWrongWipeTemp, &Cmd[strlen(Cmd) + 1]); + break; + } + } + + if(TmpPtr) + strwrite(CmdPtr, VerbClear, TmpPtr - CmdPtr); + else + strxrep(CmdPtr, "()[]{}", *VerbClear); + } +} + +/* + * Checks italic. + * + */ + +static void CheckItal(const STRPTR Cmd) +{ + int TmpC; + STRPTR TmpPtr; + if(HasWord(Cmd, &NonItalic)) + ItState = itOff; + elif(HasWord(Cmd, &Italic)) + ItState = itOn; + elif(HasWord(Cmd, &ItalCmd)) + { + TmpPtr = BufPtr; + SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC)); + if(*TmpPtr == '{') + { + ItFlag = ItState? efItal : efNoItal; + ItState = itOn; + } + } +} + +/* + * Interpret isolated commands. + * + */ + +static void PerformBigCmd(STRPTR CmdPtr) +{ + STRPTR TmpPtr, + ArgEndPtr; + ULONG CmdLen = strlen(CmdBuffer); + int TmpC; + enum ErrNum + ErrNum; + struct ErrInfo *ei; + + enum DotLevel dotlev, realdl = dtUnknown; + + TmpPtr = BufPtr; + SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC)); + + ArgEndPtr = GetLTXArg(TmpPtr, ArgBuffer, GET_STRIP_TOKEN, NULL); + + /* Kill `\verb' commands */ + + if(WipeVerb) + { + if(!strcmp(CmdBuffer, "\\verb")) + { + if(*BufPtr) + { + if((TmpPtr = strchr(&BufPtr[1], *BufPtr))) + strwrite(CmdPtr, VerbClear, (TmpPtr - CmdPtr) + 1); + else + PSERR(CmdPtr - Buf, 5, emNoArgFound); + } + } + } + + if(HasWord(CmdBuffer, &IJAccent)) + { + if(ArgEndPtr) + { + TmpPtr = ArgBuffer; + SKIP_AHEAD(TmpPtr, TmpC, TmpC == '{'); /* } */ + + if((*TmpPtr == 'i') || (*TmpPtr == 'j')) + PrintError(CurStkName(&InputStack), RealBuf, + CmdPtr - Buf, + (LONG) strlen(CmdBuffer), Line, + emAccent, CmdBuffer, + *TmpPtr, MathMode? "math" : ""); + } + else + PSERR(CmdPtr - Buf, CmdLen, emNoArgFound); + } + + if(HasWord(CmdBuffer, &NotPreSpaced) && + isspace(CmdPtr[-1])) + PSERRA(CmdPtr - Buf - 1, 1, emRemPSSpace, CmdBuffer); + + if((TmpPtr = HasWord(CmdBuffer, &NoCharNext))) + { + STRPTR BPtr = BufPtr; + + TmpPtr += strlen(TmpPtr) + 1; + SKIP_AHEAD(BPtr, TmpC, LATEX_SPACE(TmpC)); + + if(strchr(TmpPtr, *BPtr)) + { + PSERR2(CmdPtr - Buf, CmdLen, emNoCharMean, + CmdBuffer, *BPtr); + } + } + + if(!strcmp(CmdBuffer, "\\begin") || + !strcmp(CmdBuffer, "\\end")) + { + if(ArgEndPtr) + { + if(!strcmp(ArgBuffer, "document")) + InHeader = FALSE; + + if(CmdBuffer[1] == 'b') + { + ifn(PushErr(ArgBuffer, Line, CmdPtr - Buf, + CmdLen, MakeCpy(), + &EnvStack)) + PrintPrgErr(pmNoStackMem); + } + else + { + if((ei = PopErr(&EnvStack))) + { + if(strcmp(ei->Data, ArgBuffer)) + PrintError(CurStkName(&InputStack), RealBuf, + CmdPtr - Buf, + (LONG) strlen(CmdBuffer), + Line, emExpectC, ei->Data, ArgBuffer); + + FreeErrInfo(ei); + } + else + PrintError(CurStkName(&InputStack), RealBuf, + CmdPtr - Buf, + (LONG) strlen(CmdBuffer), + Line, emSoloC, ArgBuffer); + } + + PerformEnv(ArgBuffer, (BOOL) CmdBuffer[1] == 'b'); + } else + PSERR(CmdPtr - Buf, CmdLen, emNoArgFound); + } + + CheckItal(CmdBuffer); + + if((ErrNum = PerformCommand(CmdBuffer, BufPtr))) + PSERR(CmdPtr - Buf, CmdLen, ErrNum); + + if(!strcmp(CmdBuffer, "\\cdots")) + realdl = dtCDots; + + if(!strcmp(CmdBuffer, "\\ldots")) + realdl = dtLDots; + + if(!strcmp(CmdBuffer, "\\dots")) + realdl = dtLDots; + + if(realdl != dtUnknown) + { + dotlev = CheckDots(CmdPtr, BufPtr); + if(dotlev && (dotlev != realdl)) + { + TmpPtr = Dot2Str(dotlev); + PSERRA(CmdPtr - Buf, CmdLen, emEllipsis, TmpPtr); + } + } + + if((TmpPtr = HasWord(CmdBuffer, &WipeArg))) + WipeArgument(TmpPtr, CmdPtr); +} + +/* + * Check user abbreviations. Pass a pointer to the `.'; + * also ensure that it's followed by spaces, etc. + * + * Note: We assume that all abbrevs have been transferred from + * AbbrevCase into Abbrev. + */ + +static void CheckAbbrevs(const STRPTR Buffer) +{ + LONG i; + STRPTR TmpPtr, AbbPtr; + + if(INUSE(emInterWord)) + { + TmpPtr = TmpBuffer + Abbrev.MaxLen + 2; + *TmpPtr = 0; + AbbPtr = Buffer; + + for(i = Abbrev.MaxLen; + i >= 0; + i--) + { + *--TmpPtr = *AbbPtr--; + if(!isalpha(*AbbPtr) && HasWord(TmpPtr, &Abbrev)) + PSERR(Buffer - Buf + 1, 1, emInterWord); + if(!*AbbPtr) + break; + } + } +} + + +/* + * Check misc. things which can't be included in the main loop. + * + */ + +static void CheckRest(void) +{ + ULONG Count; + LONG CmdLen; + STRPTR UsrPtr; + + /* Search for user-specified warnings */ + + if(INUSE(emUserWarn)) + { + strcpy(TmpBuffer, Buf); + FORWL(Count, UserWarn) + { + for(UsrPtr = TmpBuffer; + (UsrPtr = strstr(UsrPtr, UserWarn.Stack.Data[Count])); + UsrPtr++) + { + CmdLen = strlen(UserWarn.Stack.Data[Count]); + PSERR(UsrPtr - TmpBuffer, CmdLen, emUserWarn); + } + } + + + strlwr(TmpBuffer); + + FORWL(Count, UserWarnCase) + { + for(UsrPtr = TmpBuffer; + (UsrPtr = strstr(UsrPtr, UserWarnCase.Stack.Data[Count])); + UsrPtr++) + { + CmdLen = strlen(UserWarnCase.Stack.Data[Count]); + PSERR(UsrPtr - TmpBuffer, CmdLen, emUserWarn); + } + } + } +} + + +/* + * Checks that the dash-len is correct. + */ + +static void CheckDash(void) +{ + STRPTR TmpPtr; + int TmpC; + LONG TmpCount, Len; + struct WordList *wl = NULL; + ULONG i; + BOOL Errored; + STRPTR PrePtr = &BufPtr[-2]; + + TmpPtr = BufPtr; + SKIP_AHEAD(TmpPtr, TmpC, TmpC == '-'); + TmpCount = TmpPtr - BufPtr + 1; + + if(MathMode) + { + if(TmpCount > 1) + HERE(TmpCount, emWrongDash); + } + else + { + if(LATEX_SPACE(*PrePtr) && LATEX_SPACE(*TmpPtr)) + wl = &WordDash; + if(isdigit(*PrePtr) && isdigit(*TmpPtr)) + wl = &NumDash; + if(isalpha(*PrePtr) && isalpha(*TmpPtr)) + wl = &HyphDash; + + if(wl) + { + Errored = TRUE; + FORWL(i, *wl) + { + Len = strtol(wl->Stack.Data[i], NULL, 0); + if(TmpCount == Len) + { + Errored = FALSE; + break; + } + } + if(Errored) + HERE(TmpCount, emWrongDash); + } + } +} + +/* + * Pushes and pops nesting characters. + * + */ + +static void HandleBracket(int Char) +{ + ULONG BrOffset; /* Offset into BrOrder array */ + struct ErrInfo *ei; + int TmpC, Match; + TEXT ABuf[2], BBuf[2]; + STRPTR TmpPtr; + + AddBracket(Char); + + if((BrOffset = BrackIndex(Char)) != ~0UL) + { + if(BrOffset & 1) /* Closing bracket of some sort */ + { + if((ei = PopErr(&CharStack))) + { + Match = MatchBracket(*(ei->Data)); + if(ei->Flags & efNoItal) + { + if(ItState == itOn) + { + TmpPtr = BufPtr; + SKIP_AHEAD(TmpPtr, TmpC, TmpC == '}'); + + if(!strchr(LTX_SmallPunc, *TmpPtr)) + HERE(1, emNoItFound); + } + + ItState = FALSE; + } + elif(ei->Flags & efItal) + ItState = TRUE; + FreeErrInfo(ei); + } + else + Match = 0; + + if(Match != Char) + { + ABuf[0] = Match; + BBuf[0] = Char; + ABuf[1] = BBuf[1] = 0; + if(Match) + PrintError(CurStkName(&InputStack), RealBuf, + BufPtr - Buf - 1, 1, Line, + emExpectC, + ABuf, BBuf); + else + HEREA(1, emSoloC, BBuf); + } + + } + else /* Opening bracket of some sort */ + { + if((ei = PushChar(Char, Line, BufPtr - Buf - 1, + &CharStack, MakeCpy()))) + { + if(Char == '{') + { + switch(ItFlag) + { + default: + ei->Flags = ItFlag; + ItFlag = efNone; + break; + case efNone: + ei->Flags |= ItState? + efItal : efNoItal; + } + } + } + + else + PrintPrgErr(pmNoStackMem); + } + } +} + + + +/* + * Searches the `Buf' for possible errors, and prints the errors. `Line' + * is supplied for error printing. + */ + +BOOL FindErr(const STRPTR _RealBuf, const ULONG _Line) +{ + STRPTR + CmdPtr, /* We'll have to copy each command out. */ + PrePtr, /* Ptr to char in front of command, NULL if + * the cmd appears as the first character */ + TmpPtr, /* Temporary pointer */ + ErrPtr; /* Ptr to where an error started */ + + int + TmpC, /* Just a temp var used throughout the proc.*/ + MatchC, + Char; /* Char. currently processed */ + ULONG CmdLen; /* Length of misc. things */ + BOOL MixingQuotes; + +#if defined(_MSC_VER) && (_MSC_VER < 1300) + int (* pstcb)(int c); +#else + int (CDECL * pstcb)(int c); +#endif + + enum DotLevel dotlev; + + LineCpy = NULL; + + if(_RealBuf) + { + RealBuf = _RealBuf; + Line = _Line; + + BufPtr = PreProcess(); + + BufPtr = SkipVerb(); + + while(BufPtr && *BufPtr) + { + PrePtr = BufPtr - 1; + Char = *BufPtr++; + if(isspace(Char)) + Char = ' '; + + switch(Char) + { + case '~': + TmpPtr = NULL; + if(isspace(*PrePtr)) + TmpPtr = PrePtr; + elif(isspace(*BufPtr)) + TmpPtr = BufPtr; + + if(TmpPtr) + PSERR(TmpPtr - Buf, 1, emDblSpace); + break; + + case 'X': + case 'x': + TmpPtr = PrePtr; + + SKIP_BACK(TmpPtr, TmpC, + (LATEX_SPACE(TmpC) || strchr("{}$", TmpC))); + + if(isdigit(*TmpPtr)) + { + TmpPtr = BufPtr; + + SKIP_AHEAD(TmpPtr, TmpC, + (LATEX_SPACE(TmpC) || strchr("{}$", TmpC))); + + if(isdigit(*TmpPtr)) + HERE(1, emUseTimes); + } + /* FALLTHRU */ + /* CTYPE: isalpha() */ + case 'a': case 'b': case 'c': case 'd': + case 'e': case 'f': case 'g': case 'h': + case 'i': case 'j': case 'k': case 'l': + case 'm': case 'n': case 'o': case 'p': + case 'q': case 'r': case 's': case 't': + case 'u': case 'v': case 'w': /* case 'x': */ + case 'y': case 'z': + + case 'A': case 'B': case 'C': case 'D': + case 'E': case 'F': case 'G': case 'H': + case 'I': case 'J': case 'K': case 'L': + case 'M': case 'N': case 'O': case 'P': + case 'Q': case 'R': case 'S': case 'T': + case 'U': case 'V': case 'W': /* case 'X': */ + case 'Y': case 'Z': + if(!isalpha(*PrePtr) && (*PrePtr != '\\') && MathMode) + { + TmpPtr = BufPtr; + CmdPtr = CmdBuffer; + do + { + *CmdPtr++ = Char; + Char = *TmpPtr++; + } while(isalpha(Char)); + + *CmdPtr = 0; + + if(HasWord(CmdBuffer, &MathRoman)) + HEREA(strlen(CmdBuffer), emWordCommand, CmdBuffer); + } + + break; + case ' ': + TmpPtr = BufPtr; + SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC)); + + if(*TmpPtr && *PrePtr) + { + if((TmpPtr - BufPtr) > 0) + { + HERE(TmpPtr - BufPtr + 1, emMultiSpace); + strwrite(BufPtr, VerbClear, TmpPtr - BufPtr - 1); + } + } + break; + + case '.': + if((Char == *BufPtr) && (Char == BufPtr[1])) + { + dotlev = CheckDots(&PrePtr[1], &BufPtr[2]); + TmpPtr = Dot2Str(dotlev); + HEREA(3, emEllipsis, TmpPtr); + } + + /* Regexp: "([^A-Z@.])\.[.!?:;]*\s+[a-z]" */ + + TmpPtr = BufPtr; + SKIP_AHEAD(TmpPtr, TmpC, strchr(LTX_GenPunc, TmpC)); + if(LATEX_SPACE(*TmpPtr)) + { + if(!isupper(*PrePtr) && (*PrePtr != '@') && + (*PrePtr != '.')) + { + SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC)); + if(islower(*TmpPtr)) + PSERR(BufPtr - Buf, 1, emInterWord); + else + CheckAbbrevs(&BufPtr[-1]); + } + } + + /* FALLTHRU */ + case ':': case '?': case '!': case ';': + /* Regexp: "[A-Z][A-Z][.!?:;]\s+" */ + + if(isspace(*BufPtr) && isupper(*PrePtr) && + (isupper(PrePtr[-1]) || (Char != '.'))) + HERE(1, emInterSent); + + /* FALLTHRU */ + case ',': + if(isspace(*PrePtr) && + !(isdigit(*BufPtr) && + ((BufPtr[-1] == '.') || (BufPtr[-1] == ',')))) + PSERR(PrePtr - Buf, 1, emSpacePunct); + + if(MathMode && + (((*BufPtr == '$') && (BufPtr[1] != '$')) || + (!strafter(BufPtr, "\\)")))) + HEREA(1, emPunctMath, "outside inner"); + + if(!MathMode && + (((*PrePtr == '$') && (PrePtr[-1] == '$')) || + (!strinfront(PrePtr, "\\]")))) + HEREA(1, emPunctMath, "inside display"); + + break; + case '\'': + case '`': + if((Char == *BufPtr) && (Char == BufPtr[1])) + { + PrintError(CurStkName(&InputStack), RealBuf, + BufPtr - Buf - 1, 3, Line, + emThreeQuotes, + Char, Char, Char, + Char, Char, Char); + } + + if(Char == '\'') + MatchC = '`'; + else + MatchC = '\''; + + TmpPtr = BufPtr; + SKIP_AHEAD(TmpPtr, TmpC, TmpC == Char); + + MixingQuotes = FALSE; + + if((*TmpPtr == MatchC) || (*TmpPtr == '\"') || + (*TmpPtr == '´')) + MixingQuotes = TRUE; + + SKIP_AHEAD(TmpPtr, TmpC, strchr("`\'\"´", TmpC)); + + if(MixingQuotes) + HERE(TmpPtr - BufPtr + 1, emQuoteMix); + + switch(Char) + { + case '\'': + if(isalpha(*TmpPtr) && + (strchr(LTX_GenPunc, *PrePtr) || isspace(*PrePtr))) + HERE(TmpPtr - BufPtr + 1, emBeginQ); + + /* Now check quote style */ +#define ISPUNCT(ptr) (strchr(LTX_GenPunc, *ptr) && (ptr[-1] != '\\')) + + /* We ignore all single words/abbreviations in quotes */ + + { + STRPTR WordPtr = PrePtr; + SKIP_BACK(WordPtr, TmpC, (isalnum(TmpC) || + strchr(LTX_GenPunc, TmpC))); + + if(*WordPtr != '`') + { + if(*PrePtr && (Quote != quTrad) && ISPUNCT(PrePtr)) + PSERRA(PrePtr - Buf, 1, emQuoteStyle, + "in front of"); + + if(*TmpPtr && (Quote != quLogic) && + ISPUNCT(TmpPtr)) + PSERRA(TmpPtr - Buf, 1, emQuoteStyle, "after"); + } + } + + break; + case '`': + if(isalpha(*PrePtr) && + (strchr(LTX_GenPunc, *TmpPtr) || isspace(*TmpPtr))) + HERE(TmpPtr - BufPtr + 1, emEndQ); + break; + } + BufPtr = TmpPtr; + break; + case '"': + HERE(1, emUseQuoteLiga); + break; + + /* One of these are unnecessary, but what the heck... */ + case 180: /* ´. NOTE: '\xb4' gets converted to - something*/ + case ~(0xff &(~180)): /* This yields 0xff...fb4 in */ + /* arbitrary precision. */ + + HERE(1, emUseOtherQuote); + break; + + case '_': + case '^': + if(*PrePtr != '\\') + { + TmpPtr = PrePtr; + SKIP_BACK(TmpPtr, TmpC, LATEX_SPACE(TmpC)); + + CmdLen = 1; + + switch(*TmpPtr) + { + /*{*/ + case '}': + if(PrePtr[-1] != '\\') + break; + + CmdLen++; + PrePtr--; + /* FALLTHRU */ + /*[(*/ + case ')': + case ']': + PSERR(PrePtr - Buf, CmdLen, emEnclosePar); + } + + TmpPtr = BufPtr; + SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC)); + + ErrPtr = TmpPtr; + + if(isalpha(*TmpPtr)) + pstcb = &my_isalpha; + elif(isdigit(*TmpPtr)) + pstcb = &my_isdigit; + else + break; + + while((*pstcb)(*TmpPtr++)) + ; + TmpPtr--; + + if((TmpPtr - ErrPtr) > 1) + PSERR(ErrPtr - Buf, TmpPtr - ErrPtr, emEmbrace); + } + break; + case '-': + CheckDash(); + break; + case '\\': /* Command encountered */ + BufPtr = GetLTXToken(--BufPtr, CmdBuffer); + + if(LATEX_SPACE(*PrePtr)) + { + if(HasWord(CmdBuffer, &Linker)) + PSERR(PrePtr - Buf, 1, emNBSpace); + if(HasWord(CmdBuffer, &PostLink)) + PSERR(PrePtr - Buf, 1, emFalsePage); + } + + if(LATEX_SPACE(*BufPtr) && !MathMode && + (!HasWord(CmdBuffer, &Silent)) && + (strlen(CmdBuffer) != 2)) + { + PSERR(BufPtr - Buf, 1, emSpaceTerm); + } + elif((*BufPtr == '\\') && (!isalpha(BufPtr[1])) && + (!LATEX_SPACE(BufPtr[1]))) + PSERR(BufPtr - Buf, 2, emNotIntended); + + PerformBigCmd(PrePtr + 1); + BufPtr = SkipVerb(); + + break; + + LOOP(bracket, + case '(': + ifn(!*PrePtr || LATEX_SPACE(*PrePtr) || isdigit(*PrePtr) || + strchr("([{`~", *PrePtr)) + { + if(PrePtr[-1] != '\\') /* Short cmds */ + { + TmpPtr = PrePtr; + SKIP_BACK(TmpPtr, TmpC, istex(TmpC)); + if(*TmpPtr != '\\') /* Long cmds */ + PSERRA(BufPtr - Buf - 1, 1, emSpaceParen, + "in front of"); + } + } + if(isspace(*BufPtr)) + PSERRA(BufPtr - Buf, 1, emNoSpaceParen, "after"); + + LAST(bracket); + case ')': + if(isspace(*PrePtr)) + PSERRA(BufPtr - Buf - 1, 1, emNoSpaceParen, + "in front of"); + if(isalpha(*BufPtr)) + PSERRA(BufPtr - Buf, 1, emSpaceParen, "after"); + + LAST(bracket); + ) + + case '}': + case '{': + case '[': + case ']': + HandleBracket(Char); + break; + case '$': + if(*PrePtr != '\\') + { + if(*BufPtr == '$') + BufPtr++; + MathMode ^= TRUE; + } + + break; + } + } + + if(!VerbMode) + { + CheckRest(); + } + } + + return(TRUE); +} + +/* + * Tries to create plural forms for words. Put a '%s' where a + * suffix should be put, e.g. "warning%s". Watch your %'s! + */ + +static void Transit(FILE *fh, ULONG Cnt, STRPTR Str) +{ + switch(Cnt) + { + case 0: + fputs("No ", fh); + fprintf(fh, Str, "s"); + break; + case 1: + fputs("One ", fh); + fprintf(fh, Str, ""); + break; + default: + fprintf(fh, "%ld ", Cnt); + fprintf(fh, Str, "s"); + break; + } +} + +/* + * Prints the status/conclusion after doing all the testing, including + * bracket stack status, math mode, etc. + */ + +void PrintStatus(ULONG Lines) +{ + ULONG Cnt; + struct ErrInfo *ei; + + + while((ei = PopErr(&CharStack))) + { + PrintError(ei->File, ei->LineBuf, ei->Column, + ei->ErrLen, ei->Line, emNoMatchC, + (STRPTR) ei->Data); + FreeErrInfo(ei); + } + + while((ei = PopErr(&EnvStack))) + { + PrintError(ei->File, ei->LineBuf, ei->Column, + ei->ErrLen, ei->Line, emNoMatchC, + (STRPTR) ei->Data); + FreeErrInfo(ei); + } + + if(MathMode) + { + PrintError(CurStkName(&InputStack), "", 0L, 0L, Lines, + emMathStillOn); + } + + for(Cnt = 0L; Cnt < (NUMBRACKETS>>1); Cnt++) + { + if(Brackets[Cnt << 1] != Brackets[(Cnt << 1) + 1]) + { + PrintError(CurStkName(&InputStack), "", 0L, 0L, Lines, + emNoMatchCC, + BrOrder[Cnt<<1], BrOrder[(Cnt<<1) + 1]); + } + } + + if(!Quiet) + { + Transit(stderr, ErrPrint, "error%s printed; "); + Transit(stderr, WarnPrint, "warning%s printed; "); + Transit(stderr, UserSupp, "user suppressed warning%s printed.\n"); + } +} + + + +/* + * Uses OutputFormat. Be sure that `String' + * does not contain tabs, newlines, etc. + * Prints a formatted string. Formatting codes understood: + * %b - string to print Between fields (from -s option) + * %c - Column position of error + * %d - lenght of error (Digit) + * %f - current Filename + * %i - Turn on inverse printing mode. + * %I - Turn off inverse printing mode. + * %k - Kind of error (warning, error, message) + * %l - Line number of error + * %m - warning Message + * %n - warning Number + * %u - an Underlining line (like the one which appears when using -v1) + * %r - part of line in front of error ('S' - 1) + * %s - part of line which contains error (String) * %t - part of line after error ('S' + 1) + */ + + +void PrintError(const STRPTR File, const STRPTR String, + const LONG Position, const LONG Len, + const LONG LineNo, const enum ErrNum Error, ...) +{ + static /* Just to reduce stack usage... */ + TEXT PrintBuffer[BUFSIZ]; + va_list MsgArgs; + + STRPTR LastNorm = OutputFormat, of; + int c; + + enum Context Context; + + if(betw(emMinFault, Error, emMaxFault)) + { + switch(LaTeXMsgs[Error].InUse) + { + case iuOK: + do + { + Context = LaTeXMsgs[Error].Context; + + if(!HeadErrOut) + Context |= ctOutHead; + +#define RGTCTXT(Ctxt, Var) if((Context & Ctxt) && !(Var)) break; + + RGTCTXT(ctInMath, MathMode); + RGTCTXT(ctOutMath, !MathMode); + RGTCTXT(ctInHead, InHeader); + RGTCTXT(ctOutHead, !InHeader); + + switch(LaTeXMsgs[Error].Type) + { + case etWarn: + WarnPrint++; + break; + case etErr: + ErrPrint++; + break; + case etMsg: + break; + } + + while((of = strchr(LastNorm, '%'))) + { + c = *of; + *of = 0; + + fputs(LastNorm, OutputFile); + + *of++ = c; + + switch(c = *of++) + { + case 'b': + fputs(Delimit, OutputFile); + break; + case 'c': + fprintf(OutputFile, "%ld", Position + 1); + break; + case 'd': + fprintf(OutputFile, "%ld", Len); + break; + case 'f': + fputs(File, OutputFile); + break; + case 'i': + fputs(ReverseOn, OutputFile); + break; + case 'I': + fputs(ReverseOff, OutputFile); + break; + case 'k': + switch(LaTeXMsgs[Error].Type) + { + case etWarn: + fprintf(OutputFile, "Warning"); + break; + case etErr: + fprintf(OutputFile, "Error"); + break; + case etMsg: + fprintf(OutputFile, "Message"); + break; + } + break; + case 'l': + fprintf(OutputFile, "%ld", LineNo); + break; + case 'm': + va_start(MsgArgs, Error); + vfprintf(OutputFile, LaTeXMsgs[Error].Message, + MsgArgs); + va_end(MsgArgs); + break; + case 'n': + fprintf(OutputFile, "%d", Error); + break; + case 'u': + sfmemset(PrintBuffer, ' ', (LONG) Position); + + sfmemset(&PrintBuffer[Position], '^', Len); + PrintBuffer[Position + Len] = 0; + fputs(PrintBuffer, OutputFile); + break; + case 'r': + substring(String, PrintBuffer, 0L, Position); + fputs(PrintBuffer, OutputFile); + break; + case 's': + substring(String, PrintBuffer, Position, Len); + fputs(PrintBuffer, OutputFile); + break; + case 't': + substring(String, PrintBuffer, Position + Len, LONG_MAX); + fputs(PrintBuffer, OutputFile); + break; + default: + fputc(c, OutputFile); + break; + } + LastNorm = of; + } + fputs(LastNorm, OutputFile); + } while(FALSE); + break; + case iuNotUser: + UserSupp++; + break; + case iuNotSys: + break; + } + } +} + +/* + * All commands isolated is routed through this command, so we can + * update global statuses like math mode and whether @ is a letter + * or not. + */ + +static enum ErrNum PerformCommand(const STRPTR Cmd, STRPTR Arg) +{ + STRPTR Argument = ""; + enum ErrNum + en = emMinFault; + int TmpC; + + if(!strcmp(Cmd, "\\makeatletter")) + AtLetter = TRUE; + elif(!strcmp(Cmd, "\\makeatother")) + AtLetter = FALSE; + elif(InputFiles && + !(strcmp(Cmd, "\\input") && strcmp(Cmd, "\\include"))) + { + SKIP_AHEAD(Arg, TmpC, LATEX_SPACE(TmpC)); + if(*Arg == '{') /* } */ + { + if(GetLTXArg(Arg, TmpBuffer, GET_STRIP_TOKEN, NULL)) + Argument = TmpBuffer; + } + else + Argument = strip(Arg, STRP_BTH); + + ifn(Argument && PushFileName(Argument, &InputStack)) + en = emNoCmdExec; + } + elif(HasWord(Cmd, &Primitives)) + en = emTeXPrim; + elif(*Cmd == '\\') + { + /* Quicker check of single lettered commands. */ + switch(Cmd[1]) + { + case '(': + case '[': + MathMode = TRUE; + break; + case ']': + case ')': + MathMode = FALSE; + break; + case '/': + switch(ItState) + { + case itOn: + ItState = itCorrected; + Argument = Arg; + + SKIP_AHEAD(Argument, TmpC, TmpC == '{' || TmpC == '}'); + + if(strchr(".,", *Argument)) + en = emItPunct; + + break; + case itCorrected: + en = emItDup; + break; + case itOff: + en = emItInNoIt; + } + break; + } + } + + return(en); +} diff --git a/Build/source/texk/chktex/FindErrs.h b/Build/source/texk/chktex/FindErrs.h new file mode 100644 index 00000000000..4ce4924dec0 --- /dev/null +++ b/Build/source/texk/chktex/FindErrs.h @@ -0,0 +1,195 @@ +/* + * ChkTeX v1.5, header file for main program. + * Copyright (C) 1995-96 Jens T. Berger Thielemann + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Contact the author at: + * Jens Berger + * Spektrumvn. 4 + * N-0666 Oslo + * Norway + * E-mail: <jensthi@ifi.uio.no> + * + * + */ + +#ifndef FINDERRS_H +#define FINDERRS_H +#ifndef FINDERRS_H +# include "FindErrs.h" +#endif /* FINDERRS_H */ +#ifndef CHKTEX_H +# include "ChkTeX.h" +#endif /* CHKTEX_H */ + + +#undef ERRMSGS +#undef MSG + +#define ERRMSGS \ + MSG(emMinFault, etErr, iuOK, ctNone,\ + INTERNFAULT)\ + MSG(emSpaceTerm, etWarn, iuOK, ctOutMath,\ + "Command terminated with space.")\ + MSG(emNBSpace, etWarn, iuOK, ctNone,\ + "Non-breaking space (`~') should have been used.")\ + MSG(emEnclosePar, etWarn, iuOK, ctInMath,\ + "You should enclose the previous parenthesis with `{}\'.")\ + MSG(emItInNoIt, etWarn, iuOK, ctNone,\ + "Italic correction (`\\/') found in non-italic buffer.")\ + MSG(emItDup, etWarn, iuOK, ctNone,\ + "Italic correction (`\\/') found more than once.")\ + MSG(emNoItFound, etWarn, iuOK, ctNone,\ + "No italic correction (`\\/') found.")\ + MSG(emAccent, etWarn, iuOK, ctNone,\ + "Accent command `%s' needs use of `\\%c%s'.")\ + MSG(emWrongDash, etWarn, iuOK, ctOutMath,\ + "Wrong length of dash may have been used.")\ + MSG(emExpectC, etWarn, iuOK, ctNone,\ + "`%s' expected, found `%s'.")\ + MSG(emSoloC, etWarn, iuOK, ctNone,\ + "Solo `%s' found.")\ + MSG(emEllipsis, etWarn, iuOK, ctNone,\ + "You should use %s to achieve an ellipsis.")\ + MSG(emInterWord, etWarn, iuOK, ctOutMath,\ + "Interword spacing (`\\ ') should perhaps be used.")\ + MSG(emInterSent, etWarn, iuOK, ctOutMath,\ + "Intersentence spacing (`\\@') should perhaps be used.")\ + MSG(emNoArgFound, etErr, iuOK, ctNone,\ + "Could not find argument for command.")\ + MSG(emNoMatchC, etWarn, iuOK, ctOutMath,\ + "No match found for `%s'.")\ + MSG(emMathStillOn, etWarn, iuOK, ctNone,\ + "Mathmode still on at end of LaTeX file.")\ + MSG(emNoMatchCC, etWarn, iuOK, ctNone,\ + "Number of `%c' doesn't match the number of `%c'!")\ + MSG(emUseQuoteLiga, etWarn, iuOK, ctNone,\ + "Use either `` or '' as an alternative to `\"'.")\ + MSG(emUseOtherQuote, etWarn, iuOK, ctNone,\ + "Use \"'\" (ASCII 39) instead of \"´\" (ASCII 180).")\ + MSG(emUserWarn, etWarn, iuOK, ctNone,\ + "User-specified pattern found.")\ + MSG(emNotIntended, etWarn, iuNotSys, ctNone,\ + "This command might not be intended.")\ + MSG(emComment, etMsg, iuNotSys, ctNone,\ + "Comment displayed.")\ + MSG(emThreeQuotes, etWarn, iuOK, ctNone,\ + "Either %c\\,%c%c or %c%c\\,%c will look better.")\ + MSG(emFalsePage, etWarn, iuOK, ctOutMath,\ + "Delete this space to maintain correct pagereferences.")\ + MSG(emEmbrace, etWarn, iuOK, ctInMath,\ + "You might wish to put this between a pair of `{}'")\ + MSG(emSpacePunct, etWarn, iuOK, ctOutMath,\ + "You ought to remove spaces in front of punctuation.")\ + MSG(emNoCmdExec, etWarn, iuOK, ctNone,\ + "Could not execute LaTeX command.")\ + MSG(emItPunct, etWarn, iuOK, ctNone,\ + "Don't use \\/ in front of small punctuation.")\ + MSG(emUseTimes, etWarn, iuOK, ctNone,\ + "$\\times$ may look prettier here.")\ + MSG(emMultiSpace, etWarn, iuNotSys, ctOutMath,\ + "Multiple spaces detected in input.")\ + MSG(emIgnoreText, etWarn, iuOK, ctNone,\ + "This text may be ignored.")\ + MSG(emBeginQ, etWarn, iuOK, ctOutMath,\ + "Use ` to begin quotation, not '.")\ + MSG(emEndQ, etWarn, iuOK, ctOutMath,\ + "Use ' to end quotation, not `.")\ + MSG(emQuoteMix, etWarn, iuOK, ctNone,\ + "Don't mix quotes.")\ + MSG(emWordCommand, etWarn, iuOK, ctInMath,\ + "You should perhaps use `\\%s' instead.")\ + MSG(emSpaceParen, etWarn, iuOK, ctOutMath,\ + "You should put a space %s parenthesis.")\ + MSG(emNoSpaceParen, etWarn, iuOK, ctOutMath,\ + "You should avoid spaces %s parenthesis.")\ + MSG(emQuoteStyle, etWarn, iuOK, ctOutMath,\ + "You should not use punctuation %s quotes.")\ + MSG(emDblSpace, etWarn, iuOK, ctOutMath,\ + "Double space found.")\ + MSG(emPunctMath, etWarn, iuOK, ctNone,\ + "You should put punctuation %s math mode.")\ + MSG(emTeXPrim, etWarn, iuNotSys, ctNone,\ + "You ought to not use primitive TeX in LaTeX code.")\ + MSG(emRemPSSpace, etWarn, iuOK, ctOutMath,\ + "You should remove spaces in front of `%s'") \ + MSG(emNoCharMean, etWarn, iuOK, ctNone,\ + "`%s' is normally not followed by `%c'.") + +#undef MSG +#define MSG(num, type, inuse, ctxt, text) num, + +enum ErrNum +{ + ERRMSGS + emMaxFault +}; +#undef MSG + +enum Context { + ctNone = 0x00, + ctInMath = 0x01, + ctOutMath = 0x02, + ctInHead = 0x04, + ctOutHead = 0x08 +}; + +struct ErrMsg { + enum ErrNum Number; + enum { + etMsg, + etWarn, + etErr + } Type; + + enum { + iuNotSys, + iuNotUser, + iuOK + } InUse; + + /* Requirements posed upon environment */ + enum Context Context; + + STRPTR Message; +}; + +enum ItState { + itOff, + itOn, + itCorrected +}; + + +enum DotLevel { + dtUnknown = 0x0, + dtCDots = 0x1, + dtLDots = 0x2, + dtDots = 0x4 +}; + +extern struct ErrMsg + LaTeXMsgs [emMaxFault + 1]; + +extern STRPTR OutputFormat; + +BOOL FindErr __PROTO((STRPTR const, ULONG const)); +void PrintError __PROTO((const STRPTR, + const STRPTR, const LONG, const LONG, + const LONG, const enum ErrNum, ...)); +void PrintStatus __PROTO((ULONG Lines)); + +#endif /* FINDERRS */ diff --git a/Build/source/texk/chktex/HashWord.a b/Build/source/texk/chktex/HashWord.a new file mode 100644 index 00000000000..2954f84c766 --- /dev/null +++ b/Build/source/texk/chktex/HashWord.a @@ -0,0 +1,122 @@ +* +* ChkTeX v1.5, hashes a NULL-terminated string. +* Copyright (C) 1995-96 Jens T. Berger Thielemann +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +* +* Contact the author at: +* Jens Berger +* Spektrumvn. 4 +* N-0666 Oslo +* Norway +* E-mail: <jensthi@ifi.uio.no> +* +* + +******* HashWord() **************************************************** +* +* NAME +* HashWord() - hashes a NULL-terminated string +* +* SYNOPSIS +* +* HashVal = @HashWord(char *String) +* D0.W A0 +* +* HashVal = _HashWord(char *String) +* D0.W 4(SP) +* +* FUNCTION +* Hashes a NULL-terminated string. +* +* Well optimized (I believe), should be near optimal for this +* approach to hashing. Optimized for caches, loops and pipelines. +* Inner loop size: 12 bytes. +* +* +* INPUTS +* String - a NULL-terminated 8-bit C string. May be passed on +* stack or in A0, depending on entry point. +* +* RETURNS +* HashVal - the hashed value of the string. +* +* NOTES +* Registers a0 and d1 are destroyed. +* +* This function works best when there's a slight difference in +* the length of the strings. +* +* On non-Amiga machines a similar routine is implemented in +* "Utility.c" in the ChkTeX distribution. +* +* It should be possible to adopt this to other 680x0 computers, +* too. +* +* BUGS +* None known. +* +*********************************************************************** +* +* +* +* +* + + SECTION text,code + XDEF _HashWord + XDEF @HashWord + +HashShift EQU 5 * Experiments show this to be best; + * reasonable, as most TeX commands + * only use lowercase letters. + +REG_HashVal EQUR d0 +REG_TmpChar EQUR d1 +REG_StrLen EQUR d2 +REG_String EQUR a0 + +Len_Incr EQU 6 + +CLRD MACRO \1 * Clears data reg + moveq #0,\1 + ENDM + +_HashWord * Stack entry + move.l 4(sp),REG_String +@HashWord * Register entry + CLRD REG_HashVal + CLRD REG_TmpChar + + move.b (REG_String)+,REG_TmpChar + beq.b return + + move.l REG_StrLen,-(sp) + CLRD REG_StrLen + +loop + eor.w REG_TmpChar,REG_HashVal + addq.w #Len_Incr,REG_StrLen + ror.w #HashShift,REG_HashVal + eor.w REG_StrLen,REG_HashVal + + move.b (REG_String)+,REG_TmpChar + bne.b loop + + move.l (sp)+,REG_StrLen +return + rts + + END diff --git a/Build/source/texk/chktex/MakeHTML.in b/Build/source/texk/chktex/MakeHTML.in new file mode 100644 index 00000000000..669afc481c9 --- /dev/null +++ b/Build/source/texk/chktex/MakeHTML.in @@ -0,0 +1,20 @@ +#! @PERL5@ + +$latexonly = 0; + +while(<>) +{ + $latexonly = 1 if /^%latex/i; + $latexonly = 0 if /^%endlatex/i; + + + if($latexonly) { + if(/^%!(.*)/) + { + print $1; + } + } + else { + print; + } +} diff --git a/Build/source/texk/chktex/Makefile.in b/Build/source/texk/chktex/Makefile.in new file mode 100644 index 00000000000..a7ca9402cf0 --- /dev/null +++ b/Build/source/texk/chktex/Makefile.in @@ -0,0 +1,345 @@ +# +# Makefile for ChkTeX project, creates the stuff. +# Copyright (C) 1996 Jens T. Berger Thielemann +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +# Contact the author at: +# Jens Berger +# Spektrumvn. 4 +# N-0666 Oslo +# Norway +# E-mail: <jensthi@ifi.uio.no> +# + + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +bindir=@bindir@ +datadir=@datadir@ +srcdir=@srcdir@ +mandir=@mandir@ +INSTALL=@INSTALL@ +INSTALL_PROGRAM=@INSTALL_PROGRAM@ +INSTALL_DATA=@INSTALL_DATA@ +ELISPDIR=@ELISPDIR@ + +CC=@CC@ +CFLAGS=@CFLAGS@ +CPPFLAGS=@CPPFLAGS@ +DEFS=@DEFS@ +LIBS=@LIBS@ +LDFLAGS=@LDFLAGS@ +LN_S=@LN_S@ +LATEX=@LATEX@ +DVIPS=@DVIPS@ +PERL5=@PERL5@ +LATEX2HTML=@LATEX2HTML@ +LYNX=@LYNX@ +GROFF=@GROFF@ +SHELL=/bin/sh + +SCRIPTS=@SCRIPTS@ + +USRDEFS=-DDATADIR=\"$(datadir)\" + +##################################################################### + +INSTALLFILES= configure.in Makefile.in config.h.in chktexrc MakeHTML.in + +WEBFILES= chkweb deweb.in + +DOCFILES= ChkTeX.tex ChkTeX.dvi \ +ChkTeX.readme COPYING WB2Argv.readme deweb.1 deweb.doc + +SOURCEFILES= ChkTeX.c ChkTeX.h FindErrs.c FindErrs.h OpSys.c OpSys.h \ +Resource.c Resource.h Utility.c Utility.h WB2Argv.c WB2Argv.h \ +getopt.c getopt.h getopt1.c HashWord.a chktex.el + +PORTFILES= config.msd ChkTeX.dsk ChkTeX.prj SCOPTIONS SMakefile config.AMIGA + +TESTFILES= Test.tex input.tex Test.out + + +### +# +# OS specific files +# +### + +## AMIGA + +REXXFILES= amiga/ChkTeX.ced amiga/ChkTeX.ged amiga/ChkTeX.scm \ +amiga/ChkTeX.vbr amiga/GotoFile.ced + +AMIGAFILES= amiga/ChkTeX.install amiga/ChkTeX.install.info \ +amiga/ChkTeX amiga/ChkTeX.info amiga/COPYING.info \ +amiga/ChkTeX.readme.info amiga/lacheck $(REXXFILES) + +## MSDOS + +MSDOSFILES= msdos/ChkTeX.exe + +## OS/2 + +OS2FILES= os2/Readme.os2 os2/ChkTeX.exe + +## UNIX + +UNIXFILES= configure install-sh unix/lacheck + +COMMONFILES= $(INSTALLFILES) $(WEBFILES) $(DOCFILES) $(SOURCEFILES) \ +$(TESTFILES) $(PORTFILES) + +ARCHIVES= chktex.lha chktex.tar.gz + +all: chktex + +dist: configure ChkTeX.dvi Test.out ChkTeX.readme deweb.doc + touch chktex $(ARCHIVES) + rm -r chktex $(ARCHIVES) + mkdir chktex chktex/generic chktex/generic/exec + for file in $(COMMONFILES); do \ + cp $$file chktex/generic; \ + done + cp exec/types.h chktex/generic/exec + srcdir=`pwd`; \ + for dir in chktex/amiga/ chktex/msdos/ chktex/os2/ chktex/unix; do \ + cd $$srcdir; \ + mkdir $$dir; \ + cd $$dir; \ + for file in $(COMMONFILES); do \ + $(LN_S) ../generic/$$file .; \ + done; \ + mkdir exec; cd exec; \ + $(LN_S) ../../generic/exec/types.h .; \ + done + for file in $(AMIGAFILES); do\ + cp /hom/jensthi/chktex/source/$$file chktex/amiga; \ + done + for file in $(MSDOSFILES); do\ + cp /hom/jensthi/chktex/source/$$file chktex/msdos; \ + done + for file in $(OS2FILES); do\ + cp /hom/jensthi/chktex/source/$$file chktex/os2; \ + done + for file in $(UNIXFILES); do\ + cp /hom/jensthi/chktex/source/$$file chktex/unix; \ + done + cp README chktex/ + -rm chktex.lha + lha a chktex.lha chktex/amiga/ chktex/README + -rm chktex_unix.tar.gz + tar chf chktex_unix.tar chktex/unix + gzip chktex_unix.tar + -rm chktex_gen.tar.gz + tar chf chktex_gen.tar chktex/generic + gzip chktex_gen.tar + -rm chktex_msdos.zip chktex_os2.zip + zip -r chktex_msdos chktex/msdos + tar cf chktex.tar chktex + gzip chktex.tar + rm -r chktex + +######################################################################## + + +.c.o: + $(CC) $(CFLAGS) -I$(srcdir) -I. $(DEFS) $(USRDEFS) -c $< -o $@ + +###################### MAIN DEPENDENCIES ################################ + +OBJS= ChkTeX.o FindErrs.o getopt.o getopt1.o OpSys.o Resource.o Utility.o + +MAKETEST= ./chktex -mall -r -g0 -lchktexrc Test.tex + +Test.out: chktex Test.tex ChkTeX.tex + touch Test.out + rm -f Test.out + $(MAKETEST) 1> Test.out + +check: chktex + @echo ">>> Testing that checking algorithms work correctly..." + @touch chktest + @rm -f chktest + @$(MAKETEST) 1> chktest + @if cmp -s chktest Test.out; then \ + echo ">>> OK!"; \ + rm -f chktest; \ + else \ + echo "***WARNING***"; \ + echo "Problems when checking compilation. This may or may not"; \ + echo "be a problem; anyway, I'm giving you a diff from what the"; \ + echo "results were *supposed* to be..."; \ + diff -c chktest Test.out; \ + fi + + +chktex: $(OBJS) + touch chktex + rm -r chktex + $(CC) $(LDFLAGS) -o chktex $(OBJS) $(LIBS) + +install: chktex ChkTeX.dvi + $(INSTALL) -d $(bindir) + for program in chktex $(SCRIPTS); do \ + $(INSTALL_PROGRAM) $$program $(bindir); \ + done + $(INSTALL) -d $(datadir) + $(INSTALL_DATA) chktexrc $(datadir) + if (eval echo "$(SCRIPTS)") | egrep deweb >/dev/null 2>&1; then \ + $(INSTALL) -d $(mandir); \ + $(INSTALL) -d $(mandir)/man1; \ + cp deweb.1 $(mandir)/man1; \ + fi + if (eval echo "$(ELISPDIR)") | egrep "/" >/dev/null 2>&1; then \ + $(INSTALL_DATA) chktex.el $(ELISPDIR); \ + fi + + + +uninstall: + -rm -f $(bindir)/chktex + -rm -f $(bindir)/chkweb + -rm -f $(bindir)/deweb + -rm -f $(datadir)/chktexrc + +test: + chktex -v2 -mall Test.tex | less -r + +mostlyclean: clean + +clean: + -rm -r *.o *.aux *.log MakeHTML chktex deweb HTML rme 2> /dev/null + +distclean: clean + -rm -r *.cache *.status *.log *.tar.gz *.lha 2> /dev/null + +maintainer-clean: clean + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + -rm -r *.rme *.dvi *.ps *.doc Test.out 2> /dev/null + +dvi: ChkTeX.dvi + +html: + touch HTML + rm -r HTML + mkdir HTML + chmod u+x MakeHTML + ./MakeHTML ChkTeX.tex > HTML/ChkTeX.tex + cd HTML; $(LATEX2HTML) ChkTeX.tex + $(PERL5) -i -pe 's%</code> %</code>%gi;s%\s+([.,?!])%$$1%g;' HTML/ChkTeX/*.html + +ChkTeX.readme: ChkTeX.tex + touch rme + rm -r rme + mkdir rme + chmod u+x MakeHTML + ./MakeHTML ChkTeX.tex > rme/ChkTeX.tex + cd rme; $(LATEX2HTML) -split 0 ChkTeX.tex + $(PERL5) -i -pe 's%</code> %</code>%gi;s%\s+([.,?!])%$$1%g;' rme/ChkTeX/*.html + $(LYNX) -dump rme/ChkTeX/ChkTeX.html > ChkTeX.rme + cp Readme.header ChkTeX.readme + $(PERL5) -e 'undef $$/;$$_=<>;($$_)=/(.*INTRODUCTION(.|\n)*?)[ \t]+ABOUT THIS DOCUMENT/i;s/[ \t]+\n/\n/g;s/\n\n\n/\n/g;s/\[\d+\]//g;print;' ChkTeX.rme >> ChkTeX.readme + +###################### INDIVIDUAL DEPENDENCIES ########################## + +deweb.doc: deweb.1 + touch deweb.doc + rm -rf deweb.doc + $(GROFF) deweb.1 > deweb.doc + +configure: configure.in + autoconf + +ChkTeX.dvi: ChkTeX.tex + $(LATEX) ChkTeX.tex + +ChkTeX.ps: ChkTeX.dvi + $(DVIPS) -o ChkTeX.ps ChkTeX.dvi + +ChkTeX: ChkTeX.c + @echo + +ChkTeX.o: ChkTeX.c WB2Argv.h getopt.h ChkTeX.h exec/types.h \ +Utility.h OpSys.h FindErrs.h Resource.h config.h + +FindErrs.o: FindErrs.c ChkTeX.h exec/types.h FindErrs.h \ +Utility.h OpSys.h Resource.h config.h + +getopt.o: getopt.c config.h getopt.h + +getopt1.o: getopt1.c config.h getopt.h + +OpSys.o: OpSys.c ChkTeX.h exec/types.h Utility.h OpSys.h config.h + +Resource.o: Resource.c ChkTeX.h exec/types.h Utility.h OpSys.h Resource.h \ +config.h + +Utility.o: Utility.c ChkTeX.h exec/types.h Utility.h OpSys.h Resource.h \ +config.h + +RegExps.o: RegExps.c RegExps.h config.h + +WB2Argv.o: WB2Argv.c WB2Argv.h + +cover: + chktex -h + chktex Test.tex + chktex -v2 -t -o tmptmptmp <Test.tex + chktex -v2 -t -o tmptmptmp Test.tex + chktex Test.tex -v + chktex Test.tex -v0 + chktex Test.tex -v1 + chktex Test.tex -v2 + chktex Test.tex -v3 + chktex Test.tex -v4 + chktex -t -v0s::: Test.tex -x + chktex -p FOO Test.tex + chktex -t Test.tex + chktex -o tmptmptmp -o tmptmptmptmp Test.tex + chktex -l t:faultrc test.tex + chktex -e30w22n1 Test.tex + chktex -w33e-n1 Test.tex + chktex -i + chktex -v2 -t -o tmptmptmp <Test.tex + chktex -I Test.tex + chktex -rd2 Test.tex + chktex -gd2 Test.tex + chktex -f "*N\ +Between: %b*N\ +Column: %c*N\ +Lenght: %d*N\ +File: %f*N\ +%iInverse%I*N\ +Kind: %k*N\ +Line: %l*N\ +Msg: %m*N\ +Num: %n*N\ +Und: %u*N\ +Pre: %r*N\ +Str: %s*N\ +Post: %t*N\ +*N\ +%k in %f line %l: %m*N\ +%r%i%s%I%t*N\ +%u*N\ +*N" Test.tex + chktex -o tmptmptmp -r -d2 Test.tex + chktex -qv0 Test.tex + chktex -w30 Test.tex + chktex -g --localrc=.testrc -d2 Test.tex + cover diff --git a/Build/source/texk/chktex/OpSys.c b/Build/source/texk/chktex/OpSys.c new file mode 100644 index 00000000000..02589d1c5f1 --- /dev/null +++ b/Build/source/texk/chktex/OpSys.c @@ -0,0 +1,644 @@ +/* + * ChkTeX v1.5, operating system specific code for ChkTeX. + * Copyright (C) 1995-96 Jens T. Berger Thielemann + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Contact the author at: + * Jens Berger + * Spektrumvn. 4 + * N-0666 Oslo + * Norway + * E-mail: <jensthi@ifi.uio.no> + * + * + */ + + +/* + * Some functions which have to be made different from OS to OS, + * unfortunately...:\ + * + */ + +#ifdef KPATHSEA +#include <kpathsea/config.h> +#include <kpathsea/lib.h> +#include <kpathsea/expand.h> +#include <kpathsea/tex-file.h> +#endif + +#include "ChkTeX.h" +#include "OpSys.h" +#include "Utility.h" + +#ifdef HAVE_SYS_STAT_H +# include <sys/stat.h> +#endif +#ifdef HAVE_STAT_H +# include <stat.h> +#endif + +#if HAVE_DIRENT_H +# include <dirent.h> +# define NAMLEN(dirent) strlen((dirent)->d_name) +#else +# define dirent direct +# define NAMLEN(dirent) (dirent)->d_namlen +# if HAVE_SYS_NDIR_H +# include <sys/ndir.h> +# endif +# if HAVE_SYS_DIR_H +# include <sys/dir.h> +# endif +# if HAVE_NDIR_H +# include <ndir.h> +# endif +#endif + +#if defined(HAVE_OPENDIR) && defined(HAVE_CLOSEDIR) && \ + defined(HAVE_READDIR) && defined(HAVE_STAT) && \ + defined(S_IFDIR) && defined(SLASH) +# define USE_RECURSE 1 +#else +# define USE_RECURSE 0 +#endif + +#if defined(HAVE_LIBTERMCAP) || defined(HAVE_LIBTERMLIB) +# define USE_TERMCAP 1 +#endif + + +#ifdef USE_TERMCAP +# ifdef HAVE_TERMCAP_H +# include <termcap.h> +# elif HAVE_TERMLIB_H +# include <termlib.h> +# else +int tgetent (char *BUFFER, char *TERMTYPE); +char *tgetstr (char *NAME, char **AREA); +# endif +static char term_buffer[2048]; +#endif + +#ifdef AMIGA +# define __USE_SYSBASE +# include <dos.h> +# include <dos/dos.h> +# include <dos/dosasl.h> +# include <proto/dos.h> +# include <proto/exec.h> +# include <signal.h> +#endif + +/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ + + +#ifdef AMIGA +const char + VersString [] = "$VER: ChkTeX 1.5 " __AMIGADATE__ + " Copyright (c) 1995-96 Jens T. Berger Thielemann " + "<jensthi@ifi.uio.no>", + __stdiowin [] = "CON:0/10/640/180/ChkTeX", + __stdiov37 [] = "/AUTO/CLOSE/WAIT"; + +const ULONG __MemPoolPuddleSize = 16384, + __MemPoolThreshSize = 8192; + +static struct AnchorPath *AnchorPath = NULL; + +static void KillAnchorPath(void); +static STRPTR InitAnchorPath(STRPTR String); +# define V37 (DOSBase->dl_lib.lib_Version > 36) +#endif + + +/* + * This is the name of the global resource file. + */ + +#ifndef DATADIR +# ifdef AMIGA +# define DATADIR "S:" +# elif defined(__unix__) +# define DATADIR "/usr/local/lib/" +# elif defined(__MSDOS__) +# define DATADIR "\\emtex\\data\\" +# else +# define DATADIR +# endif +#endif +#define RCBASENAME "chktexrc" + +#ifdef __MSDOS__ +# define LOCALRCFILE RCBASENAME +#else +# define LOCALRCFILE "." RCBASENAME +#endif + +TEXT ConfigFile [BUFSIZ] = LOCALRCFILE; +STRPTR ReverseOn, ReverseOff; + + +static BOOL HasFile(STRPTR Dir, const STRPTR Filename, const STRPTR App); + +#if USE_RECURSE +static BOOL SearchFile(STRPTR Dir, const STRPTR Filename, const STRPTR App); +#endif /* USE_RECURSE */ + +/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ + + +/* + * Modify this one to suit your needs. In any case, it should fill + * the ConfigFile (sized BUFLEN) buffer above with full name & path + * for the configuration file. The macro RCFILE will give you the + * filename part of the file, if you need that. + * + * Note: This routine will be called several times. Your mission will + * be to look in each location, and see whether a .chktexrc file exist + * there. + * + * If you choose to do nothing, only the current directory will be + * searched. + * + */ + +enum LookIn +{ + liMin, + liSysDir, + liUsrDir, + liEnvir, + liCurDir, + liNFound, + liMax +}; + + +BOOL SetupVars(void) +{ + STRPTR Env; +#ifdef __MSDOS__ + STRPTR Ptr; +#endif + static enum LookIn i = liMin; + static BOOL FoundFile; + + while(++i < liMax) + { + switch(i) + { + case liCurDir: /* Current directory */ + strcpy(ConfigFile, LOCALRCFILE); + break; + case liEnvir: /* Environment defined */ +#ifdef __MSDOS__ + if((Env = getenv("CHKTEXRC")) || + (Env = getenv("CHKTEX_HOME"))) +#else + if((Env = getenv("CHKTEXRC"))) +#endif + { + strcpy(ConfigFile, Env); + tackon(ConfigFile, LOCALRCFILE); + } + else +#ifdef __MSDOS__ + if((Env = getenv("EMTEXDIR"))) + { + strcpy(ConfigFile, Env); + tackon(ConfigFile, "data"); + tackon(ConfigFile, LOCALRCFILE); + } + else +#endif + *ConfigFile = 0; + break; + case liUsrDir: /* User dir for resource files */ +#ifdef KPATHSEA + { + char *f = concat("~/", LOCALRCFILE); + char *p = kpse_path_expand(f); + if (p) { + strcpy(ConfigFile, p); + free(p); + } + else { + *ConfigFile = 0; + } + free(f); + } +#else /* ! KPATHSEA */ +#ifdef AMIGA + if(V37) + strcpy(ConfigFile, "ENV:"); + else + strcpy(ConfigFile, "S:"); + + tackon(ConfigFile, LOCALRCFILE); +#elif defined(__unix__) + if((Env = getenv("HOME")) || + (Env = getenv("LOGDIR"))) + { + strcpy(ConfigFile, Env); + tackon(ConfigFile, LOCALRCFILE); + } + else + *ConfigFile = 0; +#elif defined(__MSDOS__) + strcpy(ConfigFile, PrgName); + if((Ptr = strrchr(ConfigFile, '\\')) || + (Ptr = strchr(ConfigFile, ':'))) + strcpy(++Ptr, RCBASENAME); + else + *ConfigFile = 0; +#endif +#endif /* KPATHSEA */ + break; + case liSysDir: /* System dir for resource files */ +#ifdef KPATHSEA + { + char *f = kpse_find_file(LOCALRCFILE, kpse_program_text_format, TRUE); + if (f) { + strcpy(ConfigFile, f); + } + else { + *ConfigFile = '\0'; + } + } +#else /* ! KPATHSEA */ +#if defined(__unix__) || defined(__MSDOS__) + strcpy(ConfigFile, DATADIR); + tackon(ConfigFile, RCBASENAME); +#else + *ConfigFile = 0; +#endif +#endif /* KPATHSEA */ + break; + case liNFound: + case liMin: + case liMax: + *ConfigFile = 0; + if(!FoundFile) + PrintPrgErr(pmNoRsrc); + } + + if(*ConfigFile && fexists(ConfigFile)) + break; + } + FoundFile |= *ConfigFile; + + return(*ConfigFile); +} + +/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ + +/* + * This function should initialize the global variables ReverseOn + * and ReverseOff to magic cookies, which when printed, makes the + * text in between stand out. + */ + +void SetupTerm(void) +{ +#ifdef USE_TERMCAP + char *termtype = getenv("TERM"); + int success; + char *buffer; + + ifn(termtype) + PrintPrgErr(pmSpecifyTerm); + + success = tgetent(term_buffer, termtype); + if(success < 0) + PrintPrgErr(pmNoTermData); + if(success == 0) + PrintPrgErr(pmNoTermDefd); + + ifn((buffer = (char *) malloc(strlen(term_buffer))) && + (ReverseOn = tgetstr("so", &buffer)) && + (ReverseOff = tgetstr("se", &buffer))) +#endif + { + ReverseOn = PRE_ERROR_STR; + ReverseOff = POST_ERROR_STR; + } + +} + +/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ + +/* + * Concatenates the `File' string to the `Dir' string, leaving the result + * in the `Dir' buffer. Takes care of inserting `directory' characters; + * if we've got the strings "/usr/foo" and "bar", we'll get + * "/usr/foo/bar". + * + * Behaviour somewhat controlled by the macros SLASH and DIRCHARS in the + * OpSys.h file. + * + */ + +void tackon(STRPTR Dir, const STRPTR File) +{ + int EndC; + ULONG SLen; + + if(Dir && (SLen = strlen(Dir))) + { + EndC = Dir[SLen -1]; + ifn(strchr(DIRCHARS, EndC)) + { + Dir[SLen++] = SLASH; + Dir[SLen ] = 0L; + } + } + + strcat(Dir, File); +} + +/* + * This function should add the appendix App to the filename Name. + * If the resulting filename gets too long due to this, it may + * overwrite the old appendix. + * + * Name may be assumed to be a legal filename under your OS. + * + * The appendix should contain a leading dot. + */ + +void AddAppendix(STRPTR Name, const STRPTR App) +{ +#ifdef __MSDOS__ + STRPTR p; + + if((p = strrchr(Name, '.'))) + strcpy(p, App); + else + strcat(Name, App); +#else + /* + * NOTE! This may fail if your system has a claustrophobic file + * name length limit. + */ + strcat(Name, App); +#endif + +} + +/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ + + +/* + * Locates a file, given a wordlist containing paths. If a + * dir ends in a double SLASH, we'll search it recursively. + * + * We assume that + * a) a deeper level in the dir. tree. has a longer path than + * one above. + * b) adding a level doesn't change any of the previous levels. + * + * If this function returns TRUE, Dest is guaranteed to contain + * path & name of the found file. + * + * FALSE indicates that the file was not found; Dest is then + * unspecified. + */ + +#ifdef KPATHSEA +BOOL LocateFile(const STRPTR Filename, /* File to search for */ + STRPTR Dest, /* Where to put final file */ + const STRPTR App, /* Extra optional appendix */ + struct WordList *wl) /* Not used with kpathsea. + */ +{ + BOOL ret; + char *fn, *p; + + fn = Filename; + p = kpse_find_file(fn, kpse_tex_format, FALSE); + + if (! p || ! *p) { + fn = concat(Filename, App); + p = kpse_find_file(fn, kpse_tex_format, FALSE); + free(fn); + } + + if (p) { + strcpy(Dest, p); + free(p); + ret = TRUE; + } + else { + fprintf(stderr, "%s: warning, file %s%s not found.\n", kpse_program_name, Filename, App); + ret = FALSE; + } + + return ret; +} +#else +BOOL LocateFile(const STRPTR Filename, /* File to search for */ + STRPTR Dest, /* Where to put final file */ + const STRPTR App, /* Extra optional appendix */ + struct WordList *wl) /* List of paths, entries + * ending in // will be recursed + */ +{ + ULONG i, Len; + + FORWL(i, *wl) + { + strcpy(Dest, wl->Stack.Data[i]); + +#if USE_RECURSE + Len = strlen(Dest); + + if(Len && (Dest[Len - 1] == SLASH) && (Dest[Len - 2] == SLASH)) + { + Dest[Len - 1] = Dest[Len - 2] = 0; + if(SearchFile(Dest, Filename, App)) + return(TRUE); + } + else +#endif /* USE_RECURSE */ + { + if(HasFile(Dest, Filename, App)) + return(TRUE); + } + } + return(FALSE); +} +#endif + +static BOOL HasFile(STRPTR Dir, const STRPTR Filename, const STRPTR App) +{ + int DirLen = strlen(Dir); + + tackon(Dir, Filename); + if(fexists(Dir)) + return(TRUE); + + if(App) + { + AddAppendix(Dir, App); + if(fexists(Dir)) + return(TRUE); + } + + Dir[DirLen] = 0; + return(FALSE); + +} + + +#if USE_RECURSE +static BOOL SearchFile(STRPTR Dir, const STRPTR Filename, const STRPTR App) +{ + struct stat *statbuf; + struct dirent *de; + DIR *dh; + + int DirLen = strlen(Dir); + BOOL Found = FALSE; + + DEBUG(("Searching %s for %s\n", Dir, Filename)); + + if(HasFile(Dir, Filename, App)) + return(TRUE); + else + { + if((statbuf = malloc(sizeof(struct stat)))) + { + if((dh = opendir(Dir))) + { + while(!Found && (de = readdir(dh))) + { + Dir[DirLen] = 0; + if(strcmp(de->d_name, ".") && strcmp(de->d_name, "..")) + { + tackon(Dir, de->d_name); + + if(!stat(Dir, statbuf)) + { + if((statbuf->st_mode & S_IFMT) == S_IFDIR) + Found = SearchFile(Dir, Filename, App); + } + } + } + closedir(dh); + } + else + PrintPrgErr(pmNoOpenDir, Dir); + free(statbuf); + } + } + return(Found); +} +#endif /* USE_RECURSE */ + + + +/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ + +/* + * This function should be called first with String being a file pattern. + * It should then return the first filename matching that pattern. + * Subsequent calls will be made with String = NULL; it should then return + * any other filenames that matches the same pattern. + * If the first call is made with NULL, you should return NULL. + * It may be called more than once with String != NULL, however, you need + * only to keep track of the last invocation. + * + * If a string doesn't match any pattern at all, return the string itself. + * + * Don't assume that the String passed will live on until the next + * invocation, though. strdup() it if you need it after the first time. + */ + +#ifdef AMIGA + +STRPTR MatchFileName(STRPTR String) +{ + STRPTR Retval = NULL; + + if(AnchorPath || String) /* Is this the first invocation? */ + { + if(V37) + { + ifn(AnchorPath) + { + if(AnchorPath = malloc(sizeof(struct AnchorPath) + FMSIZE)) + { + Retval = InitAnchorPath(String); + atexit(&KillAnchorPath); + } + } + else + { + if(String) + { + MatchEnd(AnchorPath); + Retval = InitAnchorPath(String); + } + else + { + ifn(MatchNext(AnchorPath)) + Retval = AnchorPath->ap_Buf; + } + } + } + else /* ARP support may be added in the future */ + Retval = String; + + if(AnchorPath && AnchorPath->ap_FoundBreak) + raise(SIGINT); + } + + if(!Retval && String) + Retval = String; + + return(Retval); +} + +static void KillAnchorPath(void) +{ + MatchEnd(AnchorPath); +} + +static STRPTR InitAnchorPath(STRPTR String) +{ + STRPTR Retval = NULL; + + AnchorPath->ap_BreakBits = SIGBREAKF_CTRL_C; + AnchorPath->ap_Strlen = FMSIZE; + AnchorPath->ap_FoundBreak = FALSE; + AnchorPath->ap_Flags = 0L; + + ifn(MatchFirst(String, AnchorPath)) + Retval = AnchorPath->ap_Buf; + else + PrintPrgErr(pmNoFileMatch, String); + + AnchorPath->ap_Flags &= ~(APF_DODIR); + return(Retval); +} + +#else +STRPTR MatchFileName(STRPTR String) +{ + return(String); +} +#endif diff --git a/Build/source/texk/chktex/OpSys.h b/Build/source/texk/chktex/OpSys.h new file mode 100644 index 00000000000..a7fda5a8e3a --- /dev/null +++ b/Build/source/texk/chktex/OpSys.h @@ -0,0 +1,217 @@ +/* + * ChkTeX v1.5, operating system specific code for ChkTeX. + * Copyright (C) 1995-96 Jens T. Berger Thielemann + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Contact the author at: + * Jens Berger + * Spektrumvn. 4 + * N-0666 Oslo + * Norway + * E-mail: <jensthi@ifi.uio.no> + * + * + */ + +#ifndef OPSYS_H +#define OPSYS_H +#ifndef CHKTEX_H +# include "ChkTeX.h" +#endif /* CHKTEX_H */ +#ifndef UTILITY_H +# include "Utility.h" +#endif /* UTILITY_H */ + +/********************************************************************/ +/**************** START OF USER SETTABLE PREFERENCES ****************/ + +/* + * Note: This file contains most defines you'll wish to change if you + * wish to adopt ChkTeX to a new system. It is, as you might notice, + * heavily documented. If you wish to get into the internals of ChkTeX, + * the interesting stuff is at the bottom of this file, and in the .c + * files. However, you should also take a look at the "config.h.in" file + * in this directory if you haven't got a shell able to run the "configure" + * script. + * + * This program relies heavily on that the system which + * automagically free()'s all malloc()'ed memory, works. The program + * itself does not call free() very much. This is because we're doing + * lots of tiny allocations, and a properly designed pooling system will + * hopefully do a quicker job than we'll be able to do. So there. + * + * To keep things simple, we trust that the fclose()'ing of fopen()'ed + * also happens automagically. + * + * Please use the getopt included, as we will modify optarg during + * command processing. + * + * You may wish to modify the SetupVars() (OpSys.c) to better suit your + * preferences. In any case, it should put the filename (and full path) + * of the `.chktexrc' file into the ConfigFile array. The array is sized + * BUFSIZ bytes. + * + * The program does also assume that AMIGA is defined if the source + * compiled on an Amiga machine, and that __unix__ is defined if the + * source is compiled on a UNIX machine. + * + */ + + +/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ + +/* + * Here you should define what codes which should be returned to the + * shell upon success/failure. + * + */ + +#ifndef EXIT_FAILURE +# ifdef AMIGA +# define EXIT_FAILURE 20 +# else +# define EXIT_FAILURE 1 +# endif +#endif + +#ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +#endif + +/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ + +/* + * SLASH should be defined to the character your computer uses to + * separate files/directories. Most systems use '/', messydos uses + * '\'. + * + * DIRCHARS should be defined to the characters a directory entry + * may end on. On Amigas, this is ":/" (either "FOO:BAR/" or "FOO:"), + * Unix uses only "/", while messydos uses ":\\". + * + * This data will be used to automatically concatenate a directory + * path and a filename. + * + * Adjust both to suit your needs. + */ + + +#if defined(__unix__) || defined(AMIGA) || defined(WIN32) +# define SLASH '/' +#elif defined(__MSDOS__) +# define SLASH '\\' +#endif + +#if defined(AMIGA) +# define DIRCHARS ":/" +#elif defined(__unix__) +# define DIRCHARS "/" +#elif defined(__MSDOS__) +# define DIRCHARS ":\\" +#elif defined(WIN32) +#define DIRCHARS ":\\/" +#endif + +/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ + +/* + * Here, define what key-combination which is used to abort stdin + * keyboard input. It should be a string, as we we'll type it out as + * information to the user. + */ + +#ifdef AMIGA +# define STDIN_BREAK "Ctrl-\\" +#elif defined(__unix__) +# define STDIN_BREAK "Ctrl-D" +#elif defined(__MSDOS__) +# define STDIN_BREAK "Ctrl-Z + Enter" +#else +# define STDIN_BREAK "stdin break combination" +#endif + +/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ + +/* + * For fancy printing of commands, we'll use these strings to turn + * on/off the error indication. The codes listed here are ANSI + * compatible; if you don't have that type of terminal, you may wish + * to adjust this. Use "chktex -v2 Test.tex" to check the effects of + * these macros. Note: These strings will be printf()'ed, so watch your + * %'s. + * + * Under UNIX, we'll ignore these values and use termcap instead, where + * that is installed. + * + * If these strings can't be specified statically, you'll have to add + * code in the SetupTerm() function. + * + * PRE_ERROR_STR is of course printed in front of each location we + * wish to show as an error, and POST_ERROR_STR after each location. + * + * The codes #defined here, will switch back- and foreground colours. + * We're using '\033[' as escape character, some terminals may like + * '\233' better. + * + */ + +#ifdef AMIGA +# define PRE_ERROR_STR "\033[43m\033[32m" +# define POST_ERROR_STR "\033[0m" +#else +# define PRE_ERROR_STR "\033[7m" +# define POST_ERROR_STR "\033[0m" +#endif + + +/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ + +/* + * This macro should contain the appendix for backup files, which + * will be appended onto the original filename. It should contain + * a leading dot. + */ + +#ifdef __MSDOS__ +# define BAKAPPENDIX ".$cl" +#else +# define BAKAPPENDIX ".bak" +#endif + +/***************** END OF USER SETTABLE PREFERENCES *****************/ +/********************************************************************/ + +#ifndef WORDLIST_DEFINED +struct WordList; +#endif + /* Sorry; there are now cyclic dependencies in the + * source tree. :-/ + */ + +extern STRPTR ReverseOn, ReverseOff; +extern TEXT ConfigFile[BUFSIZ]; + +STRPTR MatchFileName __PROTO((STRPTR String)); +BOOL SetupVars __PROTO((void)); +void SetupTerm __PROTO((void)); +void AddAppendix __PROTO((STRPTR Name, const STRPTR App)); +void tackon __PROTO((STRPTR, const STRPTR)); +BOOL LocateFile __PROTO((const STRPTR Filename, STRPTR Dest, + const STRPTR App, struct WordList *wl)); + + +#endif /* OPSYS_H */ + diff --git a/Build/source/texk/chktex/Resource.c b/Build/source/texk/chktex/Resource.c new file mode 100644 index 00000000000..9a79ab9f2a3 --- /dev/null +++ b/Build/source/texk/chktex/Resource.c @@ -0,0 +1,518 @@ +/* + * ChkTeX v1.5, resource file reader. + * Copyright (C) 1995-96 Jens T. Berger Thielemann + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Contact the author at: + * Jens Berger + * Spektrumvn. 4 + * N-0666 Oslo + * Norway + * E-mail: <jensthi@ifi.uio.no> + * + * + */ + +#include "ChkTeX.h" +#include "OpSys.h" +#include "Utility.h" +#include "Resource.h" + +#define LNEMPTY(a) struct WordList a = {0, 1, {0}, {0}}; +#define LIST(a) struct WordList a = {0, 0, {0}, {0}}; +#define LCASE(a) LIST(a) LIST(a ## Case) +#define KEY(a,def) STRPTR a = def; + +RESOURCE_INFO + +#undef KEY +#undef LCASE +#undef LNEMPTY +#undef LIST + +struct KeyWord +{ + STRPTR Name; + STRPTR *String; /* Keyword = item */ + struct WordList + *List, /* Case-sensitive strings */ + *CaseList; /* Case-insensitive strings */ +}; + +#define LNEMPTY LIST +#define LIST(name) {#name, NULL, &name, NULL}, +#define LCASE(name) {#name, NULL, &name, &name ## Case}, +#define KEY(name,def) {#name, &name, NULL, NULL}, + +struct KeyWord Keys [] = +{ + RESOURCE_INFO + {NULL, NULL, NULL, NULL} +}; + +#undef KEY +#undef LCASE +#undef LNEMPTY +#undef LIST + + +/***************************** RESOURCE HANDLING **************************/ + +#define TOKENBITS(name) enum name { \ + BIT(Eof), /* End-of-file */ \ + BIT(Open), /* { */ \ + BIT(Close), /* } */ \ + BIT(BrOpen), /* [ */ \ + BIT(BrClose), /* ] */ \ + BIT(Equal), /* = */ \ + BIT(Word), /* Keyword */ \ + BIT(Item) /* List item */ \ +}; + +#undef BIT +#define BIT BITDEF1 +TOKENBITS(Token_BIT) + +#undef BIT +#define BIT BITDEF2 +TOKENBITS(Token) + + +static enum Token Expect; +static ULONG RsrcLine; + +static enum Token ReadWord __PROTO((STRPTR, FILE *)); +static TEXT MapChars __PROTO((STRPTR *String)); + + + +/* + * Parses the contents of a resource file. + * + * Format: + * Keyword { item1 item2 ... } [ item1 item2 ... ] + * Keyword [ item1 item2 ... ] { item1 item2 ... } + * Keyword = { item1 item2 ... } + * Keyword = [ item1 item2 ... ] + * Keyword = item + * + * Returns whether the attempt was a successful one. + */ + +BOOL ReadRC(const STRPTR Filename) +{ + STRPTR String; + BOOL Success = FALSE; + FILE *fh; + enum Token Token; + ULONG Counter; + + struct KeyWord *CurWord = NULL; + + /* Interpret incoming words as ... */ + enum + { + whList, /* List elements */ + whCaseList, /* Case insensitive list elements */ + whEqual, /* Solo elements */ + whNone /* List items not accepted */ + } What = whNone; + + + RsrcLine = 0; + Expect = FLG_Word | FLG_Eof; + + if((fh = fopen(Filename, "r"))) + { + Success = TRUE; + do + { + Token = ReadWord(ReadBuffer, fh); + ifn(Expect & Token) + { + switch(Token) + { + case FLG_Item: + String = "item"; + break; + case FLG_Word: + String = "word"; + break; + case FLG_Equal: + String = "`='"; + break; + case FLG_Open: + String = "`{'"; + break; + case FLG_Close: + String = "`}'"; + break; + case FLG_BrOpen: + String = "`['"; + break; + case FLG_BrClose: + String = "`]'"; + break; + case FLG_Eof: + String = "EOF"; + break; + } + PrintPrgErr(pmFaultFmt, Filename, RsrcLine, String); + Success = FALSE; + Token = FLG_Eof; + } + + switch(Token) + { + case FLG_Word: + for(Counter = 0; + Keys[Counter].Name; + Counter++) + { + if(!strcasecmp(ReadBuffer, Keys[Counter].Name)) + { + CurWord = &Keys[Counter]; + Expect = (CurWord->List? FLG_Open : 0) | + (CurWord->CaseList? FLG_BrOpen : 0) | + FLG_Equal; + break; + } + } + if(!Keys[Counter].Name) + { + PrintPrgErr(pmKeyWord, ReadBuffer, Filename); + Success = FALSE; + Token = FLG_Eof; + } + break; + case FLG_Item: + switch(What) + { + case whEqual: + ifn(*(CurWord->String) = strdup(ReadBuffer)) + { + PrintPrgErr(pmStrDupErr); + Token = FLG_Eof; + Success = FALSE; + } + + What = whNone; + Expect = FLG_Word | FLG_Eof; + break; + case whCaseList: + if(!InsertWord(ReadBuffer, CurWord->CaseList)) + { + Token = FLG_Eof; + Success = FALSE; + } + break; + case whList: + if(!InsertWord(ReadBuffer, CurWord->List)) + { + Token = FLG_Eof; + Success = FALSE; + } + break; + case whNone: + PrintPrgErr(pmAssert); + } + break; + case FLG_Equal: + What = whEqual; + Expect = (CurWord->List? FLG_Open : 0) | + (CurWord->CaseList? FLG_BrOpen : 0) | + (CurWord->String? FLG_Item : 0); + break; + case FLG_BrOpen: + if(What == whEqual) + ClearWord(CurWord->CaseList); + What = whCaseList; + Expect = FLG_Item | FLG_BrClose; + break; + case FLG_Open: + if(What == whEqual) + ClearWord(CurWord->List); + What = whList; + Expect = FLG_Item | FLG_Close; + break; + case FLG_BrClose: + case FLG_Close: + Expect = (CurWord->List? FLG_Open : 0) | + (CurWord->CaseList? FLG_BrOpen : 0) | + FLG_Equal | FLG_Word | FLG_Eof; + What = whNone; + break; + case FLG_Eof: + break; + } + } while(Token != FLG_Eof); + + fclose(fh); + } + else + PrintPrgErr(pmRsrcOpen, Filename); + + return(Success); +} + +/* + * Reads a token from the `.chktexrc' file; if the token is + * FLG_Item or FLG_Word, Buffer will contain the plaintext of the + * token. If not, the contents are undefined. + */ + +static enum Token ReadWord(STRPTR Buffer, FILE *fh) +{ + static + STRPTR String = NULL; + static + TEXT StatBuf[BUFSIZ]; + enum Token Retval = FLG_Eof; + + UWORD Chr; + + STRPTR Ptr; + BOOL OnceMore = TRUE, Cont = TRUE; + + if(Buffer) + { + do + { + if(!(String && *String)) + { + if(fgets(StatBuf, BUFSIZ-1, fh)) + String = strip(StatBuf, STRP_RGT); + RsrcLine++; + } + + Ptr = Buffer; + if(String && (String = strip(String, STRP_LFT))) + { + switch(Chr = *String) + { + case 0: + case CMNT: + String = NULL; + break; + case QUOTE: /* Quoted argument */ + Cont = TRUE; + String++; + + while(Cont) + { + switch(Chr = *String++) + { + case 0: + case QUOTE: + Cont = FALSE; + break; + case ESCAPE: + ifn(Chr = MapChars(&String)) + break; + + /* FALLTHRU */ + default: + *Ptr++ = Chr; + } + } + *Ptr = 0; + Retval = FLG_Item; + OnceMore = FALSE; + break; + +#define DONEKEY (FLG_Open | FLG_Equal | FLG_BrOpen) +#define DONELIST (FLG_Close | FLG_BrClose) +#define TOKEN(c, ctxt, tk) case c: if(Expect & (ctxt)) Retval = tk; LAST(token); + + LOOP(token, + TOKEN('{', DONEKEY, FLG_Open); + TOKEN('[', DONEKEY, FLG_BrOpen); + TOKEN('=', DONEKEY, FLG_Equal); + TOKEN(']', DONELIST, FLG_BrClose); + TOKEN('}', DONELIST, FLG_Close); + ) + + if(Retval != FLG_Eof) + { + OnceMore = FALSE; + String++; + break; + } + + /* FALLTHRU */ + + default: /* Non-quoted argument */ + OnceMore = FALSE; + if(Expect & FLG_Word) + { + while(Cont) + { + Chr = *String++; + if(isalpha(Chr)) + *Ptr++ = Chr; + else + Cont = FALSE; + } + String--; + Retval = FLG_Word; + } + else /* Expect & FLG_Item */ + { + while(Cont) + { + switch(Chr = *String++) + { + case CMNT: + case 0: + String = NULL; + Cont = FALSE; + break; + case ESCAPE: + ifn(Chr = MapChars(&String)) + break; + + *Ptr++ = Chr; + break; + default: + if(!isspace(Chr)) + *Ptr++ = Chr; + else + Cont = FALSE; + } + } + Retval = FLG_Item; + } + + ifn(Buffer[0]) + { + PrintPrgErr(pmEmptyToken); + if(*String) + String++; + } + *Ptr = 0; + break; + } + } + else + OnceMore = FALSE; + } while(OnceMore); + } + return(Retval); +} + + + +/* + * Translates escape codes. Give it a pointer to the char after the + * escape char, and we'll return what it maps to. + */ + +#define MAP(a,b) case a: Tmp = b; break; + +static TEXT MapChars(STRPTR *String) +{ + int Chr, Tmp = 0; + UWORD Cnt; + + Chr = *((STRPTR) (*String)++); + + switch(tolower(Chr)) + { + MAP(QUOTE, QUOTE); + MAP(ESCAPE, ESCAPE); + MAP(CMNT, CMNT); + MAP('n', '\n'); + MAP('r', '\r'); + MAP('b', '\b'); + MAP('t', '\t'); + MAP('f', '\f'); + MAP('{', '{'); + MAP('}', '}'); + MAP('[', '['); + MAP(']', ']'); + MAP('=', '='); + MAP(' ', ' '); + case 'x': + Tmp = 0; + + for(Cnt = 0; Cnt < 2; Cnt++) + { + Chr = *((*String)++); + if(isxdigit(Chr)) + { + Chr = toupper(Chr); + Tmp = (Tmp<<4) + Chr; + + if(isdigit(Chr)) + Tmp -= '0'; + else + Tmp -= 'A' - 10; + } + else + { + if(Chr) + { + PrintPrgErr(pmNotPSDigit, Chr, "hex"); + Tmp = 0; + } + break; + } + } + break; + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': + + Tmp = Chr - '0'; + + for(Cnt = 0; Cnt < 2; Cnt++) + { + Chr = *((*String)++); + if(within('0',Chr,'7')) + Tmp = (Tmp * 8) + Chr - '0'; + else + { + if(Chr) + { + PrintPrgErr(pmNotPSDigit, Chr, "octal"); + Tmp = 0; + } + break; + } + } + break; + case 'd': + for(Cnt = 0; Cnt < 3; Cnt++) + { + if(isdigit(Chr = *((*String)++))) + Tmp = (Tmp * 10) + Chr - '0'; + else + { + if(Chr) + { + PrintPrgErr(pmNotPSDigit, Chr, ""); + Tmp = 0; + } + break; + } + } + break; + default: + PrintPrgErr(pmEscCode, ESCAPE, Chr); + } + return(Tmp); +} + + diff --git a/Build/source/texk/chktex/Resource.h b/Build/source/texk/chktex/Resource.h new file mode 100644 index 00000000000..f0e7b9b58e8 --- /dev/null +++ b/Build/source/texk/chktex/Resource.h @@ -0,0 +1,64 @@ +/* + * ChkTeX v1.5, resource file reader. + * Copyright (C) 1995-96 Jens T. Berger Thielemann + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Contact the author at: + * Jens Berger + * Spektrumvn. 4 + * N-0666 Oslo + * Norway + * E-mail: <jensthi@ifi.uio.no> + * + * + */ + +#ifndef RESOURCE_H +#define RESOURCE_H +#ifndef CHKTEX_H +# include "ChkTeX.h" +#endif /* CHKTEX_H */ + +#define QUOTE '\"' /* Char used to quote text containing blanks */ +#define ESCAPE '!' /* Char used to access special characters */ +#define CMNT '#' /* Char used as comment */ + +#define RESOURCE_INFO \ + LIST(Silent) LIST(Linker) LIST(IJAccent) LIST(Italic)\ + LIST(ItalCmd) LIST(PostLink) LIST(WipeArg) LIST(VerbEnvir)\ + LIST(MathEnvir) LIST(MathRoman) LIST(HyphDash) LIST(NumDash)\ + LIST(WordDash) LIST(CenterDots) LIST(LowDots) LIST(OutFormat)\ + LIST(Primitives) LIST(NotPreSpaced) LIST(NonItalic) LIST(NoCharNext)\ + LNEMPTY(CmdLine) LNEMPTY(TeXInputs)\ + LCASE(Abbrev) LCASE(UserWarn)\ + KEY(VerbClear, "|") KEY(QuoteStyle, "Traditional") KEY(TabSize, "8") + +#define LIST(a) extern struct WordList a; +#define LNEMPTY LIST +#define LCASE(a) LIST(a) LIST(a ## Case) +#define KEY(a,def) extern STRPTR a; + +RESOURCE_INFO + +#undef KEY +#undef LCASE +#undef LNEMPTY +#undef LIST + +BOOL ReadRC __PROTO((STRPTR const)); + + +#endif /* RESOURCE */ diff --git a/Build/source/texk/chktex/Test.out b/Build/source/texk/chktex/Test.out new file mode 100644 index 00000000000..5d7b70d8ba9 --- /dev/null +++ b/Build/source/texk/chktex/Test.out @@ -0,0 +1,408 @@ +Message 30 in Test.tex line 2: Multiple spaces detected in input. + o To test the program upon it + ^^^ +Message 30 in Test.tex line 3: Multiple spaces detected in input. + o To show off some of the features + ^^^ +Message 22 in Test.tex line 8: Comment displayed. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +^ +Message 22 in Test.tex line 10: Comment displayed. +% Warning 1 +^ +Message 1 in Test.tex line 12: Command terminated with space. +\foo This is an error. + ^ +Message 22 in Test.tex line 15: Comment displayed. +% Warning 2 +^ +Message 2 in Test.tex line 17: Non-breaking space (`~') should have been used. +This is a faulty reference to \ref{foo} + ^ +Message 22 in Test.tex line 20: Comment displayed. +% Warning 3 +^ +Message 3 in Test.tex line 22: You should enclose the previous parenthesis with `{}'. +$[(ab)^{-1}]^{-2}$ is not beautiful + ^ +Message 3 in Test.tex line 22: You should enclose the previous parenthesis with `{}'. +$[(ab)^{-1}]^{-2}$ is not beautiful + ^ +Message 30 in Test.tex line 22: Multiple spaces detected in input. +$[(ab)^{-1}]^{-2}$ is not beautiful + ^^ +Message 22 in Test.tex line 25: Comment displayed. +% Warning 4-6, 28 +^ +Message 6 in Test.tex line 27: No italic correction (`\/') found. +Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. + ^ +Message 42 in Test.tex line 27: You should remove spaces in front of `\/' +Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. + ^ +Message 4 in Test.tex line 27: Italic correction (`\/') found in non-italic buffer. +Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. + ^^ +Message 28 in Test.tex line 27: Don't use \/ in front of small punctuation. +Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. + ^^ +Message 42 in Test.tex line 27: You should remove spaces in front of `\/' +Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. + ^ +Message 5 in Test.tex line 27: Italic correction (`\/') found more than once. +Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. + ^^ +Message 22 in Test.tex line 30: Comment displayed. +% LaTeX2e +^ +Message 42 in Test.tex line 32: You should remove spaces in front of `\/' +Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. + ^ +Message 4 in Test.tex line 32: Italic correction (`\/') found in non-italic buffer. +Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. + ^^ +Message 28 in Test.tex line 32: Don't use \/ in front of small punctuation. +Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. + ^^ +Message 42 in Test.tex line 32: You should remove spaces in front of `\/' +Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. + ^ +Message 4 in Test.tex line 32: Italic correction (`\/') found in non-italic buffer. +Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. + ^^ +Message 4 in Test.tex line 32: Italic correction (`\/') found in non-italic buffer. +Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. + ^^ +Message 4 in Test.tex line 33: Italic correction (`\/') found in non-italic buffer. +Testing \textem{italic\/} in this \textit{sentence}, as \textem{you see}. + ^^ +Message 22 in Test.tex line 35: Comment displayed. +% Warning 7 +^ +Message 7 in Test.tex line 37: Accent command `\'' needs use of `\i'. +This \'is a test of $\hat{j}$ accents. + ^^ +Message 7 in Test.tex line 37: Accent command `\hat' needs use of `\jmath'. +This \'is a test of $\hat{j}$ accents. + ^^^^ +Message 22 in Test.tex line 40: Comment displayed. +% Warning 8 +^ +Message 8 in Test.tex line 42: Wrong length of dash may have been used. +It wasn't anything - just a 2---3 star--shots. + ^ +Message 8 in Test.tex line 42: Wrong length of dash may have been used. +It wasn't anything - just a 2---3 star--shots. + ^^^ +Message 8 in Test.tex line 42: Wrong length of dash may have been used. +It wasn't anything - just a 2---3 star--shots. + ^^ +Message 22 in Test.tex line 45: Comment displayed. +% Warning 9-10 +^ +Message 22 in Test.tex line 47: Comment displayed. +% Brackets: +^ +Message 10 in Test.tex line 49: Solo `)' found. +)}{[])} }}}]]]))) +^ +Message 10 in Test.tex line 49: Solo `}' found. +)}{[])} }}}]]]))) + ^ +Message 9 in Test.tex line 49: `}' expected, found `)'. +)}{[])} }}}]]]))) + ^ +Message 10 in Test.tex line 49: Solo `}' found. +)}{[])} }}}]]]))) + ^ +Message 10 in Test.tex line 49: Solo `}' found. +)}{[])} }}}]]]))) + ^ +Message 10 in Test.tex line 49: Solo `}' found. +)}{[])} }}}]]]))) + ^ +Message 10 in Test.tex line 49: Solo `}' found. +)}{[])} }}}]]]))) + ^ +Message 10 in Test.tex line 49: Solo `]' found. +)}{[])} }}}]]]))) + ^ +Message 10 in Test.tex line 49: Solo `]' found. +)}{[])} }}}]]]))) + ^ +Message 10 in Test.tex line 49: Solo `]' found. +)}{[])} }}}]]]))) + ^ +Message 10 in Test.tex line 49: Solo `)' found. +)}{[])} }}}]]]))) + ^ +Message 10 in Test.tex line 49: Solo `)' found. +)}{[])} }}}]]]))) + ^ +Message 10 in Test.tex line 49: Solo `)' found. +)}{[])} }}}]]]))) + ^ +Message 22 in Test.tex line 52: Comment displayed. +% Envs: +^ +Message 9 in Test.tex line 54: `baz' expected, found `quux'. +\begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo} + ^^^^ +Message 9 in Test.tex line 54: `quux' expected, found `baz'. +\begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo} + ^^^^ +Message 10 in Test.tex line 54: Solo `asoi' found. +\begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo} + ^^^^ +Message 22 in Test.tex line 58: Comment displayed. +% Warning 11 +^ +Message 11 in Test.tex line 60: You should use \ldots to achieve an ellipsis. +Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. + ^^^ +Message 11 in Test.tex line 60: You should use \ldots to achieve an ellipsis. +Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. + ^^^ +Message 11 in Test.tex line 60: You should use \cdots to achieve an ellipsis. +Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. + ^^^ +Message 11 in Test.tex line 60: You should use \ldots to achieve an ellipsis. +Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. + ^^^^^^ +Message 11 in Test.tex line 60: You should use \cdots to achieve an ellipsis. +Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. + ^^^^^^ +Message 22 in Test.tex line 63: Comment displayed. +% Warning 12 +^ +Message 12 in Test.tex line 65: Interword spacing (`\ ') should perhaps be used. +1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar + ^ +Message 12 in Test.tex line 65: Interword spacing (`\ ') should perhaps be used. +1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar + ^ +Message 12 in Test.tex line 65: Interword spacing (`\ ') should perhaps be used. +1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar + ^ +Message 22 in Test.tex line 68: Comment displayed. +% Warning 13 +^ +Message 13 in Test.tex line 70: Intersentence spacing (`\@') should perhaps be used. +Look at THIS! It's an error. + ^ +Message 22 in Test.tex line 73: Comment displayed. +% Warning 14 +^ +Message 1 in Test.tex line 75: Command terminated with space. +\hat + ^ +Message 14 in Test.tex line 75: Could not find argument for command. +\hat +^^^^ +Message 22 in Test.tex line 78: Comment displayed. +% Warning 18,19 +^ +Message 18 in Test.tex line 80: Use either `` or '' as an alternative to `"'. +Is this an "example", or is it an ´example´. + ^ +Message 18 in Test.tex line 80: Use either `` or '' as an alternative to `"'. +Is this an "example", or is it an ´example´. + ^ +Message 19 in Test.tex line 80: Use "'" (ASCII 39) instead of "´" (ASCII 180). +Is this an "example", or is it an ´example´. + ^ +Message 19 in Test.tex line 80: Use "'" (ASCII 39) instead of "´" (ASCII 180). +Is this an "example", or is it an ´example´. + ^ +Message 22 in Test.tex line 83: Comment displayed. +% Warning 20 +^ +Message 20 in Test.tex line 85: User-specified pattern found. +That bug is \unknown\ to me. + ^^^^^^^^ +Message 22 in Test.tex line 87: Comment displayed. +% Warning 21 +^ +Message 21 in Test.tex line 89: This command might not be intended. +\LaTeX\ is an extension of \TeX\. Right? + ^^ +Message 22 in Test.tex line 92: Comment displayed. +% Warning 23 +^ +Message 23 in Test.tex line 94: Either `\,`` or ``\,` will look better. +```Hello', I heard him said'', she remembered. +^^^ +Message 22 in Test.tex line 97: Comment displayed. +% Warning 24 +^ +Message 24 in Test.tex line 99: Delete this space to maintain correct pagereferences. +Indexing text \index{text} is fun! + ^ +Message 22 in Test.tex line 102: Comment displayed. +% Warning 25 +^ +Message 25 in Test.tex line 104: You might wish to put this between a pair of `{}' +$5\cdot10^10$ + ^^ +Message 22 in Test.tex line 107: Comment displayed. +% Warning 26 +^ +Message 26 in Test.tex line 109: You ought to remove spaces in front of punctuation. +Do you understand ? + ^ +Message 22 in Test.tex line 112: Comment displayed. +% Warning 27 +^ +Message 1 in input.tex line 1: Command terminated with space. +\this is a test of whether the file is actually inputted... + ^ +Message 11 in input.tex line 1: You should use \ldots to achieve an ellipsis. +\this is a test of whether the file is actually inputted... + ^^^ +Message 1 in input.tex line 1: Command terminated with space. +\this is a test of whether the file is actually inputted... + ^ +Message 11 in input.tex line 1: You should use \ldots to achieve an ellipsis. +\this is a test of whether the file is actually inputted... + ^^^ +Message 22 in Test.tex line 117: Comment displayed. +% Warning 29 +^ +Message 29 in Test.tex line 118: $\times$ may look prettier here. +The program opens a screen sized 640x200 pixels + ^ +Message 22 in Test.tex line 121: Comment displayed. +% Warning 30 +^ +Message 30 in Test.tex line 123: Multiple spaces detected in input. +White is a beautiful colour. + ^^^^^^^^^^^ +Message 22 in Test.tex line 126: Comment displayed. +% Warning 31 +^ +Message 31 in Test.tex line 129: This text may be ignored. +\end{verbatim} foo bar + ^^^^^^^ +Message 22 in Test.tex line 131: Comment displayed. +% Warning 32-34 +^ +Message 32 in Test.tex line 133: Use ` to begin quotation, not '. +This is either an 'example`, an ''example`` or an `"`example'`'. + ^ +Message 33 in Test.tex line 133: Use ' to end quotation, not `. +This is either an 'example`, an ''example`` or an `"`example'`'. + ^ +Message 32 in Test.tex line 133: Use ` to begin quotation, not '. +This is either an 'example`, an ''example`` or an `"`example'`'. + ^^ +Message 33 in Test.tex line 133: Use ' to end quotation, not `. +This is either an 'example`, an ''example`` or an `"`example'`'. + ^^ +Message 34 in Test.tex line 133: Don't mix quotes. +This is either an 'example`, an ''example`` or an `"`example'`'. + ^^^ +Message 34 in Test.tex line 133: Don't mix quotes. +This is either an 'example`, an ''example`` or an `"`example'`'. + ^^^ +Message 22 in Test.tex line 136: Comment displayed. +% Warning 35 +^ +Message 35 in Test.tex line 138: You should perhaps use `\sin' instead. +$sin^2 + cos^2 = 1$ + ^^^ +Message 35 in Test.tex line 138: You should perhaps use `\cos' instead. +$sin^2 + cos^2 = 1$ + ^^^ +Message 22 in Test.tex line 141: Comment displayed. +% Warning 36-37 +^ +Message 36 in Test.tex line 143: You should put a space in front of parenthesis. +This( an example( Nuff said )), illustrates( ``my'' )point. + ^ +Message 37 in Test.tex line 143: You should avoid spaces after parenthesis. +This( an example( Nuff said )), illustrates( ``my'' )point. + ^ +Message 36 in Test.tex line 143: You should put a space in front of parenthesis. +This( an example( Nuff said )), illustrates( ``my'' )point. + ^ +Message 37 in Test.tex line 143: You should avoid spaces after parenthesis. +This( an example( Nuff said )), illustrates( ``my'' )point. + ^ +Message 37 in Test.tex line 143: You should avoid spaces in front of parenthesis. +This( an example( Nuff said )), illustrates( ``my'' )point. + ^ +Message 36 in Test.tex line 143: You should put a space in front of parenthesis. +This( an example( Nuff said )), illustrates( ``my'' )point. + ^ +Message 37 in Test.tex line 143: You should avoid spaces after parenthesis. +This( an example( Nuff said )), illustrates( ``my'' )point. + ^ +Message 37 in Test.tex line 143: You should avoid spaces in front of parenthesis. +This( an example( Nuff said )), illustrates( ``my'' )point. + ^ +Message 36 in Test.tex line 143: You should put a space after parenthesis. +This( an example( Nuff said )), illustrates( ``my'' )point. + ^ +Message 22 in Test.tex line 146: Comment displayed. +% Warning 38 +^ +Message 38 in Test.tex line 147: You should not use punctuation in front of quotes. +``An example,'' he said, ``would be great.'' + ^ +Message 38 in Test.tex line 147: You should not use punctuation in front of quotes. +``An example,'' he said, ``would be great.'' + ^ +Message 22 in Test.tex line 150: Comment displayed. +% Warning 39 +^ +Message 39 in Test.tex line 152: Double space found. +For output codes, see table ~\ref{tab:fmtout}. + ^ +Message 22 in Test.tex line 155: Comment displayed. +% Warning 40 +^ +Message 40 in Test.tex line 156: You should put punctuation outside inner math mode. +$\this,$ and $$this$$. + ^ +Message 40 in Test.tex line 156: You should put punctuation inside display math mode. +$\this,$ and $$this$$. + ^ +Message 22 in Test.tex line 159: Comment displayed. +% Warning 41 +^ +Message 1 in Test.tex line 160: Command terminated with space. +foo \above qux + ^ +Message 41 in Test.tex line 160: You ought to not use primitive TeX in LaTeX code. +foo \above qux + ^^^^^^ +Message 22 in Test.tex line 163: Comment displayed. +% Warning 42 +^ +Message 42 in Test.tex line 164: You should remove spaces in front of `\footnote' +This is a footnote \footnote{foo}. + ^ +Message 22 in Test.tex line 168: Comment displayed. +% Verb check +^ +Message 14 in Test.tex line 171: Could not find argument for command. +\verb# +^^^^^ +Message 31 in Test.tex line 175: This text may be ignored. +\end{verbatim} FOO + ^^^ +Message 22 in Test.tex line 177: Comment displayed. +% Warning 16,15 +^ +Message 16 in Test.tex line 181: Mathmode still on at end of LaTeX file. + + +Message 17 in Test.tex line 181: Number of `(' doesn't match the number of `)'! + + +Message 17 in Test.tex line 181: Number of `[' doesn't match the number of `]'! + + +Message 17 in Test.tex line 181: Number of `{' doesn't match the number of `}'! + + diff --git a/Build/source/texk/chktex/Test.tex b/Build/source/texk/chktex/Test.tex new file mode 100644 index 00000000000..65067b75f16 --- /dev/null +++ b/Build/source/texk/chktex/Test.tex @@ -0,0 +1,181 @@ +Note: This file was written with only two purposes in mind: + o To test the program upon it + o To show off some of the features + +Most of the file does thus consist of lots of pseudo-commands, which +are nonsense in a TeXnical manner. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% Warning 1 + +\foo This is an error. +\smallskip This is a not. $\foo Neither$ is this. + +% Warning 2 + +This is a faulty reference to \ref{foo} +This is not a faulty reference to~\ref{foo} + +% Warning 3 + +$[(ab)^{-1}]^{-2}$ is not beautiful +${{[{(ab)}^{-1}]}}^{-2}$ is beautiful + +% Warning 4-6, 28 + +Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. +Testing {\it italic\/} in this {\em sentence}, as {\em you see}. + +% LaTeX2e + +Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. +Testing \textem{italic\/} in this \textit{sentence}, as \textem{you see}. + +% Warning 7 + +This \'is a test of $\hat{j}$ accents. +This \'{\i}s a test of $\hat{\jmath}$ accents. + +% Warning 8 + +It wasn't anything - just a 2---3 star--shots. +It wasn't anything --- just a 2--3 star-shots. + +% Warning 9-10 + +% Brackets: + +)}{[])} }}}]]]))) +{[]} ((([[[{{{}}}]]]))) + +% Envs: + +\begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo} + +\begin{foo} \begin{bar} \end{bar}\end{foo} + +% Warning 11 + +Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. +Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$. + +% Warning 12 + +1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar +1st.\ foo Inc.\ ab.cd.\ foo ab.cd.\ Foo.\ bar + +% Warning 13 + +Look at THIS! It's an error. +Look at THIS\@! It's an error. D. E. Knuth. + +% Warning 14 + +\hat +\hat{a} + +% Warning 18,19 + +Is this an "example", or is it an ´example´. +Is this an `example', or is it an `example'. + +% Warning 20 + +That bug is \unknown\ to me. + +% Warning 21 + +\LaTeX\ is an extension of \TeX\. Right? +\LaTeX\ is an extension of \TeX. Right? + +% Warning 23 + +```Hello', I heard him said'', she remembered. +``\,`Hello', I heard him said'', she remembered. + +% Warning 24 + +Indexing text \index{text} is fun! +Indexing text\index{text} is fun! + +% Warning 25 + +$5\cdot10^10$ +$5\cdot10^{10}$ + +% Warning 26 + +Do you understand ? +Do you understand? + +% Warning 27 + +\input input.tex +\input input + +% Warning 29 +The program opens a screen sized 640x200 pixels +The program opens a screen sized $640\times200$ pixels + +% Warning 30 + +White is a beautiful colour. +White is a beautiful colour. + +% Warning 31 +\begin{verbatim} +\this is +\end{verbatim} foo bar + +% Warning 32-34 + +This is either an 'example`, an ''example`` or an `"`example'`'. +This is either an `example', an ``example'' or an ``example''. + +% Warning 35 + +$sin^2 + cos^2 = 1$ +$\sin^2 + \cos^2 = 1$ + +% Warning 36-37 + +This( an example( Nuff said )), illustrates( ``my'' )point. +This (an example (Nuff said)), illustrates (``my'') point. + +% Warning 38 +``An example,'' he said, ``would be great.'' +``An example'', he said, ``would be great''. + +% Warning 39 + +For output codes, see table ~\ref{tab:fmtout}. +For output codes, see table~\ref{tab:fmtout}. + +% Warning 40 +$\this,$ and $$this$$. +$\this$, and $$this.$$ + +% Warning 41 +foo \above qux +\frac{foo}{qux} + +% Warning 42 +This is a footnote \footnote{foo}. +This is a footnote\footnote{foo}. + + +% Verb check + +\verb@\this is )() lots of errors, etc. Or what?@ +\verb# + +\begin{verbatim} +\this is +\end{verbatim} FOO + +% Warning 16,15 + +$$( + + diff --git a/Build/source/texk/chktex/Utility.c b/Build/source/texk/chktex/Utility.c new file mode 100644 index 00000000000..e5428593b5b --- /dev/null +++ b/Build/source/texk/chktex/Utility.c @@ -0,0 +1,937 @@ +/* + * ChkTeX v1.5, utility functions. + * Copyright (C) 1995-96 Jens T. Berger Thielemann + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Contact the author at: + * Jens Berger + * Spektrumvn. 4 + * N-0666 Oslo + * Norway + * E-mail: <jensthi@ifi.uio.no> + * + * + */ + +#include "ChkTeX.h" +#include "Utility.h" +#include "Resource.h" +#include "OpSys.h" + +#ifdef ASM_HASHWORD +extern UWORD HashWord(STRPTR a); +typedef UWORD HASH_TYPE; +#else +typedef ULONG HASH_TYPE; +#endif + +/***************************** SUPPORT FUNCTIONS ************************/ + + +/* + * Copies a string with a maximum length of `len' starting at `pos' in + * `source' into `dest'. + * Returns -1 if the pos value is beyond the length of the source value, + * else NULL. + */ + + +WORD substring(const STRPTR source, STRPTR dest, ULONG pos, LONG len) +{ + STRPTR Start; + WORD Retval = -1; + + if(len >= 0) + { + if(strlen(source) > pos) + { + Start = &source[pos]; + + while((len-- > 0) && (*dest++ = *Start++)) + ; + + if(len == -1) + Retval = 0; + } + } + else + Retval = 0L; + + *dest = 0; + + return(Retval); +} + + +/* + * Determine whether a file exists. + * + */ + + +BOOL fexists(const STRPTR Filename) +{ + BOOL Retval; + +#if defined(F_OK) && defined(R_OK) && defined(HAVE_ACCESS) + Retval = access(Filename, F_OK|R_OK) == 0; +#else + FILE *fh; + + if(fh = fopen(Filename, "r")) + { + Retval = TRUE; + fclose(fh); + } + else + Retval = FALSE; +#endif + return(Retval); +} + + + +/* + * 'Safe' memset() replacement. + * Just tries to check the parameters, so that the risk of killing + * innocent memory is lowered. + * Please note that the `n' parameter now is an signed longword, not + * an size_t. Won't permit that `n' exceeds BUFLEN, nor negative sizes. + * Returns `to' if some memset()'ing was done, NULL if not. + */ + +APTR sfmemset(APTR to, int c, LONG n) +{ + if(to && (n > 0)) + { + n = min(n, BUFSIZ); + + return(memset(to, c, (size_t) n)); + } + return(NULL); +} + + +/* + * Quick replace function + * Replaces every occurrence of a character in a string with another one. + */ + +void strrep(STRPTR String, /* String to replace within. */ + const TEXT From, /* Character to search for. */ + const TEXT To) /* Character to put instead. */ +{ + register int c; + while((c = *String++)) + { + if(c == From) + String[-1] = To; + } +} + +/* + * Replaces every char not in Prot with To in Buf + */ + +void strxrep(STRPTR Buf, + const STRPTR Prot, + const TEXT To) +{ + int c; + + while((c = *Buf)) + { + if(!strchr(Prot, c)) + *Buf = To; + Buf++; + } +} + +/* + * Strips tail and/or front of a string + * Kills trailing/leading spaces. The macro/function LATEX_SPACE(char c) + * is used to decide whether a space should be skipped. This function + * should return TRUE if the character should be skipped, FALSE if not. + * Returns the string which was passed onto it. + */ + + +STRPTR strip(STRPTR str, /* String to strip */ + const enum Strip flags) + /* One of the following: */ + /* STRP_LFT - Strips leading blanks */ + /* STRP_RGT - Strips trailing blanks */ + /* STRP_BTH - Strips on both sides */ +{ + STRPTR bufptr = str, nlptr; + TEXT c; + + if(bufptr && (c = *bufptr)) + { + if(flags & STRP_LFT) + { + if(LATEX_SPACE(c) && c) + { + do + { + c = *++bufptr; + } while(LATEX_SPACE(c) && c); + } + } + + if(flags & STRP_RGT) + { + if(c && *bufptr) + { + nlptr = bufptr; + + while(*++nlptr); + + do + { + *nlptr = 0; + c = *--nlptr; + } while(LATEX_SPACE(c) && c && (nlptr > bufptr)); + + } + else + *bufptr = 0; + } + } + return(bufptr); +} + + +/* + * Converts all the chars in the string passed into lowercase. + */ + +#ifndef HAVE_STRLWR +STRPTR strlwr(STRPTR String) +{ + STRPTR Bufptr; + TEXT TmpC; + + for(Bufptr = String; + (TmpC = *Bufptr); + Bufptr++) + *Bufptr = tolower(TmpC); + + return(String); +} +#endif + +/* + * Returns a duplicate of the string passed. + */ + +#ifndef HAVE_STRDUP +STRPTR strdup(const STRPTR String) +{ + STRPTR Retval = NULL; + size_t Len; + + if(String) + { + Len = strlen(String) + 1; + if((Retval = malloc(Len))) + memcpy(Retval, String, Len); + } + + return(Retval); +} +#endif + +/* + * Does the same as strdup, but adds a zero-filled padding, length extra bytes. + */ + +STRPTR strdupx(const STRPTR String, int Extra) +{ + STRPTR Retval = NULL; + size_t Len; + + if(String) + { + Len = strlen(String) + 1 + Extra; + if((Retval = malloc(Len))) + strncpy(Retval, String, Len); + } + + return(Retval); +} + +/* + * Case-insensitive comparison of two strings. + */ + +#ifndef HAVE_STRCASECMP +int strcasecmp(const char* a, const char *b) +{ + int aa, bb; + + do + { + aa = *a++; + bb = *b++; + } while(aa && (tolower(aa) == tolower(bb))); + /* bb != 0 is implicit */ + + return(tolower(aa) - tolower(bb)); +} +#endif + +/* + * Not all reallocs are intelligent enough to handle NULL's as + * parameters. This fixes this. + */ + +void *saferealloc(void *b, size_t n) +{ + APTR Retval = NULL; + + if(b) + { + if(n) + Retval = realloc(b, n); + else + free(b); + } + else + Retval = malloc(n); + + return(Retval); +} + +/* + * Repeatedly writes the From string over To so that we overwrite Len bytes. + * Does nothing if passed empty/NULL string. + */ + +void strwrite (STRPTR To, const STRPTR From, ULONG Len) +{ + ULONG i, j; + ULONG FromLen = strlen(From); + + Len = min(Len, BUFSIZ); + + if(To && From) + { + switch(FromLen) + { + case 0: + break; + case 1: + memset(To, *From, Len); + break; + default: + for(i = j = 0; + i < Len; + i++, j++) + { + if(j >= FromLen) + j = 0; + To[i] = From[j]; + } + } + } +} + +/* + * Checks whether Cmp comes after Str. + * + */ + +int strafter(const STRPTR Str, const STRPTR Cmp) +{ + return(strncmp(Str, Cmp, strlen(Cmp))); +} + +/* + * Checks whether Cmp comes before Str. Returns 0 if so, non-zero if not. + * + */ + +int strinfront(STRPTR Str, STRPTR Cmp) +{ + int CmpLen; + + if((CmpLen = strlen(Cmp))) + { + Cmp += CmpLen; + Str++; + + while((*--Cmp == *--Str) && (--CmpLen > 0)) + ; + + return(CmpLen); + } + else + return(1); +} + + +/*************************** HASH INDEX **************************/ + +/* + * Hashes a string. The string ought be rather short. We use an asm + * version the Amiga; note that this returns an UWORD instead. + * + * The algorithm was designed by Peter Weinberger. This version was + * adapted from Dr Dobb's Journal April 1996 page 26. + */ + +#ifndef ASM_HASHWORD +inline static ULONG HashWord(STRPTR str) +{ + register ULONG h = 0, hbit, c; + + while((c = *str++)) + { + h = (h<<4) ^ c; + if((hbit = h & 0xf0000000)) + h ^= hbit>>24; + h &= ~hbit; + } + + return(h); +} +#endif + +/* + * Inserts a string into a hash index. Note: You'll have to + * duplicate the string yourself. + */ + +inline void InsertHash(const STRPTR a, struct Hash *h) +{ + struct HashEntry **he, *newhe; + + if(!h->Index) + { + ifn((h->Index = calloc(HASH_SIZE, sizeof(struct HashEntry *)))) + PrintPrgErr(pmWordListErr); + } + + he = &h->Index[HashWord(a) % HASH_SIZE]; + + if((newhe = malloc(sizeof(struct HashEntry)))) + { + newhe->Next = *he; + newhe->Str = a; + *he = newhe; + } + else + PrintPrgErr(pmWordListErr); +} + +/* + * Checks whether a string previously has been registered in a + * hash index. + */ + +inline STRPTR HasHash(const STRPTR a, const struct Hash *h) +{ + struct HashEntry *he; + HASH_TYPE i; /* Special magic to optimize SAS/C */ + + i = HashWord(a); + i %= HASH_SIZE; + he = h->Index[i]; + + while(he) + { + if(!strcmp(he->Str, a)) + return(he->Str); + else + he = he->Next; + } + return(NULL); +} + +/* + * Clears a hash table. + */ + +void ClearHash(struct Hash *h) +{ + if(h && h->Index) + memset(h->Index, '\0', HASH_SIZE * sizeof(struct HashEntry *)); +} + +/* + * Rehashes a wordlist. If you change any of the elem's, you must + * call this. + * + */ + +static void ReHash(struct WordList *WL) +{ + ULONG i = 0; + + ClearHash(&WL->Hash); + FORWL(i, *WL) + InsertHash(WL->Stack.Data[i], &WL->Hash); +} + +/*************************** WORDLIST HANDLING **************************/ + +/* + * Inserts a duplicate of `Word' into the `Wordlist' structure. You do thus + * not need to make a duplicate of `Word' yourself. + */ + +BOOL InsertWord(const STRPTR Word, struct WordList *WL) +{ + STRPTR WrdCpy; + ULONG Len; + + if((WrdCpy = strdupx(Word, WALLBYTES))) + { + if(StkPush(WrdCpy, &WL->Stack)) + { + Len = strlen(Word); + if(WL->MaxLen < Len) + WL->MaxLen = Len; + + InsertHash(WrdCpy, &WL->Hash); + return(TRUE); + } + + free(WrdCpy); + } + + return(FALSE); +} + +/* + * Clears a WordList; removing all items. + */ + +void ClearWord(struct WordList *WL) +{ + if(WL) + { + WL->Stack.Used = 0; + WL->MaxLen = 0; + ClearHash(&WL->Hash); + if(WL->NonEmpty) + InsertWord("", WL); + } +} + +/* + * Query whether a `Word' is previously InsertWord()'ed into the WL + * structure. Does case-sensitive comparison. + * + * Returns the data in the list. + */ + + +STRPTR HasWord(const STRPTR Word, struct WordList *WL) +{ + return(HasHash(Word, &WL->Hash)); +} + +/* + * Make all the words in a list lower case for later case-insensitive + * comparison. + */ + +void MakeLower(struct WordList *wl) +{ + ULONG i; + FORWL(i, *wl) + strlwr(wl->Stack.Data[i]); + ReHash(wl); +} + +/* + * Calls strrep on each argument in a list. + */ + +void ListRep(struct WordList *wl, const TEXT From, const TEXT To) +{ + ULONG i; + FORWL(i, *wl) + strrep(wl->Stack.Data[i], From, To); + ReHash(wl); +} + + + +/************************** GENERIC STACK ******************************/ + +/* + * Push something onto a stack. Returns TRUE if successful, else FALSE. + * Note: You can not push a NULL Data element. + */ + +BOOL StkPush(const APTR Data, struct Stack *Stack) +{ + ULONG NewSize; + APTR *NewBuf; + + if(Data && Stack) + { + if(Stack->Used >= Stack->Size) + { + NewSize = Stack->Size + MINPUDDLE; + + if((NewBuf = saferealloc(Stack->Data, + (size_t) NewSize * sizeof(APTR)))) + { + Stack->Size = NewSize; + Stack->Data = NewBuf; + } + else + return(FALSE); + } + + Stack->Data[Stack->Used++] = Data; + return(TRUE); + } + + return(FALSE); +} + +/* + * Pops an element from the stack. + * + */ + +inline APTR StkPop(struct Stack *Stack) +{ + APTR Retval = NULL; + + if(Stack && (Stack->Used > 0)) + { + Retval = Stack->Data[--Stack->Used]; + +#ifdef NO_DIRTY_TRICKS + { + APTR *NewBuf; + + if(Stack->Used < (Stack->Size/2)) + { + ULONG NewSize; + NewSize = Stack->Size - MINPUDDLE; + NewSize = max(NewSize, MINPUDDLE); + + if(NewBuf = saferealloc(Stack->Data, + (size_t) NewSize * sizeof(APTR))) + { + Stack->Size = NewSize; + Stack->Data = NewBuf; + } + } + } +#endif + } + return(Retval); +} + +/* + * Returns the topmost element of the stack. + */ + +APTR StkTop(struct Stack *Stack) +{ + if(Stack && (Stack->Used > 0)) + return(Stack->Data[Stack->Used - 1]); + else + return(NULL); +} + +/****************************** INPUT STACK *****************************/ + +BOOL PushFileName(const STRPTR Name, struct Stack *stack) +{ + FILE *fh = NULL; + static + TEXT NameBuf [BUFSIZ]; + + if(Name && stack) + { + if(LocateFile(Name, NameBuf, ".tex", &TeXInputs)) + { + if((fh = fopen(NameBuf, "r"))) + { + return(PushFile(NameBuf, fh, stack)); + } + } + PrintPrgErr(pmNoTeXOpen, Name); + } + return(FALSE); +} + + +BOOL PushFile(STRPTR Name, FILE *fh, struct Stack *stack) +{ + struct FileNode *fn; + + if(Name && fh && stack) + { + if((fn = malloc(sizeof(struct FileNode)))) + { + if((fn->Name = strdup(Name))) + { + fn->fh = fh; + fn->Line = 0L; + if(StkPush(fn, stack)) + return(TRUE); + free(fn->Name); + } + free(fn); + } + PrintPrgErr(pmNoStackMem); + } + + return(FALSE); +} + +STRPTR FGetsStk(STRPTR Dest, ULONG len, struct Stack *stack) +{ + struct FileNode *fn; + STRPTR Retval = NULL; + + if((fn = StkTop(stack))) + { + do + { + if((Retval = fgets(Dest, (int) len, fn->fh))) + { + fn->Line++; + break; + } + + fn = StkPop(stack); + fclose(fn->fh); + free(fn); + + } while(!Retval && (fn = StkTop(stack))); + } + + return(Retval); +} + +STRPTR CurStkName(struct Stack *stack) +{ + struct FileNode *fn; + static + STRPTR LastName = ""; + + if(PseudoInName && (stack->Used <= 1)) + return(PseudoInName); + else + { + if((fn = StkTop(stack))) + return(LastName = fn->Name); + else + return(LastName); + } +} + + +FILE *CurStkFile(struct Stack *stack) +{ + struct FileNode *fn; + + if((fn = StkTop(stack))) + return(fn->fh); + else + return(NULL); +} + +ULONG CurStkLine(struct Stack *stack) +{ + struct FileNode *fn; + static + ULONG LastLine = 0L; + + if((fn = StkTop(stack))) + return(LastLine = fn->Line); + else + return(LastLine); +} + + + +/************************** CHARACTER STACK ******************************/ + +/* + * Pushes the character on the stack. + */ + +struct ErrInfo *PushChar(const TEXT c, const ULONG Line, + const ULONG Column, struct Stack *Stk, + const STRPTR LineCpy) +{ + TEXT Buf[2]; + + Buf[0] = c; Buf[1] = 0; + + return(PushErr( Buf, Line, Column, 1, LineCpy, Stk)); +} + +struct ErrInfo *PushErr(const STRPTR Data, const ULONG Line, + const ULONG Column, const ULONG ErrLen, + const STRPTR LineCpy, struct Stack *Stk) +{ + struct ErrInfo *ci; + + if((ci = malloc(sizeof(struct ErrInfo)))) + { + if((ci->Data = strdup(Data))) + { + ci->File = CurStkName(&InputStack); + ci->Line = Line; + ci->ErrLen = ErrLen; + ci->Column = Column; + ci->LineBuf = LineCpy; + ci->Flags = efNone; + + if(StkPush(ci, Stk)) + return(ci); + } + else + PrintPrgErr(pmStrDupErr); + free(ci); + } + + return(NULL); +} + +/* + * Finds the uppermost entry in the stack with a data matching + * String. + */ + +struct ErrInfo *TopMatch(struct Stack *Stack, STRPTR String) +{ + int i; + struct ErrInfo *retval = NULL; + + if(Stack && String) + { + for(i = Stack->Used - 1; + i >= 0; + i--) + { + if(!strcmp(String, ((struct ErrInfo *) Stack->Data[i])->Data)) + { + retval = (struct ErrInfo *) Stack->Data[i]; + break; + } + } + } + return(retval); +} + +/* + * Returns and removes a character from the stack, returns NULL if + * the stack is empty. + */ + + +struct ErrInfo *PopErr(struct Stack *Stack) +{ + return((struct ErrInfo *) StkPop(Stack)); +} + +/* + * Same as PopChar(), but lets the error alone on the stack. + */ + + +struct ErrInfo *TopErr(struct Stack *Stack) +{ + return((struct ErrInfo *) StkTop(Stack)); +} + +/* + * Free all resources associated with a struct FreeInfo. + */ + +void FreeErrInfo(struct ErrInfo* ei) +{ + if(ei) { + if(ei->Data) + free(ei->Data); + + free(ei); + } +} + + +/************************* OPEN/CLOSE COUNTING **************************/ + +/* + * Returns the index a given bracket (`()[]{}') character has in the + * BrOrder array. Returns ~0 if the character was not a bracket. + */ + +LONG BrackIndex(const TEXT c) +{ + switch(c) + { + case '(': + return(0); + case ')': + return(1); + case '[': + return(2); + case ']': + return(3); + case '{': + return(4); + case '}': + return(5); + default: + return(~0L); + } +} + +/* + * Counts brackets for you. Give it a bracket, and it will update the + * corresponding counter. + */ + +void AddBracket(const TEXT c) +{ + LONG Index; + + if((Index = BrackIndex(c)) != -1) + Brackets[Index]++; + +} + +/* + * Returns the character that matches the given bracket, NULL if `c' + * wasn't a bracket character. + */ + +TEXT MatchBracket(const TEXT c) +{ + ULONG Index; + TEXT Char = 0; + + + if((Index = BrackIndex(c)) != ~0UL) + Char = BrOrder[Index ^ 1]; + + return(Char); +} diff --git a/Build/source/texk/chktex/Utility.h b/Build/source/texk/chktex/Utility.h new file mode 100644 index 00000000000..98acdd444f4 --- /dev/null +++ b/Build/source/texk/chktex/Utility.h @@ -0,0 +1,181 @@ +/* + * ChkTeX v1.5, utility functions -- header file. + * Copyright (C) 1995-96 Jens T. Berger Thielemann + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Contact the author at: + * Jens Berger + * Spektrumvn. 4 + * N-0666 Oslo + * Norway + * E-mail: <jensthi@ifi.uio.no> + * + * + */ + +#ifndef UTILITY_H +#define UTILITY_H 1 + +#ifndef CHKTEX_H +# include "ChkTeX.h" +#endif /* CHKTEX_H */ +#ifndef OPSYS_H +# include "OpSys.h" +#endif /* OPSYS_H */ + + +/* + * How many indexes we'll allocate first time + */ +#define MINPUDDLE 256 + +/* + * How many bytes we want in front/end of each TEXT buffer. > 2 + */ +#define WALLBYTES 4 + +#ifndef HASH_SIZE +# define HASH_SIZE 1009 /* A reasonably large prime */ +#endif + +#define FORWL(ind, list) for(ind = 0; ind < (list).Stack.Used; ind++) + + +enum Strip { + STRP_LFT = 0x01, + STRP_RGT = 0x02, + STRP_BTH = 0x03 +}; + +struct HashEntry { + struct HashEntry *Next; + STRPTR Str; +}; + +struct Hash { + struct HashEntry **Index; +}; + +struct Stack { + APTR *Data; + ULONG Size, Used; +}; + +struct WordList { + ULONG MaxLen; + BOOL NonEmpty; + struct Stack Stack; + struct Hash Hash; +}; +#define WORDLIST_DEFINED + +struct FileNode { + STRPTR Name; + FILE *fh; + ULONG Line; +}; + +/* Rotates x n bits left (should be an int, long, etc.) */ +#define ROTATEL(x,n) ((x<<n) | (x>>((CHAR_BIT*sizeof(x)) - n))) + +/* Rotates x n bits right (should be an int, long, etc.) */ +#define ROTATER(x,n) ((x>>n) | (x<<((CHAR_BIT*sizeof(x)) - n))) + +BOOL fexists __PROTO((const STRPTR Filename)); + +APTR sfmemset __PROTO((APTR to, int c, LONG n)); +void * saferealloc __PROTO((void *old, size_t newsize)); + +int strafter __PROTO((const STRPTR Str, const STRPTR Cmp)); +void strrep __PROTO((STRPTR String, const TEXT From, + const TEXT To)); +void strxrep __PROTO((STRPTR Buf, const STRPTR Prot, + const TEXT To)); +STRPTR strip __PROTO((STRPTR String, const enum Strip What)); +void strwrite __PROTO((STRPTR To, const STRPTR From, ULONG Len)); +int strinfront __PROTO((STRPTR Str, STRPTR Cmp)); +STRPTR strdupx __PROTO((const STRPTR String, int Extra)); +void strmove __PROTO((char *a, const char *b)); + +inline void + ClearHash __PROTO((struct Hash *h)); +inline void + InsertHash __PROTO((const STRPTR a, struct Hash *h)); +inline STRPTR + HasHash __PROTO((const STRPTR a, const struct Hash *h)); + +BOOL InsertWord __PROTO((const STRPTR Word, struct WordList *WL)); +STRPTR HasWord __PROTO((const STRPTR Word, struct WordList *WL)); +void MakeLower __PROTO((struct WordList *wl)); +void ListRep __PROTO((struct WordList *wl, const TEXT From, + const TEXT To)); +void ClearWord __PROTO((struct WordList *WL)); + +BOOL StkPush __PROTO((const APTR Data, struct Stack *Stack)); +inline APTR + StkPop __PROTO((struct Stack *Stack)); +APTR + StkTop __PROTO((struct Stack *Stack)); + +FILE * CurStkFile __PROTO((struct Stack *stack)); +STRPTR CurStkName __PROTO((struct Stack *stack)); +ULONG CurStkLine __PROTO((struct Stack *stack)); +STRPTR FGetsStk __PROTO((STRPTR Dest, ULONG len, struct Stack *stack)); +BOOL PushFileName __PROTO((const STRPTR Name, struct Stack *stack)); +BOOL PushFile __PROTO((STRPTR, FILE *, struct Stack *)); + + +void FreeErrInfo __PROTO((struct ErrInfo* ei)); +struct ErrInfo * + PushChar __PROTO((const TEXT c, const ULONG Line, + const ULONG Column, struct Stack *Stk, + const STRPTR LineCpy)); +struct ErrInfo * + PushErr __PROTO((const STRPTR Data, const ULONG Line, + const ULONG Column, const ULONG ErrLen, + const STRPTR LineCpy, struct Stack *Stk)); +struct ErrInfo *TopChar __PROTO((struct Stack *Stack)); +struct ErrInfo *TopErr __PROTO((struct Stack *Stack)); +struct ErrInfo *PopErr __PROTO((struct Stack *Stack)); +struct ErrInfo *TopMatch __PROTO((struct Stack *Stack, STRPTR String)); + +LONG BrackIndex __PROTO((TEXT const c)); +void AddBracket __PROTO((TEXT const c)); +TEXT MatchBracket __PROTO((TEXT const)); + + + +WORD substring __PROTO((const STRPTR source, STRPTR dest, + ULONG pos, LONG len)); + +#ifndef HAVE_STRLWR +# define strlwr mystrlwr +STRPTR mystrlwr __PROTO((STRPTR String)); +#endif + +#ifndef HAVE_STRDUP +# define strdup mystrdup +STRPTR mystrdup __PROTO((const STRPTR String)); +#endif + + +#ifndef HAVE_STRCASECMP +int strcasecmp(char* a, char* b); +#endif + + + +#endif /* UTILITY_H */ diff --git a/Build/source/texk/chktex/chktex.c b/Build/source/texk/chktex/chktex.c new file mode 100644 index 00000000000..62e2d40236c --- /dev/null +++ b/Build/source/texk/chktex/chktex.c @@ -0,0 +1,1080 @@ +/* + * ChkTeX v1.5, finds typographic errors in (La)TeX files. + * Copyright (C) 1995-96 Jens T. Berger Thielemann + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Contact the author at: + * Jens Berger + * Spektrumvn. 4 + * N-0666 Oslo + * Norway + * E-mail: <jensthi@ifi.uio.no> + * + * + */ + + +#ifdef AMIGA +# include <exec/execbase.h> +# include "WB2Argv.h" +#endif + +#ifdef WIN32 +#include <getopt.h> +#else +#include "getopt.h" +#endif +#include "ChkTeX.h" +#include "OpSys.h" +#include "Utility.h" +#include "FindErrs.h" +#include "Resource.h" +#include <string.h> + +#ifdef KPATHSEA +#include <kpathsea/config.h> +#include <kpathsea/progname.h> +#endif + +#undef MSG +#define MSG(num, type, inuse, ctxt, text) {num, type, inuse, ctxt, text}, + +struct ErrMsg PrgMsgs [pmMaxFault + 1] = +{ + PRGMSGS + {pmMaxFault, etErr, TRUE, 0, INTERNFAULT} +}; + +struct Stack + CharStack = {0L}, + InputStack = {0L}, + EnvStack = {0L}; + +/************************************************************************/ + +const TEXT BrOrder [NUMBRACKETS + 1] = "()[]{}"; + +ULONG Brackets [NUMBRACKETS]; + +/************************************************************************/ + + +/* + * Have to do things this way, to ease some checking throughout the + * program. + */ + + +NEWBUF(TmpBuffer, BUFSIZ); +NEWBUF(ReadBuffer, BUFSIZ); + +static const STRPTR + Banner = +"ChkTeX v1.5 - Copyright 1995-96 Jens T. Berger Thielemann.\n" +#ifdef __OS2__ +"OS/2 port generated with emx compiler, by Wolfgang Fritsch, <fritsch@hmi.de>" +#elif defined(__MSDOS__) +"MS-DOS port by Bj\\o rn Ove Thue, <bjort@ifi.uio.no>" +#elif defined(KPATHSEA) +"Kpathsea port by Fabrice Popineau, <Fabrice.Popineau@supelec.fr>" +#endif +"\n", + BigBanner = +"ChkTeX comes with ABSOLUTELY NO WARRANTY; details on this and\n" +"distribution conditions in the GNU General Public License file.\n" +"Type \"ChkTeX -h\" for help, \"ChkTeX -i\" for distribution info.\n" +"Author: Jens Berger, Spektrumvn. 4, N-0666 Oslo, Norway.\n" +"E-mail: <jensthi@ifi.uio.no>\n" +"Press " STDIN_BREAK " to abort stdin input.\n", + GiftBanner = +"\n" +" If you like this program and use it frequently the author\n" +" would like you to send him any gift that you feel would\n" +" be an appropriate `payment' for `ChkTeX' --- thank you!\n" +"\n", +Distrib = +"\n" +"This program is free software; you can redistribute it and/or modify\n" +"it under the terms of the GNU General Public License as published by\n" +"the Free Software Foundation; either version 2 of the License, or\n" +"(at your option) any later version.\n" +"\n" +"This program is distributed in the hope that it will be useful,\n" +"but WITHOUT ANY WARRANTY; without even the implied warranty of\n" +"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" +"GNU General Public License for more details.\n" +"\n" +"You should have received a copy of the GNU General Public License\n" +"along with this program; if not, write to the Free Software\n" +"Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n" +, +OnText = +"On", +OffText = +"Off", +HowHelp = +"-h or --help gives usage information. See also ChkTeX.{ps,dvi}.\n", +HelpText = +"\n" +"\n" +" Usage of ChkTeX v1.5\n" +" ~~~~~~~~~~~~~~~~~~~~\n" +"\n" +" Template\n" +" ~~~~~~~~\n" +"chktex [-hiqrW] [-v[0-...]] [-l <rcfile>] [-[wemn] <[1-42]|all>]\n" +" [-d[0-...]] [-p <name>] [-o <outfile>] [-[btxgI][0|1]]\n" +" file1 file2 ...\n" +"\n" +"----------------------------------------------------------------------\n" +" Description of options:\n" +" ~~~~~~~~~~~~~~~~~~~~~~~\n" +"Misc. options\n" +"~~~~~~~~~~~~~\n" +" -h --help : This text.\n" +" -i --license : Show distribution information\n" +" -l --localrc : Read local .chktexrc formatted file.\n" +" -d --debug : Debug information. Give it a number.\n" +" -r --reset : Reset settings to default.\n" +"\n" +"Muting warning messages:\n" +"~~~~~~~~~~~~~~~~~~~~~~~~\n" +" -w --warnon : Makes msg # given a warning and turns it on.\n" +" -e --erroron : Makes msg # given an error and turns it on.\n" +" -m --msgon : Makes msg # given a message and turns it on.\n" +" -n --nowarn : Mutes msg # given.\n" +"\n" +"Output control flags:\n" +"~~~~~~~~~~~~~~~~~~~~~\n" +" -v --verbosity : How errors are displayed.\n" +" Default 1, 0=Less, 2=Fancy, 3=lacheck.\n" +" -V --pipeverb : How errors are displayed when stdout != tty.\n" +" Defaults to the same as -v.\n" +" -s --splitchar : String used to split fields when doing -v0\n" +" -o --output : Redirect error report to a file.\n" +" -q --quiet : Shuts up about version information.\n" +" -p --pseudoname: Input file-name when reporting.\n" +" -f --format : Format to use for output\n" +"\n" +"Boolean switches (1 -> enables / 0 -> disables):\n" +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +" -b --backup : Backup output file.\n" +" -x --wipeverb : Ignore contents of `\\verb' commands.\n" +" -g --globalrc : Read global .chktexrc file.\n" +" -I --inputfiles: Execute \\input statements.\n" +" -H --headererr : Show errors found in front of \\begin{document}\n" +"\n" +"Miscellaneous switches:\n" +"~~~~~~~~~~~~~~~~~~~~~~~\n" +" -W --version : Version information\n" +"\n" +"----------------------------------------------------------------------\n" +"If no LaTeX files are specified on the command line, we will read from\n" +"stdin. For explanation of warning/error messages, please consult the\n" +"main document ChkTeX.dvi or ChkTeX.ps.\n"; + + + + +#define CHAR(a) a, + +TEXT LTX_EosPunc[] = {LATEX_EOSPUNC 0}; +TEXT LTX_GenPunc[] = {LATEX_GENPUNC 0}; +TEXT LTX_SmallPunc[] = {LATEX_SMALLPUNC 0}; + +/* + * Options we will set. + * + */ + +enum Quote Quote; + +TEXT VerbNormal [] = + "%k %n in %f line %l: %m\n" + "%r%s%t\n" + "%u\n"; + +#define DEF(type, name, value) type name = value; +OPTION_DEFAULTS +STATE_VARS +#undef DEF + +FILE *OutputFile = NULL; + +STRPTR PrgName; + +BOOL StdInTTY, StdOutTTY; + +/* + * End of config params. + */ + +static int ParseArgs __PROTO((int argc, char **argv)); +static void ShowIntStatus __PROTO((void)); +static BOOL OpenOut __PROTO((void)); +static int ShiftArg __PROTO((STRPTR *Argument)); + + +/* + * Duplicates all arguments, and appends an asterix to each of them. + */ + +static void AddStars(struct WordList *wl) +{ + ULONG Count, CmdLen; + STRPTR Data; + + FORWL(Count, *wl) + { + Data = wl->Stack.Data[Count]; + CmdLen = strlen(Data); + if(Data[CmdLen - 1] != '*') + { + strcpy(TmpBuffer, Data); + strcat(TmpBuffer, "*"); + InsertWord(TmpBuffer, wl); + } + } +} + +/* + * Sets up all the lists. + * + */ + +static void SetupLists(void) +{ + ULONG i; + + AddStars(&VerbEnvir); + AddStars(&MathEnvir); + + MakeLower(&UserWarnCase); + + ListRep(&WipeArg, ':', 0); + ListRep(&NoCharNext, ':', 0); + +#define ThisItem ((STRPTR) AbbrevCase.Stack.Data[i]) + + FORWL(i, AbbrevCase) + { + if(isalpha(ThisItem[0])) + { + ThisItem[0] = toupper(ThisItem[0]); + InsertWord(ThisItem, &Abbrev); + ThisItem[0] = tolower(ThisItem[0]); + } + InsertWord(ThisItem, &Abbrev); + } +} + +#define NOCOMMON(a,b) NoCommon(&a,#a,&b,#b) + +/* + * Checks that two lists don't have any common element. + */ + +static void NoCommon(struct WordList *a, const STRPTR aName, + struct WordList *b, const STRPTR bName) +{ + ULONG i; + + FORWL(i, *a) + { + if(HasWord((STRPTR) a->Stack.Data[i], b)) + PrintPrgErr(pmNoCommon, a->Stack.Data[i], aName, bName); + } +} + +/* + * Expands the tabs in a string to regular intervals sized + * TSize. + */ + +static void ExpandTabs(STRPTR From, STRPTR To, LONG TSize) +{ + STRPTR Next, Orig; + ULONG Diff; + + Next = From; + Orig = To; + + while((Next = strchr(From, '\t'))) + { + if((Diff = Next - From)) + { + strncpy(To, From, Diff); + To += Diff; + Diff = TSize - ((To - Orig) % TSize); + } + else + Diff = TSize; + + memset(To, ' ', Diff); + To += Diff; + + From = ++Next; + } + strcpy(To, From); +} + + +int main(int argc, char **argv) +{ + int retval = EXIT_FAILURE, CurArg; + ULONG Count; + BOOL StdInUse = FALSE; + STRPTR NameMatch = ""; + LONG Tab = 8; + +#ifdef KPATHSEA + extern KPSEDLL char *kpse_bug_address; + + kpse_set_program_name (argv[0], "ChkTeX"); +#endif + +#ifdef __LOCALIZED + InitStrings(); +#endif + +#ifdef AMIGA + if(_WBenchMsg) + { + if(argv = WB2Argv(_WBenchMsg, W2A_LOWER)) + argc = CountArgv(argv); + else + exit(EXIT_FAILURE); + } +#endif + + OutputFile = stdout; + PrgName = argv[0]; + +#undef KEY +#undef LCASE +#undef LIST +#undef LNEMPTY +#define KEY(a, def) +#define LCASE(a) +#define LIST(a) +#define LNEMPTY(a) InsertWord("", &a); + + RESOURCE_INFO; + + while(SetupVars()) + ReadRC(ConfigFile); + + if(CmdLine.Stack.Used) + { + ParseArgs(CmdLine.Stack.Used, (STRPTR *) CmdLine.Stack.Data); + CmdLine.Stack.Used = 1L; + } + + if((CurArg = ParseArgs((ULONG) argc, argv))) + { + if(CmdLine.Stack.Used) + { + ParseArgs(CmdLine.Stack.Used, (STRPTR *) CmdLine.Stack.Data); + CmdLine.Stack.Used = 1L; + } + + if(!Quiet || LicenseOnly) + fprintf(stderr, Banner); + + if(CurArg == argc) + UsingStdIn = TRUE; + +#if defined(HAVE_FILENO) && defined(HAVE_ISATTY) + StdInTTY = isatty(fileno(stdin)); + StdOutTTY = isatty(fileno(stdout)); +#else + StdInTTY = StdOutTTY = TRUE; +#endif + SetupTerm(); + + if((UsingStdIn && StdInTTY && !Quiet) || LicenseOnly) + { + fprintf(stderr, BigBanner); + if(!LicenseOnly) + fprintf(stderr, GiftBanner); + } + + if(!StdOutTTY && PipeOutputFormat) + OutputFormat = PipeOutputFormat; + + if(LicenseOnly) + { + fprintf(stderr, Distrib); + fprintf(stderr, GiftBanner); + } + else + { + SetupLists(); + if(QuoteStyle) + { + if(!strcasecmp(QuoteStyle, "LOGICAL")) + Quote = quLogic; + elif(!strcasecmp(QuoteStyle, "TRADITIONAL")) + Quote = quTrad; + else + { + PrintPrgErr(pmQuoteStyle, QuoteStyle); + Quote = quTrad; + } + } + + if(DebugLevel) + ShowIntStatus(); + + NOCOMMON(Italic, NonItalic); + NOCOMMON(Italic, ItalCmd); + NOCOMMON(LowDots, CenterDots); + + if(TabSize && isdigit(*TabSize)) + Tab = strtol(TabSize, NULL, 10); + + if(OpenOut()) + { + for(;;) + { + for(Count = 0; Count < NUMBRACKETS; Count++) + Brackets[Count] = 0L; + +#define DEF(type, name, value) name = value; + STATE_VARS +#undef DEF + + if(UsingStdIn) { + if(StdInUse) + break; + else { + StdInUse = TRUE; + PushFile("stdin", stdin, &InputStack); + } + } else { + if((CurArg <= argc) || NameMatch) { + ifn(NameMatch = MatchFileName(NULL)) { + if(CurArg < argc) + NameMatch = MatchFileName(argv[CurArg++]); + } + + if(!PushFileName(NameMatch, &InputStack)) + break; + } + } + + if(StkTop(&InputStack) && OutputFile) + { + while(!ferror(OutputFile) && StkTop(&InputStack) && + !ferror(CurStkFile(&InputStack)) && + FGetsStk(ReadBuffer, BUFSIZ-1, &InputStack)) + { + + /* Make all spaces ordinary spaces */ + + strrep(ReadBuffer, '\n', ' '); + strrep(ReadBuffer, '\r', ' '); + ExpandTabs(ReadBuffer, TmpBuffer, Tab); + strcpy(ReadBuffer, TmpBuffer); + + strcat(ReadBuffer, " "); + FindErr(ReadBuffer, CurStkLine(&InputStack)); + } + + PrintStatus(CurStkLine(&InputStack)); + retval = EXIT_SUCCESS; + } + } + } + } + } + exit(retval); + return retval; +} + +/* + * Opens the output file handle & possibly renames + */ + +static BOOL OpenOut(void) +{ +#ifdef __MSDOS__ + char *p; +#endif + BOOL Success = TRUE; + + if(*OutputName) + { + if(BackupOut && fexists(OutputName)) + { + strcpy(TmpBuffer, OutputName); + AddAppendix(TmpBuffer, BAKAPPENDIX); + + if(fexists(TmpBuffer)) + remove(TmpBuffer); + + if(!rename(OutputName, TmpBuffer)) + PrintPrgErr(pmRename, + OutputName, TmpBuffer); + else + { + PrintPrgErr(pmRenameErr, + OutputName, TmpBuffer); + Success = FALSE; + } + + } + + if(Success) + { + ifn(OutputFile = fopen(OutputName, "w")) + { + PrintPrgErr(pmOutOpen); + Success = FALSE; + } + } + } + else + OutputFile = stdout; + + return(Success); +} + +#ifndef STRIP_DEBUG +static void ShowWL(const STRPTR Name, const struct WordList *wl) +{ + ULONG i, j, percent; + + fprintf(stderr, + "Name: %12s", Name); + + if(DebugLevel & FLG_DbgListInfo) + { + fprintf(stderr, ", MaxLen: %3ld, Entries: %3ld, ", + wl->MaxLen, wl->Stack.Used); + + if(wl->Hash.Index && wl->Stack.Used) + { + for(i = j = 0; + i < HASH_SIZE; + i++) + { + if(wl->Hash.Index[i]) + j++; + } + percent = (j * 10000)/wl->Stack.Used; + + + fprintf(stderr, "Hash usage: %3ld.%02ld%%", + percent/100, percent%100); + } + else + fprintf(stderr, "No hash table."); + } + + fputc('\n', stderr); + + if(DebugLevel & FLG_DbgListCont) + { + FORWL(i, *wl) + fprintf(stderr, "\t%s\n", (STRPTR) wl->Stack.Data[i]); + } +} +#endif + +#define BOOLDISP(var) ((var)? OnText : OffText) +#define SHOWSTAT(text, arg) fprintf(stderr, "\t" text ": %s\n", arg) +#define BOOLSTAT(name, var) SHOWSTAT(name, BOOLDISP(var)) +#define SHOWSTR(text, arg) fprintf(stderr, "%s:\n\t%s\n", text, arg); + + +/* + * Prints some of the internal flags; mainly for debugging purposes + */ + +static void ShowIntStatus(void) +{ +#ifndef STRIP_DEBUG + ULONG Cnt; + STRPTR String, iuStr; + + if(DebugLevel & FLG_DbgMsgs) + { + fprintf(stderr, "There are %d warnings/error messages available:\n", + emMaxFault - emMinFault - 1); + + for(Cnt = emMinFault + 1; Cnt < emMaxFault; Cnt++) + { + switch(LaTeXMsgs[Cnt].Type) + { + case etWarn: String = "Warning"; break; + case etErr: String = "Error"; break; + case etMsg: String = "Message"; break; + default: String = ""; break; + } + + switch(LaTeXMsgs[Cnt].InUse) + { + case iuOK: iuStr = "In use"; break; + case iuNotUser: iuStr = "User muted"; break; + case iuNotSys: iuStr = "System muted"; break; + } + + fprintf(stderr, "Number: %2ld, Type: %s, Status: %s\n" + "\tText: %s\n\n", + Cnt, String, + iuStr, LaTeXMsgs[Cnt].Message); + } + } + +#undef KEY +#undef LCASE +#undef LNEMPTY +#undef LIST + +#define LNEMPTY LIST +#define LIST(a) ShowWL(#a, &a); +#define LCASE(a) LIST(a); LIST(a ## Case); +#define KEY(a,def) SHOWSTR(#a, a); + + + if(DebugLevel & (FLG_DbgListInfo | FLG_DbgListCont)) + { + RESOURCE_INFO; + } + + if(DebugLevel & FLG_DbgOtherInfo) + { + SHOWSTR("Outputformat", OutputFormat); + + fprintf(stderr, "Current flags include:\n"); + + BOOLSTAT("Read global resource", GlobalRC); + BOOLSTAT("Wipe verbose commands", WipeVerb); + BOOLSTAT("Backup outfile", BackupOut); + BOOLSTAT("Quiet mode", Quiet); + BOOLSTAT("Show license", LicenseOnly); + BOOLSTAT("Use stdin", UsingStdIn); + BOOLSTAT("\\input files", InputFiles); + BOOLSTAT("Output header errors", HeadErrOut); + } +#endif +} + +/* + * Resets all stacks. + * + */ + +#undef KEY +#undef LCASE +#undef LNEMPTY +#undef LIST + +#define LNEMPTY LIST +#define LIST(a) ClearWord(&a); +#define LCASE(a) LIST(a); LIST(a ## Case); +#define KEY(a,def) a = def; + +static void ResetStacks(void) +{ + RESOURCE_INFO; + +} + +/* + * Resets all flags (not wordlists) to their default values. Sets + * Outputfile to stdout. + * + */ + +static void ResetSettings(void) +{ + +#define DEF(type, name, value) name = value; +OPTION_DEFAULTS +#undef DEF + + if(OutputFile != stdout) + { + fclose(OutputFile); + OutputFile = stdout; + } +} + +/* + * Reads a numerical argument from the argument. Supports concatenation + * of arguments (main purpose) + */ + +static int ParseNumArg(LONG *Dest, /* Where to put the value */ + LONG Default, /* Value to put in if no in argue */ + STRPTR *Argument) /* optarg or similar */ +{ + if(Argument && *Argument && isdigit(**Argument)) + *Dest = strtol(*Argument, Argument, 10); + else + *Dest = Default; + + return(ShiftArg(Argument)); +} + +/* + * Same as above; however, will toggle the boolean if user doesn't + * supply value + */ + +static int ParseBoolArg(BOOL *Dest, /* Boolean value */ + STRPTR *Argument) /* optarg or similar */ +{ + LONG D = *Dest? 1L : 0L; + int Retval; + + Retval = ParseNumArg(&D, *Dest? 0L : 1L, Argument); + + *Dest = D ? TRUE : FALSE; + + return(Retval); +} + +/* + * Returns the first character in the string passed, updates the + * string pointer, if the string is non-empty. + * + * 0 if the string is empty. + */ + +static int ShiftArg(STRPTR *Argument) /* optarg or similar */ +{ + if(Argument && *Argument && **Argument) + return(*((STRPTR) (*Argument)++)); + else + return 0; +} + +/* + * Parses an argv similar array. + */ + +static int ParseArgs(int argc, char **argv) +{ + /* Needed for option parsing. */ + +static const + struct option long_options[] = + { + {"help", no_argument, 0L, 'h'}, + {"localrc", required_argument, 0L, 'l'}, + {"output", required_argument, 0L, 'o'}, + {"warnon", required_argument, 0L, 'w'}, + {"erroron", required_argument, 0L, 'e'}, + {"msgon", required_argument, 0L, 'm'}, + {"nowarn", required_argument, 0L, 'n'}, + {"verbosity", optional_argument, 0L, 'v'}, + {"pipeverb", optional_argument, 0L, 'V'}, + {"debug", required_argument, 0L, 'd'}, + {"reset", no_argument, 0L, 'r'}, + {"quiet", no_argument, 0L, 'q'}, + {"license", no_argument, 0L, 'i'}, + {"splitchar", required_argument, 0L, 's'}, + {"format", required_argument, 0L, 'f'}, + {"pseudoname", required_argument, 0L, 'p'}, + + {"inputfiles", optional_argument, 0L, 'I'}, + {"backup", optional_argument, 0L, 'b'}, + {"globalrc", optional_argument, 0L, 'g'}, + {"wipeverb", optional_argument, 0L, 'x'}, + {"tictoc", optional_argument, 0L, 't'}, + {"headererr", optional_argument, 0L, 'H'}, + {"version", no_argument, 0L, 'W'}, + + {0L, 0L, 0L, 0L} + }; + + int option_index = 0L, c, i, nextc, ErrType; + + int Retval = FALSE, InUse; + BOOL Success, Foo; + LONG Err, Verb = 1, PipeVerb = 1; + + enum + { + aeNoErr = 0, + aeArg, /* missing/bad required argument */ + aeOpt, /* unknown option returned */ + aeHelp, /* just a call for help */ + aeMem /* no memory */ + } ArgErr = aeNoErr; + + optind = 0; + + while(!ArgErr && + ((c = getopt_long((int) argc, argv, + "b::d:e:f:g::hH::I::il:m:n:o:p:qrs:t::v::V::w:Wx::", + long_options, + &option_index)) != EOF)) + { + while(c) { + nextc = 0; + switch(c) + { + case 's': + ifn(Delimit = strdup(optarg)) { + PrintPrgErr(pmStrDupErr); + ArgErr = aeMem; + } + + break; + case 'p': + ifn(PseudoInName = strdup(optarg)) { + PrintPrgErr(pmStrDupErr); + ArgErr = aeMem; + } + + break; + + case 'd': +#ifdef STRIP_DEBUG + PrintPrgErr(pmNoDebugFlag); +#else + nextc = ParseNumArg(&DebugLevel, 0xffff, &optarg); +#endif + break; + case 'i': + LicenseOnly = TRUE; + + nextc = ShiftArg(&optarg); + break; + case 'q': + Quiet = TRUE; + + nextc = ShiftArg(&optarg); + break; + + LOOP(warntype, + case 'w': + ErrType = etWarn; + InUse = iuOK; + LAST(warntype); + case 'e': + ErrType = etErr; + InUse = iuOK; + LAST(warntype); + case 'm': + ErrType = etMsg; + InUse = iuOK; + LAST(warntype); + case 'n': + ErrType = etMsg; + InUse = iuNotUser; + LAST(warntype); + ) + + if(isdigit(*optarg)) + { + nextc = ParseNumArg(&Err, -1, &optarg); + if(betw(emMinFault, Err, emMaxFault)) + { + LaTeXMsgs[Err].Type = ErrType; + LaTeXMsgs[Err].InUse = InUse; + } + else + { + ArgErr = aeOpt; + PrintPrgErr(pmWarnNumErr); + } + } + else if(!strcasecmp(optarg, "all")) + { + for(i = emMinFault + 1; i < emMaxFault; i++) + { + LaTeXMsgs[i].Type = ErrType; + LaTeXMsgs[i].InUse = InUse; + } + } + else + { + ArgErr = aeOpt; + PrintPrgErr(pmWarnNumErr); + } + + break; + + case 'g': + nextc = ParseBoolArg(&GlobalRC, &optarg); + if(!GlobalRC) { + ResetStacks(); + } + break; + + case 'r': + ResetSettings(); + nextc = ShiftArg(&optarg); + break; + + case 'l': + if(optarg) + ReadRC(optarg); + break; + + case 'f': + ifn(OutputFormat = strdup(optarg)) + { + PrintPrgErr(pmStrDupErr); + ArgErr = aeMem; + } + break; + + case 'v': + nextc = ParseNumArg(&Verb, 2, &optarg); + + if(Verb < (LONG) OutFormat.Stack.Used) + OutputFormat = strdup(OutFormat.Stack.Data[Verb]); + else + { + PrintPrgErr(pmVerbLevErr); + ArgErr = aeArg; + } + break; + case 'V': + nextc = ParseNumArg(&PipeVerb, 1, &optarg); + + if(PipeVerb < (LONG) OutFormat.Stack.Used) + PipeOutputFormat = strdup(OutFormat.Stack.Data[PipeVerb]); + else + { + PrintPrgErr(pmVerbLevErr); + ArgErr = aeArg; + } + break; + + case 'o': + if(optarg) + { + if(*OutputName) + { + PrintPrgErr(pmOutTwice); + ArgErr = aeOpt; + } + else + { + ifn(OutputName = strdup(optarg)) + { + PrintPrgErr(pmStrDupErr); + ArgErr = aeMem; + } + } + } + + break; + + case 't': + nextc = ParseBoolArg(&Foo, &optarg); + break; + case 'x': + nextc = ParseBoolArg(&WipeVerb, &optarg); + break; + case 'b': + nextc = ParseBoolArg(&BackupOut, &optarg); + break; + case 'I': + nextc = ParseBoolArg(&InputFiles, &optarg); + break; + case 'H': + nextc = ParseBoolArg(&HeadErrOut, &optarg); + break; + case 'W': + printf(Banner); + exit(EXIT_SUCCESS); + case '?': + default: + fputs(Banner, stderr); + fputs(HowHelp, stderr); + exit(EXIT_FAILURE); + break; + case 'h': + ArgErr = aeHelp; + break; + } + c = nextc; + } + } + + if((argc > optind) && !strcmp(argv[optind], "?")) + ArgErr = aeHelp; + + if(ArgErr) + { + fputs(Banner, stderr); + fputs(BigBanner, stderr); + fputs(HelpText, stderr); + Success = FALSE; + } + else + Success = TRUE; + + if(Success) + Retval = optind; + + return(Retval); +} + +/* + * Outputs a program error. + */ + + +void PrintPrgErr(enum PrgErrNum Error, ...) +{ + STRPTR Type; + va_list MsgArgs; + + if(betw(pmMinFault, Error, pmMaxFault)) { + switch(PrgMsgs[Error].Type) { + case etWarn: + Type = "WARNING"; + break; + case etMsg: + Type = "NOTE"; + break; + default: + case etErr: + Type = "ERROR"; + break; + } + fprintf(stderr, "%s: %s -- ", PrgName, Type); + + va_start(MsgArgs, Error); + vfprintf(stderr, PrgMsgs[Error].Message, MsgArgs); + va_end(MsgArgs); + fputc('\n', stderr); + + if(PrgMsgs[Error].Type == etErr) + exit(EXIT_FAILURE); + } +} + +void ErrPrintf(const char *fmt, ...) +{ + va_list MsgArgs; + + va_start(MsgArgs, fmt); + vfprintf(stderr, fmt, MsgArgs); + va_end(MsgArgs); +} + + + diff --git a/Build/source/texk/chktex/chktex.el b/Build/source/texk/chktex/chktex.el new file mode 100644 index 00000000000..2e50877d8e4 --- /dev/null +++ b/Build/source/texk/chktex/chktex.el @@ -0,0 +1,77 @@ +;;; chktex.el --- quick hack to add ChkTeX capability to AUC-TeX mode +;; +;; +;; Keywords: LaTeX, AUC-TeX, ChkTeX +;; +;; ChkTeX v1.5, quick hack to add ChkTeX in LaTeX menu. +;; Copyright (C) 1995-96 Jens T. Berger Thielemann +;; +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2 of the License, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program; if not, write to the Free Software +;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +;; +;; Contact the author at: +;; Jens Berger +;; Spektrumvn. 4 +;; N-0666 Oslo +;; Norway +;; E-mail: <jensthi@ifi.uio.no> +;; +;; +;;; Commentary: +;; +;; This tiny hack will add a "ChkTeX" item to the command menu of +;; AUC-TeX, thus making the use of ChkTeX much more comfortable from +;; within AUC-TeX (`LaTeX-mode'). +;; +;; INSTALLATION +;; +;; 1. Put this file somewhere in your loading path. +;; 2. Add the line +;; (require 'chktex) +;; to your .emacs file +;; +;; It is doubtful whether byte-compiling this file gains anything. +;; +;;; Code: +;; + + + +(require 'tex-site) +(require 'easymenu) + +(setq TeX-command-list + (nconc TeX-command-list + (list (list "ChkTeX" "chktex -v3 %s" 'TeX-run-compile nil t)))) + +(add-hook 'LaTeX-mode-hook + (function (lambda () +(easy-menu-define LaTeX-mode-menu + LaTeX-mode-map + "Menu used in LaTeX mode." + (append '("Command") + '(("Command on" + [ "Master File" TeX-command-select-master + :keys "C-c C-c" :style radio + :selected (eq TeX-command-current 'TeX-command-master) ] + [ "Buffer" TeX-command-select-buffer + :keys "C-c C-b" :style radio + :selected (eq TeX-command-current 'TeX-command-buffer) ] + [ "Region" TeX-command-select-region + :keys "C-c C-r" :style radio + :selected (eq TeX-command-current 'TeX-command-region) ])) + (let ((file 'TeX-command-on-current)) + (mapcar 'TeX-command-menu-entry TeX-command-list))))))) + +(provide 'chktex)
\ No newline at end of file diff --git a/Build/source/texk/chktex/chktex.h b/Build/source/texk/chktex/chktex.h new file mode 100644 index 00000000000..7429b0b2c46 --- /dev/null +++ b/Build/source/texk/chktex/chktex.h @@ -0,0 +1,375 @@ +/* + * ChkTeX v1.5, header file for main program. + * Copyright (C) 1995-96 Jens T. Berger Thielemann + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Contact the author at: + * Jens Berger + * Spektrumvn. 4 + * N-0666 Oslo + * Norway + * E-mail: <jensthi@ifi.uio.no> + * + * + */ + +#ifndef CHKTEX_H +#define CHKTEX_H 1 + +#ifdef WIN32 +# include <win32lib.h> +# include "config.h" +#else + +#if defined(HAVE_CONFIG_H) || defined(CONFIG_H_NAME) +# ifndef CONFIG_H_NAME +# define CONFIG_H_NAME "config.h" +# endif +# ifndef HAVE_CONFIG_H +# define HAVE_CONFIG_H 1 +# endif +# include CONFIG_H_NAME +#endif + +#endif + +#include <ctype.h> +#include <math.h> +#include <stdio.h> +#ifdef HAVE_STDARG_H +# include <stdarg.h> +#else +#error Sorry, ChkTeX needs an _ANSI_ compiler w/stdarg.h installed to compile. +#endif +#ifndef HAVE_VPRINTF +#error Sorry, ChkTeX needs an _ANSI_ compiler w/vprintf() to compile. +#endif +#include <stddef.h> +#include <stdlib.h> +#include <string.h> +#ifdef HAVE_UNISTD_H +# include <unistd.h> +#endif +#ifdef HAVE_LIMITS_H +# include <limits.h> +#endif +#ifdef HAVE_STRINGS_H +# include <strings.h> +#endif +#include "chktypes.h" +#ifndef __NOPROTO +# ifndef __PROTO +# define __PROTO(a) a +# endif +#else +# ifndef __PROTO +# define __PROTO(a) () +# endif +#endif +#ifndef LONG_MAX +# define LONG_MAX (0x7fffffff) +#endif +#ifndef CHAR_BIT +# define CHAR_BIT (8) +#endif +#ifndef FINDERRS_H +# include "FindErrs.h" +#endif /* FINDERRS_H */ + +#ifndef CDECL +#define CDECL +#endif + +/* + * Define aliases for preprocessor statements + */ + +#if defined(__unix__) || defined(__unix) || defined(unix) +#undef __unix__ +#define __unix__ 1 +#elif defined(AMIGA) || defined(__AMIGA) || defined(__amigados__) +#undef AMIGA +#define AMIGA 1 +#elif defined(MSDOS) || defined(__MSDOS__) || defined(__msdos__) +#undef __MSDOS__ +#define __MSDOS__ 1 +#endif + +/* + * The next macro should contain a list of characters LaTeX (and you?) + * considers as an end-of-sentence characters, which should be + * detected when whether sentence spacing is correct. + * + */ + +#define LATEX_EOSPUNC CHAR('.') CHAR(':') CHAR('?') CHAR('!') + +/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ + +/* + * The next macro should contain general punctuation characters + * used on your system. + */ + +#define LATEX_GENPUNC LATEX_EOSPUNC CHAR(',') CHAR(';') + + +/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ + +/* + * The next macro should contain a list of characters LaTeX (and you?) + * considers as an small punctuation characters, which should not be + * preceded by a \/. + */ + +#define LATEX_SMALLPUNC CHAR('.') CHAR(',') + +/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ + +/* + * NOTE: All macros below should return FALSE (0) if the input + * character is 0. + * + * The next macro should return TRUE if LaTeX (and you?) considers + * the character `c' as a space, which should be detected when + * we're checking whether commands are terminated by spaces. + * + * Note: If you wish to change this macro, you'll have to update + * the main loop in FindErrs.c as well. + */ + +#define LATEX_SPACE(c) (c > 0 && c <= ' ') + +/* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ + + + + + + +#define betw(a,b,c) ((a < b) && (b < c)) +#define within(a,b,c) ((a <= b) && (b <= c)) +#define elif else if + +#ifndef NOT +# define NOT(a) (!(a)) +#endif +#define ifn(a) if(NOT(a)) + +#ifndef min +# define min(a,b) ((a)<=(b)?(a):(b)) +#endif + +#ifndef max +# define max(a,b) ((a)>(b)?(a):(b)) +#endif + +#ifndef abs +# define abs(a) (a>=0?a:(-a)) +#endif + +#define LOOP(name, body) {{body} _end__##name:;} +#define LAST(name) goto _end__##name + +#define NUMBRACKETS 6 + +#define NEWBUF(name,len) \ +static TEXT _ ## name [len + (WALLBYTES<<1)] = {0}; \ +const STRPTR name = &_ ## name[WALLBYTES] + +#define INTFAULTMSG "INTERNAL FAULT OCCURED! PLEASE SUBMIT A BUG REPORT!\n" + +#define INTERNFAULT INTFAULTMSG + +#define BITDEF1(a) BIT_ ## a +#define BITDEF2(a) FLG_ ## a = (1<<BIT_ ## a) + +/* + * Debugging info + */ + +#define DEBUGBITS(a) enum a { \ + BIT(DbgMsgs), /* Dump messages */ \ + BIT(DbgListInfo), /* Dump list info */ \ + BIT(DbgListCont), /* Dump list contents */ \ + BIT(DbgOtherInfo), /* Dump misc. other info */ \ + BIT(DbgRunTime) /* Dump runtime info */ \ +}; + +#undef BIT +#define BIT BITDEF1 +DEBUGBITS(Debug_BIT) +#undef BIT +#define BIT BITDEF2 +DEBUGBITS(Debug_FLG) + +#ifdef STRIP_DEBUG +# define DEBUG(a) +#else +# define DEBUG(a) if(DebugLevel & FLG_DbgRunTime) ErrPrintf a +#endif + +#define PRGMSGS \ + MSG(pmMinFault, etWarn, TRUE, 0, INTERNFAULT)\ + MSG(pmNoFileMatch, etWarn, TRUE, 0,\ + "No files matched the pattern `%s'.")\ + MSG(pmNoTeXOpen, etWarn, TRUE, 0,\ + "Unable to open the TeX file `%s'.")\ + MSG(pmRename, etMsg, TRUE, 0,\ + "Renaming `%s' as `%s'.")\ + MSG(pmRenameErr, etErr, TRUE, 0,\ + "Could not rename `%s' to `%s'.")\ + MSG(pmOutOpen, etErr, TRUE, 0,\ + "Unable to open output file.")\ + MSG(pmOutTwice, etErr, TRUE, 0,\ + "You can specify output file only once.")\ + MSG(pmStrDupErr, etErr, TRUE, 0,\ + "Unable to duplicate strings - no memory?")\ + MSG(pmWordListErr, etErr, TRUE, 0,\ + "Unable to create wordlist - no memory?")\ + MSG(pmNoStackMem, etErr, TRUE, 0,\ + "Unable to create stack - no memory?\n")\ + MSG(pmWarnNumErr, etErr, TRUE, 0,\ + "Illegal warning number used.")\ + MSG(pmVerbLevErr, etErr, TRUE, 0,\ + "Illegal verbosity level.")\ + MSG(pmNotPSDigit, etWarn, TRUE, 0,\ + "`%c' is not a %s digit - ignored!")\ + MSG(pmEscCode, etWarn, TRUE, 0,\ + "Unknown escape code `%c%c' - ignored!")\ + MSG(pmKeyWord, etErr, TRUE, 0,\ + "Unsupported control word (`%s') encountered in file `%s'.")\ + MSG(pmFaultFmt, etErr, TRUE, 0,\ + "\"%s\", line %d: Faulty format - unexpected %s found.")\ + MSG(pmRsrcOpen, etWarn, TRUE, 0,\ + "Could not open `%s', may cause unwanted behaviour.")\ + MSG(pmSlowAbbr, etMsg, FALSE, 0,\ + "The abbreviation `%s' requires slow abbreviation searching.")\ + MSG(pmEmptyToken, etWarn, TRUE, 0,\ + "Empty token isolated in `%s' - probably faulty format")\ + MSG(pmAssert, etErr, TRUE, 0,\ + "Assertion failed. Please report bug.")\ + MSG(pmNoRsrc, etWarn, TRUE, 0,\ + "Could not find global resource file.")\ + MSG(pmQuoteStyle, etWarn, TRUE, 0,\ + "Illegal quotestyle `%s'.")\ + MSG(pmWrongWipeTemp, etWarn, TRUE, 0,\ + "Wrong template for wiping arguments, \"%s\"")\ + MSG(pmSpecifyTerm, etErr, TRUE, 0,\ + "Specify a terminal type with `setenv TERM <yourtype>'.")\ + MSG(pmNoTermData, etErr, TRUE, 0,\ + "Could not access the termcap data base.")\ + MSG(pmNoTermDefd, etErr, TRUE, 0,\ + "Terminal type `%s' is not defined.")\ + MSG(pmNoRegExp, etWarn, TRUE, 0,\ + "Regular expressions not compiled in. Please recompile.")\ + MSG(pmNoCommon, etErr, TRUE, 0,\ + "`%s' can't be a member of both `%s' and `%s'.") \ + MSG(pmNoOpenDir, etWarn, TRUE, 0, \ + "Could not open the directory `%s'.") \ + MSG(pmNoDebugFlag, etWarn, TRUE, 0, \ + "This version of doesn't support the -d flag. Please recompile.") + + +#undef MSG +#define MSG(num, type, inuse, ctxt, text) num, + +enum PrgErrNum { + PRGMSGS + pmMaxFault +}; +#undef MSG + +extern struct ErrMsg PrgMsgs [pmMaxFault + 1]; + +struct ErrInfo { + STRPTR Data, LineBuf, File; + ULONG Line, Column, ErrLen; + enum + { + efNone = 0x00, + efNoItal = 0x01, + efItal = 0x02 + } Flags; +}; + +extern const STRPTR + ReadBuffer, + CmdBuffer, + TmpBuffer; + +extern const + TEXT BrOrder[NUMBRACKETS + 1]; + +extern + ULONG Brackets [NUMBRACKETS]; + + +extern FILE *OutputFile, *InputFile; + +#define OPTION_DEFAULTS \ + DEF(BOOL, GlobalRC, TRUE) \ + DEF(BOOL, WipeVerb, TRUE) \ + DEF(BOOL, BackupOut, TRUE) \ + DEF(BOOL, Quiet, FALSE) \ + DEF(BOOL, LicenseOnly, FALSE) \ + DEF(BOOL, UsingStdIn, FALSE) \ + DEF(BOOL, InputFiles, TRUE) \ + DEF(BOOL, HeadErrOut, TRUE) \ + DEF(STRPTR, OutputName, "") \ + DEF(STRPTR, PseudoInName, NULL) \ + DEF(STRPTR, OutputFormat, VerbNormal) \ + DEF(STRPTR, PipeOutputFormat, NULL) \ + DEF(STRPTR, Delimit, ":") \ + DEF(LONG, DebugLevel, 0) + +#define STATE_VARS \ + DEF(enum ItState, ItState, itOff) /* Are we doing italics? */ \ + DEF(BOOL, AtLetter, FALSE) /* Whether `@' is a letter or not. */ \ + DEF(BOOL, InHeader, TRUE) /* Whether we're in the header */ \ + DEF(BOOL, VerbMode, FALSE) /* Whether we're in complete ignore-mode */ \ + DEF(LONG, MathMode, 0) /* Whether we're in math mode or not */ \ + DEF(STRPTR, VerbStr, "") /* String we'll terminate verbmode upon */ \ + DEF(ULONG, ErrPrint, 0) /* # errors printed */ \ + DEF(ULONG, WarnPrint, 0) /* # warnings printed */ \ + DEF(ULONG, UserSupp, 0) /* # user suppressed warnings */ + +#define DEF(type, name, value) extern type name; +OPTION_DEFAULTS +STATE_VARS +#undef DEF + +extern struct Stack + CharStack, + InputStack, + EnvStack; + +enum Quote { + quLogic, + quTrad +}; + +extern enum Quote Quote; +extern BOOL StdInTTY, StdOutTTY, UsingStdIn; + +int main __PROTO((int argc, char **argv)); +void PrintPrgErr __PROTO((enum PrgErrNum , ...)); +void ErrPrintf __PROTO((const char *fmt, ...)); + +extern TEXT LTX_EosPunc[], LTX_GenPunc[], LTX_SmallPunc[]; +extern STRPTR PrgName; + +#endif /* CHKTEX_H */ diff --git a/Build/source/texk/chktex/chktexrc b/Build/source/texk/chktex/chktexrc new file mode 100644 index 00000000000..59b840412d6 --- /dev/null +++ b/Build/source/texk/chktex/chktexrc @@ -0,0 +1,670 @@ +## +## ChkTeX v1.5, example resource file for ChkTeX. +## Copyright (C) 1995-96 Jens T. Berger Thielemann +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +## +## Contact the author at: +## Jens Berger +## Spektrumvn. 4 +## N-0666 Oslo +## Norway +## E-mail: <jensthi@ifi.uio.no> +## + +##################################################################### +# +# Note: The format has changed slightly (again). The { ... } +# syntax does now mean case-sensitive comparing, while [ ... ] means +# case-insensitive comparing of the keywords. Case-insensitive +# comparing of the keywords is only supported on a few of the +# keywords (it's not meaningful in all contexts, and it slows ChkTeX +# down). Keywords supporting this are marked throughout the file. +# +# You may also reset a list by saying "KEYWORD = { ... }"; it will +# then be set equal to the contents of the list you specify. +# +# Comments begin with `#', and continues for the rest of the line. +# Blank lines plus leading and trailing spaces are of course ignored. +# +# The general format of this file is the following: +# +# KEYWORD { item item ...} [ item item ... ] /* Adds items */ +# +# KEYWORD [ item item ...] { item item ... } /* Adds items */ +# +# KEYWORD = item +# +# KEYWORD = { item item ... } /* Clears list before adding */ +# +# KEYWORD = [ item item ... ] /* Clears list before adding */ +# +# This does _not_ mean that you may alternate the forms; certain +# keywords demands a list, other a single value. You thus have to +# look at the examples of their use. +# +# Please also note that if you specify a list-keyword twice, we'll +# concatenate the lists. If you you specify a item-keyword twice, +# we'll kill the previous value. +# +# We are slightly context-sensitive when detecting tokens like "}" +# and "]"; they have to be preceded by a space. This generally makes +# life easier. +# +# Items are separated by spaces. Newlines are considered as spaces, +# but can't be escaped. You may surround items with quotes (`"') to +# easily put spaces into them. +# +# Escape sequences available: +# +# Sequence Resulting character +# ! A space (type `! ', not just a exclamation mark) +# !" " +# !# # +# !! ! +# !{ { +# !} } +# ![ [ +# !] ] +# != = +# !b Backspace +# !n New line +# !r Carriage return +# !t Tab +# !f Form feed +# !xNN NN must be a hexadecimal number (00 - ff), +# _both_ characters must be included. +# !dNNN DDD must be a decimal number (000 - 255), all +# three characters must be included. Unspecified +# results if DDD > 255. +# !NNN DDD must be a octal number (000 - 377), all +# three characters must be included. Unspecified +# results if DDD > 377. +# +# Minor note: As you can see, most of these escape sequences are +# equal to those in C (with some extensions); however, we use ! +# instead of \ as escape character for obvious reasons. +# +# +# Quick summary of keywords follows. Keywords marked with a * accept +# keywords accepting case-insensitive lists. +# +# Abbrev* - A list of abbreviations not automatically catched. +# CenterDots - Commands/characters which should have \cdots in +# between. +# CmdLine - Default commandline options. These will be +# processed before the ones you give on the command +# line. +# HyphDash \ +# NumDash - No. of dashes allowed in different contexts. +# WordDash / +# IJAccent - Commands which puts an accent _over_ their +# argument. +# Italic - Commands immediately turning on italic mode. +# ItalCmd - Commands putting their argument into italic. +# Linker - Commands which should have a non-breaking space in +# front. +# LowDots - Commands/characters which should have \ldots in +# between. +# MathEnvir - Environments which turn on math mode. +# MathRoman - Mathematical operators with LaTeX replacement +# defined. +# NoCharNext - Insists on that certain commands aren't followed by +# certain characters. +# NonItalic - Commands immediately turning off italic mode. +# NotPreSpaced- Commands which should not have a space in front of +# them. +# Primitives - Primitive TeX commands. +# PostLink - Commands which generates a page reference. +# OutFormat - Formats to use for output. See the -f & -v switch +# in the main doc. +# QuoteStyle - Either "Traditional" or "Logical". See main doc, +# warning 38. +# Silent - These commands do not produce any textual output; +# and are thus allowed to have a space after them. +# TabSize - Tab size you are using. +# TeXInputs - Paths to search \input and \include files for. +# UserWarn* - These strings will be searched for throughout the +# text. +# VerbEnvir - Environments which contents should be ignored. +# VerbClear - String we will overwrite unwanted data with. +# WipeArg - Commands (with arguments) which should be ignored +# in the checking. +# + + +##################################################################### +# +# Enter which type of quote-style you are using here. Currently, we +# support the following styles: +# +# Style Example of use +# Traditional "An example," he said, "would be great." +# Logical "An example", he said, "would be great". +# + +QuoteStyle = Logical + +##################################################################### +# +# Enter here what interval you have between your tabs. Only regular +# intervals are supported. +# + +TabSize = 8 + +##################################################################### +# +# Here, you can put default commandline options; most users would for +# instance like to put -v2 here. +# + +CmdLine +{ + +} + +##################################################################### +# +# These patterns will be searched for through the text; no matter +# whether they appear as normal text, commands or whatever. +# Currently case-sensitive. +# +# I usually define a special command like this: +# +# \def\unknown{\large\bf??} +# +# which I use whenever there is some information I don't have at the +# moment of writing. Thus, it makes sense to search for it. +# +# You should be able to develop your own uses for this. +# + +UserWarn +{ + + \unknown +### +# +# Another example; one should write \chktex or Chk\TeX - never ChkTeX. +# +### + + ChkTeX +} +[ + +### +# +# You may put case-insensitive patterns here. +# +### + +] + +##################################################################### +# +# Here you can list the path of where ChkTeX should look for files it +# \inputs. The // postfix is now supported; if you append a double +# path-separator we'll recursively search that directory directories. +# MS-DOS users must append \\ instead, e.g. "C:\EMTEX\\". +# +# If you under either MS-DOS or UNIX wish to search an entire +# partition or the complete directory tree, you must use *three* +# slashes, e.g. "c:\\\" or "///". This may be considered to be a bug. +# +# By default, we'll search the current directory (not recursively, +# put "//" in the list for this); any paths specified below will be +# searched in addition to this. +# + +TeXInputs +{ + +} + +##################################################################### +# +# Here you may specify more outputformats for use with the -v option, +# it simply indexes into this list. Remember to use ! instead of \, +# though. +# +# For explanation of how % fields expand; look at ChkTeX.{dvi,ps}. +# +# We will by default select entry number _two_ in this list (we count +# from 0), and -v without any parameter selects entry number _three_. +# + +OutFormat +{ + +# -v0; silent mode +%f%b%l%b%c%b%n%b%m!n + +# -v1; normal mode +"%k %n in %f line %l: %m!n%r%s%t!n%u!n" + +# -v2; fancy mode +"%k %n in %f line %l: %m!n%r%i%s%I%t!n!n" + +# -v3; lacheck mode +"!"%f!", line %l: %m!n" + +# -v4; verbose lacheck mode +"!"%f!", line %l: %m!n%r%s%t!n%u!n" + +} + + + +##################################################################### +# +# These commands should be ignored when detecting whether a command +# is ended by a space. +# + +Silent +{ + \rm \em \bf \it \sl \sf \sc \tt \selectfont + \rmfamily \sffamily \ttfamily \mdseries \bfseries + \slshape \scshape \relax + \vskip \pagebreak \nopagebreak + + \textrm \textem \textbf \textit \textsl \textsf \textsc \texttt + + \clearpage \ddots \dotfill \flushbottom \fussy \indent \linebreak + \onecolumn \pagebreak \pushtabs \poptabs \scriptsize \sloppy + \twocolumn \vdots + \today \kill \newline \thicklines \thinlines + + \columnsep \space \item \tiny \footnotesize \small \normalsize + \normal \large \Large \LARGE \huge \Huge \printindex + + \newpage \listoffigures \listoftables \tableofcontents + \maketitle \makeindex + + \hline \hrule \vrule + + \centering + + \bigskip \medskip \smallskip + + \noindent \expandafter + + \makeatletter \makeatother + + \columnseprule + + \textwidth \textheight \hsize \vsize + + \if \fi + + \csname \endcsname + + \z@ \p@ \@warning \typeout + + \dots \ldots \input \endinput \nextline \leavevmode \cdots +- \appendix \listfiles \and \quad + \vfill \vfil \hfill \hfil \topmargin \oddsidemargin + \frenchspacing \nonfrenchspacing + \begingroup \endgroup \par + + \vrefwarning \upshape \headheight \headsep \hoffset \voffset + \cdot \qquad + \left \right +} + +##################################################################### +# +# Here, you can specify the length of various dashes. We sort the +# dash according to which type of characters that are on the left and +# right of of it. We are only conclusive if they are the same. +# +# We associate as follows: +# +# Name Type of character on each side +# HyphDash Alphabetic (foo-bar) +# NumDash Numeric (2--3) +# WordDash Space (like this --- see?) +# +# Below you specify how many dashes which are legal in each case. We +# define 0 as an magic constant which always generates an error. You +# may specify more than one legal dash-length. +# +# Let's look at an example. You use the following dash-syntax: +# +# foo-bar +# 2--3 +# like this---see? +# +# +# HYPHDASH { 1 3 } # Either a hyphen, or inter-word +# NUMDASH { 2 } # Between words +# WORDDASH { 0 } # We never use this +# + +HyphDash +{ + 1 +} + +NumDash +{ + 2 +} + +WordDash +{ + 3 +} + +##################################################################### +# +# This keyword indicates commands which argument isn't LaTeX code, +# and which thus should be ignored. +# +# After the command, you may place arguments that you wish that +# should be wiped in the process; use [] for optional arguments, {} +# for required ones and * if the command supports an alternative +# variant. These should be separated from the command with a colon. +# +# For instance, if you would like to wipe the \newcommand command, +# you would declare it as \newcommand:*[][]{} +# +# These commands may be "executed" before they're wiped, so you will +# typically also wish to list filehandling commands and similar here. +# + +WipeArg +{ + \label:{} \ref:{} \vref:{} \pageref:{} \index:{} \cite:[]{} + \input:{} \verbatiminput:[]{} \listinginput:[]{}{} + \verbatimtabinput:[]{} \include:{} \includeonly:{} + \bibitem:[]{} +} + +##################################################################### +# +# These environments contains material which will be typeset as +# mathematics by LaTeX. This turns on/off some warnings. +# +# We will automagically append a * to each keyword. +# + +MathEnvir +{ + displaymath math eqnarray array equation +} + +##################################################################### +# +# These environments contains material which contents should be +# ignored. +# +# We will automagically append a * to each keyword. +# + +VerbEnvir +{ + verbatim comment listing verbatimtab rawhtml errexam picture texdraw +} + +##################################################################### +# +# ChkTeX does automagically catch most abbreviations; the ones we +# need to list here, are those which are most likely to be followed +# by a word with an upper-case letter (that is not the beginning of a +# new sentence). +# +# The case-insensitive abbreviations are not really case-insensitive, +# it seems to be more practical to only let the first character be +# case-insensitive, while the remaining are case-sensitive. +# +# To speed up the searching process somewhat, we require that these +# end in a `.', this should not be a problem. +# +# Much of this work (both the abbreviations below, and the regexps +# necessary to catch the remaining automatically) have been provided +# by Russ Bubley, <russ@scs.leeds.ac.uk>. +# + + +Abbrev +{ +# Ordinals +1st. 2nd. 3rd. 4th. +# Titles +Mr. Mrs. Miss. Ms. Dr. Prof. St. + +# +# Days +# Mon. Tue. Wed. Thu. Fri. Sat. Sun. +# +# Months +# Jan. Feb. Mar. Apr. May. Jun. Jul. Aug. Sep. Oct. Nov. Dec. +# +# Letters +# Kt. Jr. +# +# Corporate +# Co. Ltd. +# +# Addresses +# Rd. Dr. St. Ave. Cres. Gdns. Sq. Circ. Terr. Pl. Arc. La. Clo. Ho. Est. Gn. +# +# Misc. +# oe. pbab. ps. rsvp. Tx. +} +[ +### +# +# The first letter is case-insensitive in the abbrevs in this +# list. Due to the nature of the checking algorithm used for +# this, entries consisting of only one character will be +# silently ignored. +# +## + +# Latin +# cf. "et al." etc. qed. qv. viz. +# +# Corporate +# inc. plc. +# +# Misc +# fax. pcs. qty. tel. misc. +] + +##################################################################### +# +# Commands which accent characters, meaning that \i or \j (\imath and +# \jmath in mathmode) should be used instead of `i' and `j' +# + +IJAccent +{ + \hat \check \breve \acute \grave \tilde \bar \vec \dot \ddot + + \' \` \^ \" \~ \= \. \u \v \H \t + +### +# +# The remaining accent commands (\c,\d,\b) put their accent _under_ +# the character, not above, and should thus be used with normal i's +# and j's. +# +### + +} + +##################################################################### +# +# Commands which, when the group is terminated, needs italic +# correction. +# + +Italic +{ + \it \em \sl +} + +##################################################################### +# +# Commands which makes the font non-italic. +# + +NonItalic +{ + \bf \rm \sf \tt \sc +} + +##################################################################### +# +# Commands which puts their argument into italic (and thus possibly +# needs italic correction in the end. +# + +ItalCmd +{ + \textit \textsl \emph +} + +##################################################################### +# +# These commands all have in common that a pagebreak right in front +# of them is highly undesirable; thus there should be no space in +# front of them. +# + +PostLink +{ + \index \label +} + +##################################################################### +# +# These commands should not have a space in front of them for various +# reasons. I.e. much the same as POSTLINK, but produces another +# warning. +# + +NotPreSpaced +{ + \footnote \footnotemark \/ +} + +##################################################################### +# +# The commands listed here, should be prepended with a `~', as in +# "look in table~\ref{foo}", to avoid the references being split +# across lines. +# + +Linker +{ + \ref \vref \pageref \cite +} + +##################################################################### +# +# Commands/characters which should have \cdots in between, e.g. +# $1+2+3+\cdots+n$. +# + +CenterDots +{ + = + - \cdot \div & \times \geq \leq < > +} + +##################################################################### +# +# Commands/characters which should have \ldots in between, e.g. +# $1,2,3,\ldots,n$. +# + +LowDots +{ + . , ; +} + +##################################################################### +# +# In maths mode, there are certain aliases for mathematical operators +# like sin, cos, etc. Ignore the leading backslash in the commands, +# and so forth. You should list these below. +# + +MathRoman +{ + log lg ln lim limsup liminf sin arcsin sinh cos arccos cosh tan + arctan tanh cot coth sec csc max min sup inf arg ker dim hom det + exp Pr gcd deg bmod pmod mod +} + +##################################################################### +# +# These TeX commands have become unnecessary, as there are LaTeX cmds +# that does the same. Purists should thus avoid these in their code. +# +# (These are a spell-corrected version of those lacheck uses). +# + +Primitives +{ + \above \advance \catcode \chardef \closein \closeout \copy \count + \countdef \cr \crcr \csname \delcode \dimendef \dimen \divide + \expandafter \font \hskip \vskip \openout +} + +##################################################################### +# +# Format: \command:characters +# +# We'll emit a warning if any of characters are found after the +# command. +# + +NoCharNext +{ + \left:{}$ \right:{}$ +} + +##################################################################### +# +# We're killing \verb@...@ commands and the arguments of the commands +# listed above in WIPEARG by overwriting them with a string or a +# single character. +# +# This should not contain an alphabetic character (in case the user +# writes (\foo\verb@bar@), neither should it contain be one of LaTeX' +# reserved characters (`#$%&~_^\{}'), or any parenthesis character +# ('()[]{}'). If possible, don't use a punctuation character, +# either, or any spacing character. +# +# The asterix is also unsuitable, as some commands behave in another +# way if they are postpended with an asterix. Which more or less +# leaves us with the pipe. +# +# Please note that this may also be a _string_, which will be +# repeated until the proper length is reached. +# + +VerbClear = "|" + +# +# All for now - have fun. +# +##################################################################### + diff --git a/Build/source/texk/chktex/chktypes.h b/Build/source/texk/chktex/chktypes.h new file mode 100644 index 00000000000..2ab6ec4736e --- /dev/null +++ b/Build/source/texk/chktex/chktypes.h @@ -0,0 +1,76 @@ +/* + * Clone of <exec/types.h>, which could not be included because it's + * (c) Commodore/Escom/Amiga/whatever. + * + */ + +#ifndef EXEC_TYPES_H +#define EXEC_TYPES_H + +#define GLOBAL extern /* the declaratory use of an external */ +#define IMPORT extern /* reference to an external */ +#define STATIC static /* a local static variable */ +#define REGISTER register /* a (hopefully) register variable */ + +#ifndef VOID +# define VOID void +#endif + + +typedef void* APTR; /* Address pointer */ + +#ifndef WIN32 +typedef unsigned long ULONG; +typedef long LONG; +#endif + +#ifdef AMIGA +typedef unsigned long LONGBITS; /* Longword accessed bitwise */ +#endif + +#ifndef WIN32 +typedef short WORD; +#endif +typedef unsigned short UWORD; +typedef unsigned short WORDBITS; + +typedef unsigned char UBYTE; +typedef unsigned char BYTEBITS; + +typedef unsigned short RPTR; /* relative pointer */ + + +#ifndef WIN32 +#if __STDC__ +typedef signed char BYTE; +#else +typedef char BYTE; +#endif +#endif + +#if defined(__cplusplus) || defined(AMIGA) +typedef unsigned char TEXT; +#else +typedef char TEXT; +#endif + +typedef TEXT * STRPTR; /* pointer to a string */ + +#ifndef WIN32 +typedef float FLOAT; +typedef double DOUBLE; +typedef short BOOL; /* Boolean value */ +#endif + +#ifndef TRUE +# define TRUE 1L +#endif +#ifndef FALSE +# define FALSE 0L +#endif +#ifndef NULL +# define NULL (void *) 0L +#endif + + +#endif diff --git a/Build/source/texk/chktex/chkweb b/Build/source/texk/chktex/chkweb new file mode 100644 index 00000000000..cbc0caa780d --- /dev/null +++ b/Build/source/texk/chktex/chkweb @@ -0,0 +1,56 @@ +#! /bin/sh + +# ChkWEB v1.0, runs the LaTeX parts of a CWEB file through ChkTeX. +# Copyright (C) 1996 Jens T. Berger Thielemann +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +# Contact the author at: +# Jens Berger +# Spektrumvn. 4 +# N-0666 Oslo +# Norway +# E-mail: <jensthi@ifi.uio.no> + + +params= + +for p +do + case $p in + --) break + ;; + -*) params="$params $p" + shift + ;; + *) break + ;; + esac +done + + +if test "$1" = ""; then + deweb | chktex -v3 $params +else + for file + do + if test -f $file; then + deweb $file | chktex -p $file -v3 $params + else + deweb $file.w | chktex -p $file.w -v3 $params + fi + done +fi + diff --git a/Build/source/texk/chktex/config.h.in b/Build/source/texk/chktex/config.h.in new file mode 100644 index 00000000000..fce5fcaa508 --- /dev/null +++ b/Build/source/texk/chktex/config.h.in @@ -0,0 +1,127 @@ +/* + * ChkTeX v1.5, configuration file. + * Copyright (C) 1995-96 Jens T. Berger Thielemann + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Contact the author at: + * Jens Berger + * Spektrumvn. 4 + * N-0666 Oslo + * Norway + * E-mail: <jensthi@ifi.uio.no> + * + * + */ + +/* Define to empty if the keyword does not work. */ +#undef const + +/* Define to `unsigned' if <sys/types.h> doesn't define. */ +#undef size_t + +/* Define if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define as __inline if that's what the C compiler calls it. */ +#undef inline + +/* Define if you don't have vprintf but do have _doprnt. */ +#undef HAVE_DOPRNT + +/* Define if you have the vprintf function. */ +#undef HAVE_VPRINTF + +/* Define if you have the access function. */ +#undef HAVE_ACCESS + +/* Define if you have the closedir function. */ +#undef HAVE_CLOSEDIR + +/* Define if you have the fileno function. */ +#undef HAVE_FILENO + +/* Define if you have the isatty function. */ +#undef HAVE_ISATTY + +/* Define if you have the opendir function. */ +#undef HAVE_OPENDIR + +/* Define if you have the readdir function. */ +#undef HAVE_READDIR + +/* Define if you have the stat function. */ +#undef HAVE_STAT + +/* Define if you have the strcasecmp function. */ +#undef HAVE_STRCASECMP + +/* Define if you have the strdup function. */ +#undef HAVE_STRDUP + +/* Define if you have the strlwr function. */ +#undef HAVE_STRLWR + +/* Define if you have the strtol function. */ +#undef HAVE_STRTOL + +/* Define if you have the <dirent.h> header file. */ +#undef HAVE_DIRENT_H + +/* Define if you have the <sys/ndir.h> header file. */ +#undef HAVE_SYS_NDIR_H + +/* Define if you have the <sys/dir.h> header file. */ +#undef HAVE_SYS_DIR_H + +/* Define if you have the <ndir.h> header file. */ +#undef HAVE_NDIR_H + +/* Define if you have the <limits.h> header file. */ +#undef HAVE_LIMITS_H + +/* Define if you have the <stat.h> header file. */ +#undef HAVE_STAT_H + +/* Define if you have the <strings.h> header file. */ +#undef HAVE_STRINGS_H + +/* Define if you have the <stdarg.h> header file. */ +#undef HAVE_STDARG_H + +/* Define if you have the <sys/dir.h> header file. */ +#undef HAVE_SYS_DIR_H + +/* Define if you have the <sys/stat.h> header file. */ +#undef HAVE_SYS_STAT_H + +/* Define if you have the <termcap.h> header file. */ +#undef HAVE_TERMCAP_H + +/* Define if you have the <termlib.h> header file. */ +#undef HAVE_TERMLIB_H + +/* Define if you have the <unistd.h> header file. */ +#undef HAVE_UNISTD_H + +/* Define if you have the termcap library (-ltermcap). */ +#undef HAVE_LIBTERMCAP + +/* Define if you have the termlib library (-ltermlib). */ +#undef HAVE_LIBTERMLIB + +/* Define if you don't want runtime debugging compiled in */ +#undef STRIP_DEBUG + diff --git a/Build/source/texk/chktex/configure b/Build/source/texk/chktex/configure new file mode 100755 index 00000000000..6f2bcd9c57c --- /dev/null +++ b/Build/source/texk/chktex/configure @@ -0,0 +1,2536 @@ +#! /bin/sh + +# Guess values for system-dependent variables and create Makefiles. +# Generated automatically using autoconf version 2.13 +# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + +# Defaults: +ac_help= +ac_default_prefix=/usr/local +# Any additions from configure.in: +ac_help="$ac_help + + --enable-lacheck-replace: Installs a lacheck replacement for the + AUC-TeX interface. (Default: no)." +ac_help="$ac_help + + --enable-emacs-hack: Installs a Elisp file, which makes ChkTeX + available in Emacs. Must be followed by + the path of your elisp files (e.g. + "--enable-emacs-hack=/usr/lib/emacs/"). + (Default: no)." +ac_help="$ac_help + + --enable-debug-info: Compile in miscellaneous runtime debugging + information. (Default: yes)." + +# Initialize some variables set by options. +# The variables have the same names as the options, with +# dashes changed to underlines. +build=NONE +cache_file=./config.cache +exec_prefix=NONE +host=NONE +no_create= +nonopt=NONE +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +target=NONE +verbose= +x_includes=NONE +x_libraries=NONE +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +# Initialize some other variables. +ac_config_files= +subdirs= +MFLAGS= MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} +# Maximum number of lines to put in a shell here document. +ac_max_here_lines=12 + +ac_prev= +for ac_option +do + + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + case "$ac_option" in + -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) ac_optarg= ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case "$ac_option" in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir="$ac_optarg" ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build="$ac_optarg" ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file="$ac_optarg" ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir="$ac_optarg" ;; + + -disable-* | --disable-*) + ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + eval "enable_${ac_feature}=no" ;; + + -enable-* | --enable-*) + ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "enable_${ac_feature}='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix="$ac_optarg" ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he) + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat << EOF +Usage: configure [options] [host] +Options: [defaults in brackets after descriptions] +Configuration: + --cache-file=FILE cache test results in FILE + --help print this message + --no-create do not create output files + --quiet, --silent do not print \`checking...' messages + --version print the version of autoconf that created configure +Directory and file names: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [same as prefix] + --bindir=DIR user executables in DIR [EPREFIX/bin] + --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] + --libexecdir=DIR program executables in DIR [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data in DIR + [PREFIX/share] + --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data in DIR + [PREFIX/com] + --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] + --libdir=DIR object code libraries in DIR [EPREFIX/lib] + --includedir=DIR C header files in DIR [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] + --infodir=DIR info documentation in DIR [PREFIX/info] + --mandir=DIR man documentation in DIR [PREFIX/man] + --srcdir=DIR find the sources in DIR [configure dir or ..] + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM + run sed PROGRAM on installed program names +EOF + cat << EOF +Host type: + --build=BUILD configure for building on BUILD [BUILD=HOST] + --host=HOST configure for HOST [guessed] + --target=TARGET configure for TARGET [TARGET=HOST] +Features and packages: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR +EOF + if test -n "$ac_help"; then + echo "--enable and --with options recognized:$ac_help" + fi + exit 0 ;; + + -host | --host | --hos | --ho) + ac_prev=host ;; + -host=* | --host=* | --hos=* | --ho=*) + host="$ac_optarg" ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir="$ac_optarg" ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir="$ac_optarg" ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir="$ac_optarg" ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir="$ac_optarg" ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir="$ac_optarg" ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir="$ac_optarg" ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir="$ac_optarg" ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix="$ac_optarg" ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix="$ac_optarg" ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix="$ac_optarg" ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name="$ac_optarg" ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir="$ac_optarg" ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir="$ac_optarg" ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site="$ac_optarg" ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir="$ac_optarg" ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir="$ac_optarg" ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target="$ac_optarg" ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers) + echo "configure generated by autoconf version 2.13" + exit 0 ;; + + -with-* | --with-*) + ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "with_${ac_package}='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`echo $ac_option|sed -e 's/-*without-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + eval "with_${ac_package}=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes="$ac_optarg" ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries="$ac_optarg" ;; + + -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_envvar| sed 's/[_a-zA-Z0-9]//g'`"; then + { echo "configure: error: invalid variable name: $ac_envvar" 1>&2; exit 1; } + fi + ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$ac_envvar='$ac_optarg'" + export $ac_envvar ;; + + *) + if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then + echo "configure: warning: $ac_option: invalid host type" 1>&2 + fi + if test "x$nonopt" != xNONE; then + { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } + fi + nonopt="$ac_option" + ;; + + esac +done + +if test -n "$ac_prev"; then + { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } +fi + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +# File descriptor usage: +# 0 standard input +# 1 file creation +# 2 errors and warnings +# 3 some systems may open it to /dev/tty +# 4 used on the Kubota Titan +# 6 checking for... messages and results +# 5 compiler messages saved in config.log +if test "$silent" = yes; then + exec 6>/dev/null +else + exec 6>&1 +fi +exec 5>./config.log + +echo "\ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. +" 1>&5 + +# Strip out --no-create and --no-recursion so they do not pile up. +# Also quote any args containing shell metacharacters. +ac_configure_args= +for ac_arg +do + case "$ac_arg" in + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) ;; + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) + ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) ac_configure_args="$ac_configure_args $ac_arg" ;; + esac +done + +# NLS nuisances. +# Only set these to C if already set. These must not be set unconditionally +# because not all systems understand e.g. LANG=C (notably SCO). +# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! +# Non-C LC_CTYPE values break the ctype check. +if test "${LANG+set}" = set; then LANG=C; export LANG; fi +if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi +if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo > confdefs.h + +# A filename unique to this package, relative to the directory that +# configure is in, which we can look for to find out if srcdir is correct. +ac_unique_file=ChkTeX.c + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_prog=$0 + ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` + test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } + else + { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } + fi +fi +srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` + +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + echo "loading site script $ac_site_file" + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + echo "loading cache $cache_file" + . $cache_file +else + echo "creating cache $cache_file" + > $cache_file +fi + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +ac_exeext= +ac_objext=o +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. + if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then + ac_n= ac_c=' +' ac_t=' ' + else + ac_n=-n ac_c= ac_t= + fi +else + ac_n= ac_c='\c' ac_t= +fi + + + +SCRIPTS= + +ELISPDIR= + + +# Check whether --enable-lacheck-replace or --disable-lacheck-replace was given. +if test "${enable_lacheck_replace+set}" = set; then + enableval="$enable_lacheck_replace" + : +else + enable_lacheck_replace=no +fi + + +# Check whether --enable-emacs-hack or --disable-emacs-hack was given. +if test "${enable_emacs_hack+set}" = set; then + enableval="$enable_emacs_hack" + : +else + enable_emacs_hack=no +fi + + +# Check whether --enable-debug-info or --disable-debug-info was given. +if test "${enable_debug_info+set}" = set; then + enableval="$enable_debug_info" + : +else + enable_debug_info=yes +fi + + +if test "$silent" != "yes"; then +cat <<EOF + + + ##### ### ### ######## ### ## + ### ## ## ## ## ## #0 + @@ @@ @@@ @@ @@ @@ ####### @@ @ + @@ @@@ @@ @@ @@ @@ ## # @@ + && && && &&&& && @@ & && + &&& && && && && && && @@@@ & && + %%%%% %%% %%% %%% %%% %% && %%% %%% + && & + %%%%%%% + + Welcome to the ChkTeX configuration script! + Before taking the program in use, please read the + COPYING file; it applies to this script as well + as the remaining parts of the package. In short: + + *NO WARRANTIES WHATSOEVER* + + Copyright © 1995-96 + Jens T. Berger Thielemann + <jensthi@ifi.uio.no> +EOF +sleep 1 +cat <<EOF +Supported features: + --enable-lacheck-replace: Installs a lacheck replacement for the + AUC-TeX interface. (Default: no). + --enable-debug-info: Compile in miscellaneous runtime debugging + information. (Default: yes). + --enable-emacs-hack: Installs a Elisp file, which makes ChkTeX + available in Emacs. Must be followed by + the path of your elisp files (e.g. + "--enable-emacs-hack=/usr/lib/emacs/"). + (Default: no). +EOF +sleep 1 +fi + +echo $ac_n "checking whether lacheck replacement should be installed""... $ac_c" 1>&6 +echo "configure:626: checking whether lacheck replacement should be installed" >&5 +if test "$enable_lacheck_replace" = "yes"; then + SCRIPTS="$SCRIPTS lacheck" + echo "$ac_t""yes" 1>&6 +else + SCRIPTS= + echo "$ac_t""no" 1>&6 +fi + +echo $ac_n "checking whether runtime debug info should be used""... $ac_c" 1>&6 +echo "configure:636: checking whether runtime debug info should be used" >&5 +if test "$enable_debug_info" = "yes"; then + echo "$ac_t""yes" 1>&6 +else + cat >> confdefs.h <<\EOF +#define STRIP_DEBUG 1 +EOF + + echo "$ac_t""no" 1>&6 +fi + +echo $ac_n "checking whether the emacs hack should be installed""... $ac_c" 1>&6 +echo "configure:648: checking whether the emacs hack should be installed" >&5 +case $enable_emacs_hack in + no) echo "$ac_t""no" 1>&6 + ;; + /*|*/*) ELISPDIR=$enable_emacs_hack + echo "$ac_t""yes" 1>&6 + ;; + *) echo; + { echo "configure: error: --enable-emacs-hack needs the *full path* of Elisp files" 1>&2; exit 1; } + ;; +esac + +# Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:663: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + if test -z "$COMSPEC"; then ac_x=-f; else ac_x=-x; fi + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test $ac_x $ac_dir/$ac_word; then + ac_cv_prog_CC="gcc" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:694: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_prog_rejected=no + if test -z "$COMSPEC"; then ac_x=-f; else ac_x=-x; fi + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test $ac_x $ac_dir/$ac_word; then + if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + break + fi + done + IFS="$ac_save_ifs" +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# -gt 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + set dummy "$ac_dir/$ac_word" "$@" + shift + ac_cv_prog_CC="$@" + fi +fi +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + if test -z "$CC"; then + case "`uname -s`" in + *win32* | *WIN32*) + # Extract the first word of "cl", so it can be a program name with args. +set dummy cl; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:746: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + if test -z "$COMSPEC"; then ac_x=-f; else ac_x=-x; fi + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test $ac_x $ac_dir/$ac_word; then + ac_cv_prog_CC="cl" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + ;; + esac + fi + test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } +fi + +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 +echo "configure:779: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +cat > conftest.$ac_ext << EOF + +#line 790 "configure" +#include "confdefs.h" + +main(){return(0);} +EOF +if { (eval echo configure:795: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + ac_cv_prog_cc_works=yes + # If we can't run a trivial program, we are probably using a cross compiler. + if (./conftest; exit) 2>/dev/null; then + ac_cv_prog_cc_cross=no + else + ac_cv_prog_cc_cross=yes + fi +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_prog_cc_works=no +fi +rm -fr conftest* +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 +if test $ac_cv_prog_cc_works = no; then + { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } +fi +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 +echo "configure:821: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 +cross_compiling=$ac_cv_prog_cc_cross + +echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 +echo "configure:826: checking whether we are using GNU C" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.c <<EOF +#ifdef __GNUC__ + yes; +#endif +EOF +if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:835: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + ac_cv_prog_gcc=yes +else + ac_cv_prog_gcc=no +fi +fi + +echo "$ac_t""$ac_cv_prog_gcc" 1>&6 + +if test $ac_cv_prog_gcc = yes; then + GCC=yes +else + GCC= +fi + +ac_test_CFLAGS="${CFLAGS+set}" +ac_save_CFLAGS="$CFLAGS" +CFLAGS= +echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 +echo "configure:854: checking whether ${CC-cc} accepts -g" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + echo 'void f(){}' > conftest.c +if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then + ac_cv_prog_cc_g=yes +else + ac_cv_prog_cc_g=no +fi +rm -f conftest* + +fi + +echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS="$ac_save_CFLAGS" +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi + +ac_aux_dir= +for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/install-sh; then + case $ac_dir in + /*|[A-z]:/*) ac_aux_dir=$ac_dir;; + *) ac_aux_dir=`pwd`/$ac_dir;; + esac + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + case $ac_dir in + /*|[A-z]:/*) ac_aux_dir=$ac_dir;; + *) ac_aux_dir=`pwd`/$ac_dir;; + esac + ac_install_sh="$ac_aux_dir/install.sh -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } +fi +ac_config_guess=$ac_aux_dir/config.guess +ac_config_sub=$ac_aux_dir/config.sub +ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# ./install, which can be erroneously created by make from ./install.sh. +echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 +echo "configure:922: checking for a BSD compatible install" >&5 +if test -z "$INSTALL"; then +if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" + # Hack for MSDOS and descendants. + if test -z "$COMSPEC"; then ac_x=-f; else ac_x=-x; fi + for ac_dir in $PATH; do + # Account for people who put trailing slashes in PATH elements. + case "$ac_dir/" in + /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + if test $ac_x $ac_dir/$ac_prog; then + if test $ac_prog = install && + grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + else + ac_cv_path_install="$ac_dir/$ac_prog -c" + break 2 + fi + fi + done + ;; + esac + done + IFS="$ac_save_IFS" + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL="$ac_cv_path_install" + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL="$ac_install_sh" + fi +fi +echo "$ac_t""$INSTALL" 1>&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6 +echo "configure:977: checking whether ln -s works" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + rm -f conftestdata +# MS-DOS is a special case, because it sort of pretends that ln -s +# works for executables. +if test -z "$COMSPEC" && ln -s X conftestdata 2>/dev/null +then + rm -f conftestdata + ac_cv_prog_LN_S="ln -s" +else + ac_cv_prog_LN_S=ln +fi +fi +LN_S="$ac_cv_prog_LN_S" +if test "$ac_cv_prog_LN_S" = "ln -s"; then + echo "$ac_t""yes" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +for ac_prog in perl5 perl +do +# Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1004: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_PERL5'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$PERL5" in + /*|[A-z]:/*) + ac_cv_path_PERL5="$PERL5" # Let the user override the test with a path. + ;; + ?:/*) + ac_cv_path_PERL5="$PERL5" # Let the user override the test with a dos path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + if test -z "$COMSPEC"; then ac_x=-f; else ac_x=-x; fi + ac_dummy="$PATH:/usr/bin:/usr/local/bin" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test $ac_x $ac_dir/$ac_word; then + ac_cv_path_PERL5="$ac_dir/$ac_word" + break + fi + done + IFS="$ac_save_ifs" + ;; +esac +fi +PERL5="$ac_cv_path_PERL5" +if test -n "$PERL5"; then + echo "$ac_t""$PERL5" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +test -n "$PERL5" && break +done +test -n "$PERL5" || PERL5="no" + +if test "$PERL5" != no; then + echo $ac_n "checking whether perl is v5 or higher""... $ac_c" 1>&6 +echo "configure:1043: checking whether perl is v5 or higher" >&5 + if $PERL5 -e 'exit($] >= 5)'; then + PERL5=no + echo "$ac_t""no" 1>&6 + else + echo "$ac_t""yes" 1>&6 + fi +fi + +if test "$PERL5" != no; then + # Pull the hash mark out of the macro call to avoid m4 problems. +ac_msg="whether #! works in shell scripts" +echo $ac_n "checking $ac_msg""... $ac_c" 1>&6 +echo "configure:1056: checking $ac_msg" >&5 +if eval "test \"`echo '$''{'ac_cv_sys_interpreter'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + echo '#! /bin/cat +exit 69 +' > conftest +chmod u+x conftest +(SHELL=/bin/sh; export SHELL; ./conftest >/dev/null) +if test $? -ne 69; then + ac_cv_sys_interpreter=yes +else + ac_cv_sys_interpreter=no +fi +rm -f conftest +fi + +echo "$ac_t""$ac_cv_sys_interpreter" 1>&6 +interpval="$ac_cv_sys_interpreter" + + if test "$ac_cv_sys_interpreter" = "yes"; then + SCRIPTS="$SCRIPTS chkweb deweb" + else + echo "configure: warning: deweb will not be installed since your system does" 1>&2 + echo "configure: warning: not support the pound-bang notation." 1>&2 + fi +else + echo "configure: warning: deweb will not be installed since you do not have perl5." 1>&2 +fi + +for ac_prog in 'groff -man -P-bu -Tlatin1' 'nroff -man' +do +# Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1091: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_GROFF'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$GROFF"; then + ac_cv_prog_GROFF="$GROFF" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + if test -z "$COMSPEC"; then ac_x=-f; else ac_x=-x; fi + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test $ac_x $ac_dir/$ac_word; then + ac_cv_prog_GROFF="$ac_prog" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +GROFF="$ac_cv_prog_GROFF" +if test -n "$GROFF"; then + echo "$ac_t""$GROFF" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +test -n "$GROFF" && break +done +test -n "$GROFF" || GROFF="'nroff -man'" + + +# Extract the first word of "latex", so it can be a program name with args. +set dummy latex; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1126: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_LATEX'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$LATEX" in + /*|[A-z]:/*) + ac_cv_path_LATEX="$LATEX" # Let the user override the test with a path. + ;; + ?:/*) + ac_cv_path_LATEX="$LATEX" # Let the user override the test with a dos path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + if test -z "$COMSPEC"; then ac_x=-f; else ac_x=-x; fi + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test $ac_x $ac_dir/$ac_word; then + ac_cv_path_LATEX="$ac_dir/$ac_word" + break + fi + done + IFS="$ac_save_ifs" + ;; +esac +fi +LATEX="$ac_cv_path_LATEX" +if test -n "$LATEX"; then + echo "$ac_t""$LATEX" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +# Extract the first word of "dvips", so it can be a program name with args. +set dummy dvips; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1162: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_DVIPS'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$DVIPS" in + /*|[A-z]:/*) + ac_cv_path_DVIPS="$DVIPS" # Let the user override the test with a path. + ;; + ?:/*) + ac_cv_path_DVIPS="$DVIPS" # Let the user override the test with a dos path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + if test -z "$COMSPEC"; then ac_x=-f; else ac_x=-x; fi + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test $ac_x $ac_dir/$ac_word; then + ac_cv_path_DVIPS="$ac_dir/$ac_word" + break + fi + done + IFS="$ac_save_ifs" + ;; +esac +fi +DVIPS="$ac_cv_path_DVIPS" +if test -n "$DVIPS"; then + echo "$ac_t""$DVIPS" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + +# Extract the first word of "lynx", so it can be a program name with args. +set dummy lynx; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1199: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_LYNX'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$LYNX" in + /*|[A-z]:/*) + ac_cv_path_LYNX="$LYNX" # Let the user override the test with a path. + ;; + ?:/*) + ac_cv_path_LYNX="$LYNX" # Let the user override the test with a dos path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + if test -z "$COMSPEC"; then ac_x=-f; else ac_x=-x; fi + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test $ac_x $ac_dir/$ac_word; then + ac_cv_path_LYNX="$ac_dir/$ac_word" + break + fi + done + IFS="$ac_save_ifs" + ;; +esac +fi +LYNX="$ac_cv_path_LYNX" +if test -n "$LYNX"; then + echo "$ac_t""$LYNX" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +# Extract the first word of "latex2html", so it can be a program name with args. +set dummy latex2html; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:1235: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_path_LATEX2HTML'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + case "$LATEX2HTML" in + /*|[A-z]:/*) + ac_cv_path_LATEX2HTML="$LATEX2HTML" # Let the user override the test with a path. + ;; + ?:/*) + ac_cv_path_LATEX2HTML="$LATEX2HTML" # Let the user override the test with a dos path. + ;; + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + if test -z "$COMSPEC"; then ac_x=-f; else ac_x=-x; fi + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test $ac_x $ac_dir/$ac_word; then + ac_cv_path_LATEX2HTML="$ac_dir/$ac_word" + break + fi + done + IFS="$ac_save_ifs" + ;; +esac +fi +LATEX2HTML="$ac_cv_path_LATEX2HTML" +if test -n "$LATEX2HTML"; then + echo "$ac_t""$LATEX2HTML" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + +echo $ac_n "checking for tgetent in -ltermlib""... $ac_c" 1>&6 +echo "configure:1270: checking for tgetent in -ltermlib" >&5 +ac_lib_var=`echo termlib'_'tgetent | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ltermlib $LIBS" +cat > conftest.$ac_ext <<EOF +#line 1278 "configure" +#include "confdefs.h" +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char tgetent(); + +int main() { +tgetent() +; return 0; } +EOF +if { (eval echo configure:1289: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_lib=HAVE_LIB`echo termlib | sed -e 's/[^a-zA-Z0-9_]/_/g' \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` + cat >> confdefs.h <<EOF +#define $ac_tr_lib 1 +EOF + + LIBS="-ltermlib $LIBS" + +else + echo "$ac_t""no" 1>&6 +fi + +echo $ac_n "checking for tgetent in -ltermcap""... $ac_c" 1>&6 +echo "configure:1317: checking for tgetent in -ltermcap" >&5 +ac_lib_var=`echo termcap'_'tgetent | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ltermcap $LIBS" +cat > conftest.$ac_ext <<EOF +#line 1325 "configure" +#include "confdefs.h" +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char tgetent(); + +int main() { +tgetent() +; return 0; } +EOF +if { (eval echo configure:1336: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_lib=HAVE_LIB`echo termcap | sed -e 's/[^a-zA-Z0-9_]/_/g' \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` + cat >> confdefs.h <<EOF +#define $ac_tr_lib 1 +EOF + + LIBS="-ltermcap $LIBS" + +else + echo "$ac_t""no" 1>&6 +fi + + +echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 +echo "configure:1365: checking how to run the C preprocessor" >&5 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then +if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + # This must be in double quotes, not single quotes, because CPP may get + # substituted into the Makefile and "${CC-cc}" will confuse make. + CPP="${CC-cc} -E" + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. + cat > conftest.$ac_ext <<EOF +#line 1380 "configure" +#include "confdefs.h" +#include <assert.h> +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1386: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -E -traditional-cpp" + cat > conftest.$ac_ext <<EOF +#line 1397 "configure" +#include "confdefs.h" +#include <assert.h> +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1403: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -nologo -E" + cat > conftest.$ac_ext <<EOF +#line 1414 "configure" +#include "confdefs.h" +#include <assert.h> +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1420: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP=/lib/cpp +fi +rm -f conftest* +fi +rm -f conftest* +fi +rm -f conftest* + ac_cv_prog_CPP="$CPP" +fi + CPP="$ac_cv_prog_CPP" +else + ac_cv_prog_CPP="$CPP" +fi +echo "$ac_t""$CPP" 1>&6 + +echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 +echo "configure:1445: checking for ANSI C header files" >&5 +if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 1450 "configure" +#include "confdefs.h" +#include <stdlib.h> +#include <stdarg.h> +#include <string.h> +#include <float.h> +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1458: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + ac_cv_header_stdc=yes +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. +cat > conftest.$ac_ext <<EOF +#line 1475 "configure" +#include "confdefs.h" +#include <string.h> +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "memchr" >/dev/null 2>&1; then + : +else + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. +cat > conftest.$ac_ext <<EOF +#line 1493 "configure" +#include "confdefs.h" +#include <stdlib.h> +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "free" >/dev/null 2>&1; then + : +else + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. +if test "$cross_compiling" = yes; then + : +else + cat > conftest.$ac_ext <<EOF +#line 1514 "configure" +#include "confdefs.h" +#include <ctype.h> +#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int main () { int i; for (i = 0; i < 256; i++) +if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); +exit (0); } + +EOF +if { (eval echo configure:1525: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + : +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_header_stdc=no +fi +rm -fr conftest* +fi + +fi +fi + +echo "$ac_t""$ac_cv_header_stdc" 1>&6 +if test $ac_cv_header_stdc = yes; then + cat >> confdefs.h <<\EOF +#define STDC_HEADERS 1 +EOF + +fi + +ac_header_dirent=no +for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h +do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6 +echo "configure:1553: checking for $ac_hdr that defines DIR" >&5 +if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 1558 "configure" +#include "confdefs.h" +#include <sys/types.h> +#include <$ac_hdr> +int main() { +DIR *dirp = 0; +; return 0; } +EOF +if { (eval echo configure:1566: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + eval "ac_cv_header_dirent_$ac_safe=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_dirent_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_dirent_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + cat >> confdefs.h <<EOF +#define $ac_tr_hdr 1 +EOF + ac_header_dirent=$ac_hdr; break +else + echo "$ac_t""no" 1>&6 +fi +done +# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. +if test $ac_header_dirent = dirent.h; then +echo $ac_n "checking for opendir in -ldir""... $ac_c" 1>&6 +echo "configure:1591: checking for opendir in -ldir" >&5 +ac_lib_var=`echo dir'_'opendir | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ldir $LIBS" +cat > conftest.$ac_ext <<EOF +#line 1599 "configure" +#include "confdefs.h" +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char opendir(); + +int main() { +opendir() +; return 0; } +EOF +if { (eval echo configure:1610: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + LIBS="$LIBS -ldir" +else + echo "$ac_t""no" 1>&6 +fi + +else +echo $ac_n "checking for opendir in -lx""... $ac_c" 1>&6 +echo "configure:1632: checking for opendir in -lx" >&5 +ac_lib_var=`echo x'_'opendir | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lx $LIBS" +cat > conftest.$ac_ext <<EOF +#line 1640 "configure" +#include "confdefs.h" +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char opendir(); + +int main() { +opendir() +; return 0; } +EOF +if { (eval echo configure:1651: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + LIBS="$LIBS -lx" +else + echo "$ac_t""no" 1>&6 +fi + +fi + + + +for ac_hdr in limits.h stat.h strings.h stdarg.h sys/stat.h termcap.h termlib.h unistd.h +do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 +echo "configure:1679: checking for $ac_hdr" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 1684 "configure" +#include "confdefs.h" +#include <$ac_hdr> +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1689: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + cat >> confdefs.h <<EOF +#define $ac_tr_hdr 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi +done + + +echo $ac_n "checking for working const""... $ac_c" 1>&6 +echo "configure:1717: checking for working const" >&5 +if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 1722 "configure" +#include "confdefs.h" + +int main() { + +/* Ultrix mips cc rejects this. */ +typedef int charset[2]; const charset x; +/* SunOS 4.1.1 cc rejects this. */ +char const *const *ccp; +char **p; +/* NEC SVR4.0.2 mips cc rejects this. */ +struct point {int x, y;}; +static struct point const zero = {0,0}; +/* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in an arm + of an if-expression whose if-part is not a constant expression */ +const char *g = "string"; +ccp = &g + (g ? g-g : 0); +/* HPUX 7.0 cc rejects these. */ +++ccp; +p = (char**) ccp; +ccp = (char const *const *) p; +{ /* SCO 3.2v4 cc rejects this. */ + char *t; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; +} +{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; +} +{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; +} +{ /* AIX XL C 1.02.0.0 rejects this saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; +} +{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; +} + +; return 0; } +EOF +if { (eval echo configure:1771: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_c_const=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_c_const=no +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_c_const" 1>&6 +if test $ac_cv_c_const = no; then + cat >> confdefs.h <<\EOF +#define const +EOF + +fi + +echo $ac_n "checking for inline""... $ac_c" 1>&6 +echo "configure:1792: checking for inline" >&5 +if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat > conftest.$ac_ext <<EOF +#line 1799 "configure" +#include "confdefs.h" + +int main() { +} $ac_kw foo() { +; return 0; } +EOF +if { (eval echo configure:1806: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_c_inline=$ac_kw; break +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 +fi +rm -f conftest* +done + +fi + +echo "$ac_t""$ac_cv_c_inline" 1>&6 +case "$ac_cv_c_inline" in + inline | yes) ;; + no) cat >> confdefs.h <<\EOF +#define inline +EOF + ;; + *) cat >> confdefs.h <<EOF +#define inline $ac_cv_c_inline +EOF + ;; +esac + +echo $ac_n "checking for size_t""... $ac_c" 1>&6 +echo "configure:1832: checking for size_t" >&5 +if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 1837 "configure" +#include "confdefs.h" +#include <sys/types.h> +#if STDC_HEADERS +#include <stdlib.h> +#include <stddef.h> +#endif +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then + rm -rf conftest* + ac_cv_type_size_t=yes +else + rm -rf conftest* + ac_cv_type_size_t=no +fi +rm -f conftest* + +fi +echo "$ac_t""$ac_cv_type_size_t" 1>&6 +if test $ac_cv_type_size_t = no; then + cat >> confdefs.h <<\EOF +#define size_t unsigned +EOF + +fi + + +echo $ac_n "checking for vprintf""... $ac_c" 1>&6 +echo "configure:1866: checking for vprintf" >&5 +if eval "test \"`echo '$''{'ac_cv_func_vprintf'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 1871 "configure" +#include "confdefs.h" +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char vprintf(); below. */ +#include <assert.h> +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char vprintf(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_vprintf) || defined (__stub___vprintf) +choke me +#else +vprintf(); +#endif + +; return 0; } +EOF +if { (eval echo configure:1894: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_vprintf=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_vprintf=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'vprintf`\" = yes"; then + echo "$ac_t""yes" 1>&6 + cat >> confdefs.h <<\EOF +#define HAVE_VPRINTF 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi + +if test "$ac_cv_func_vprintf" != yes; then +echo $ac_n "checking for _doprnt""... $ac_c" 1>&6 +echo "configure:1918: checking for _doprnt" >&5 +if eval "test \"`echo '$''{'ac_cv_func__doprnt'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 1923 "configure" +#include "confdefs.h" +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char _doprnt(); below. */ +#include <assert.h> +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char _doprnt(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub__doprnt) || defined (__stub____doprnt) +choke me +#else +_doprnt(); +#endif + +; return 0; } +EOF +if { (eval echo configure:1946: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func__doprnt=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func__doprnt=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'_doprnt`\" = yes"; then + echo "$ac_t""yes" 1>&6 + cat >> confdefs.h <<\EOF +#define HAVE_DOPRNT 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi + +fi + +for ac_func in access closedir fileno isatty opendir readdir stat strcasecmp strdup strlwr strtol +do +echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +echo "configure:1973: checking for $ac_func" >&5 +if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 1978 "configure" +#include "confdefs.h" +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func(); below. */ +#include <assert.h> +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +$ac_func(); +#endif + +; return 0; } +EOF +if { (eval echo configure:2001: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_$ac_func=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` + cat >> confdefs.h <<EOF +#define $ac_tr_func 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi +done + + +trap '' 1 2 15 +cat > confcache <<\EOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +(set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote substitution + # turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Any assignment to VPATH causes Sun make to only execute +# the first set of double-colon rules, so remove it if not needed. +# If there is a colon in the path, we need to keep it. +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' +fi + +trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 + +DEFS=-DHAVE_CONFIG_H + +# Without the "./", some shells look in PATH for config.status. +: ${CONFIG_STATUS=./config.status} + +echo creating $CONFIG_STATUS +rm -f $CONFIG_STATUS +cat > $CONFIG_STATUS <<EOF +#! /bin/sh +# Generated automatically by configure. +# Run this file to recreate the current configuration. +# This directory was configured as follows, +# on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# +# $0 $ac_configure_args +# +# Compiler output produced by configure, useful for debugging +# configure, is in ./config.log if it exists. + +ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" +for ac_option +do + case "\$ac_option" in + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" + exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; + -version | --version | --versio | --versi | --vers | --ver | --ve | --v) + echo "$CONFIG_STATUS generated by autoconf version 2.13" + exit 0 ;; + -help | --help | --hel | --he | --h) + echo "\$ac_cs_usage"; exit 0 ;; + *) echo "\$ac_cs_usage"; exit 1 ;; + esac +done + +ac_given_srcdir=$srcdir +ac_given_INSTALL="$INSTALL" + +ac_config_files="$ac_config_files Makefile deweb MakeHTML" + +trap 'rm -fr `echo "$ac_config_files config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 +EOF +cat >> $CONFIG_STATUS <<EOF + +# Protect against being on the right side of a sed subst in config.status. +sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g; + s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF +$ac_vpsub +$extrasub +s%@SHELL@%$SHELL%g +s%@CFLAGS@%$CFLAGS%g +s%@CPPFLAGS@%$CPPFLAGS%g +s%@CXXFLAGS@%$CXXFLAGS%g +s%@FFLAGS@%$FFLAGS%g +s%@DEFS@%$DEFS%g +s%@LDFLAGS@%$LDFLAGS%g +s%@LIBS@%$LIBS%g +s%@exec_prefix@%$exec_prefix%g +s%@prefix@%$prefix%g +s%@program_transform_name@%$program_transform_name%g +s%@bindir@%$bindir%g +s%@sbindir@%$sbindir%g +s%@libexecdir@%$libexecdir%g +s%@datadir@%$datadir%g +s%@sysconfdir@%$sysconfdir%g +s%@sharedstatedir@%$sharedstatedir%g +s%@localstatedir@%$localstatedir%g +s%@libdir@%$libdir%g +s%@includedir@%$includedir%g +s%@oldincludedir@%$oldincludedir%g +s%@infodir@%$infodir%g +s%@mandir@%$mandir%g +s%@SCRIPTS@%$SCRIPTS%g +s%@ELISPDIR@%$ELISPDIR%g +s%@CC@%$CC%g +s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g +s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g +s%@INSTALL_DATA@%$INSTALL_DATA%g +s%@LN_S@%$LN_S%g +s%@PERL5@%$PERL5%g +s%@GROFF@%$GROFF%g +s%@LATEX@%$LATEX%g +s%@DVIPS@%$DVIPS%g +s%@LYNX@%$LYNX%g +s%@LATEX2HTML@%$LATEX2HTML%g +s%@CPP@%$CPP%g + +CEOF +EOF + +cat >> $CONFIG_STATUS <<\EOF + +# Split the substitutions into bite-sized pieces for seds with +# small command number limits, like on Digital OSF/1 and HP-UX. +ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. +ac_file=1 # Number of current file. +ac_beg=1 # First line for current file. +ac_end=$ac_max_sed_cmds # Line after last line for current file. +ac_more_lines=: +ac_sed_cmds="" +while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file + else + sed "${ac_end}q" conftest.subs > conftest.s$ac_file + fi + if test ! -s conftest.s$ac_file; then + ac_more_lines=false + rm -f conftest.s$ac_file + else + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f conftest.s$ac_file" + else + ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" + fi + ac_file=`expr $ac_file + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_cmds` + fi +done +if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat +fi +EOF + +cat >> $CONFIG_STATUS <<EOF + +CONFIG_FILES=\${CONFIG_FILES-"$ac_config_files"} +EOF +cat >> $CONFIG_STATUS <<\EOF +for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. + + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` + else + ac_dir_suffix= ac_dots= + fi + + case "$ac_given_srcdir" in + .) srcdir=. + if test -z "$ac_dots"; then top_srcdir=. + else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; + /*|[A-z]:/*) # Absolute path. + srcdir="$ac_given_srcdir$ac_dir_suffix" + top_srcdir="$ac_given_srcdir" ;; + *) # Relative path. + srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" + top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + case "$ac_given_INSTALL" in + "") ;; + [/$]*|[A-z]:/*) INSTALL="$ac_given_INSTALL" ;; + *) INSTALL="$ac_dots$ac_given_INSTALL" ;; + esac + + echo creating "$ac_file" + rm -f "$ac_file" + configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." + case "$ac_file" in + *Makefile*) ac_comsub="1i\\ +# $configure_input" ;; + *) ac_comsub= ;; + esac + + rm -f conftest.in + ac_file_inputs=`echo $ac_file_in|sed -e "s%:% $ac_given_srcdir/%g" -e "s%^%$ac_given_srcdir/%"` + cat $ac_file_inputs > conftest.in + # + # Replace lines of the form ac_include foo with the contents of foo: + # first, from the ac_include lines construct a list of file names. + # From that list, we construct a second list of those files that exist. + # Then we construct lists of sed commands for including those files, + # and a sed command that removes the ac_include lines. We don't attempt + # to read non-existent files because some (buggy) versions of sed choke + # on this. Have to use sed because old (Ultrix, SunOS) awk does not support + # getline or system. (Anyway, configure scripts aren't supposed to use awk.) + # Can't use only one -e and commands {dr foo} because foo has to be last. + # Be careful, because the filename may contain /. Be careful with + # whitespace; we need to use echo. + # + file_substs=`sed -n '/^ac_include/s%ac_include[ ]*\(.*\)%\1%p' conftest.in` + # Create the sed command line ... + if test -n "$file_substs"; then + echo "configure: warning: ac_include is obsolete; instead use kpse_include" 1>&2 + file_subst_cmd="sed -e 's/^ac_include/kpse_include/'" + else + file_subst_cmd='sed' + fi + kpse_substs=`sed -n '/^kpse_include/s%kpse_include[ ]*\(.*\)%\1%p' conftest.in` + for ac_inc in $file_substs $kpse_substs; do + if test -f "$ac_given_srcdir/$ac_inc"; then + ac_mung=`echo $ac_inc | sed 's,/,%,g'` + file_subst_cmd="$file_subst_cmd -e '/^kpse_include $ac_mung$/r $ac_given_srcdir/$ac_inc'" + fi + done + file_subst_cmd="$file_subst_cmd -e '/^kpse_include/d'" + # ... and fix the whitespace and escaped slashes. + file_subst_cmd=`echo "$file_subst_cmd" | sed -e 's,%,\\\/,g' \ +-e 's/kpse_include /kpse_include[ ]*/g'` + # I can't find any way to do variable substitution in the sed commands + # (so the user could have, e.g., $top_srcdir in their ac_include line). + (eval $file_subst_cmd conftest.in) \ + | sed -e "$ac_comsub +s%@configure_input@%$configure_input%g +s%@srcdir@%$srcdir%g +s%@top_srcdir@%$top_srcdir%g +s%@INSTALL@%$INSTALL%g +" | (eval "$ac_sed_cmds") > $ac_file +fi; done +rm -f conftest.s* conftest.in + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='\([ ][ ]*\)[^ ].*$%\1#\2' +ac_dC='\3' +ac_dD='%g' +# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". +ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='\([ ]\)%\1#\2define\3' +ac_uC=' ' +ac_uD='\4%g' +# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_eB='$%\1#\2define\3' +ac_eC=' ' +ac_eD='%g' + +if test "${CONFIG_HEADERS+set}" != set; then +EOF +cat >> $CONFIG_STATUS <<EOF + CONFIG_HEADERS=" config.h" +EOF +cat >> $CONFIG_STATUS <<\EOF +fi +for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + echo creating $ac_file + + rm -f conftest.frag conftest.in conftest.out + ac_file_inputs=`echo $ac_file_in|sed -e "s%:% $ac_given_srcdir/%g" -e "s%^%$ac_given_srcdir/%"` + cat $ac_file_inputs > conftest.in + +EOF + +# Transform confdefs.h into a sed script conftest.vals that substitutes +# the proper values into config.h.in to produce config.h. And first: +# Protect against being on the right side of a sed subst in config.status. +# Protect against being in an unquoted here document in config.status. +rm -f conftest.vals +cat > conftest.hdr <<\EOF +s/[\\&%]/\\&/g +s%[\\$`]%\\&%g +s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp +s%ac_d%ac_u%gp +s%ac_u%ac_e%gp +EOF +sed -n -f conftest.hdr confdefs.h > conftest.vals +rm -f conftest.hdr + +# This sed command replaces #undef with comments. This is necessary, for +# example, in the case of _POSIX_SOURCE, which is predefined and required +# on some systems where configure will not decide to define it. +cat >> conftest.vals <<\EOF +s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% +EOF + +# Break up conftest.vals because some shells have a limit on +# the size of here documents, and old seds have small limits too. + +rm -f conftest.tail +while : +do + ac_lines=`grep -c . conftest.vals` + # grep -c gives empty output for an empty file on some AIX systems. + if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi + # Write a limited-size here document to conftest.frag. + echo ' cat > conftest.frag <<CEOF' >> $CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS + echo 'CEOF + sed -f conftest.frag conftest.in > conftest.out + rm -f conftest.in + mv conftest.out conftest.in +' >> $CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail + rm -f conftest.vals + mv conftest.tail conftest.vals +done +rm -f conftest.vals + +cat >> $CONFIG_STATUS <<\EOF + rm -f conftest.frag conftest.h + echo "/* $ac_file. Generated automatically by configure. */" > conftest.h + cat conftest.in >> conftest.h + rm -f conftest.in + if cmp -s $ac_file conftest.h 2>/dev/null; then + echo "$ac_file is unchanged" + rm -f conftest.h + else + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + fi + rm -f $ac_file + mv conftest.h $ac_file + fi +fi; done + +EOF +cat >> $CONFIG_STATUS <<EOF + + + +EOF +cat >> $CONFIG_STATUS <<\EOF + + + +exit 0 +EOF +chmod +x $CONFIG_STATUS +rm -fr confdefs* $ac_clean_files +test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 + +if test "$no_recursion" != yes; then + + # Remove --cache-file and --srcdir arguments so they do not pile up. + ac_sub_configure_args= + ac_prev= + for ac_arg in $ac_configure_args; do + if test -n "$ac_prev"; then + ac_prev= + continue + fi + case "$ac_arg" in + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + ;; + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + ;; + *) ac_sub_configure_args="$ac_sub_configure_args $ac_arg" ;; + esac + done + + for ac_config_dir in : $subdirs; do + + # Do not complain, so a configure script can configure whichever + # parts of a large source tree are present. + if test ! -d $srcdir/$ac_config_dir; then + continue + fi + + echo configuring in $ac_config_dir + + case "$srcdir" in + .) ;; + *) + if test -d ./$ac_config_dir || mkdir ./$ac_config_dir; then :; + else + { echo "configure: error: can not create `pwd`/$ac_config_dir" 1>&2; exit 1; } + fi + ;; + esac + + ac_popdir=`pwd` + cd $ac_config_dir + + # A "../" for each directory in /$ac_config_dir. + ac_dots=`echo $ac_config_dir|sed -e 's%^\./%%' -e 's%[^/]$%&/%' -e 's%[^/]*/%../%g'` + + case "$srcdir" in + .) # No --srcdir option. We are building in place. + ac_sub_srcdir=$srcdir ;; + /*|[A-z]:/*) # Absolute path. + ac_sub_srcdir=$srcdir/$ac_config_dir ;; + *) # Relative path. + ac_sub_srcdir=$ac_dots$srcdir/$ac_config_dir ;; + esac + + # Check for guested configure; otherwise get Cygnus style configure. + if test -f ./configure; then + ac_sub_configure=./configure + elif test -f $ac_sub_srcdir/configure; then + ac_sub_configure=$ac_sub_srcdir/configure + elif test -f $ac_sub_srcdir/configure.in; then + ac_sub_configure=$ac_configure + else + echo "configure: warning: no configuration information is in $ac_config_dir" 1>&2 + ac_sub_configure= + fi + + # The recursion is here. + if test -n "$ac_sub_configure"; then + + # Make the cache file name correct relative to the subdirectory. + case "$cache_file" in + /*|[A-z]:/*) ac_sub_cache_file=$cache_file ;; + *) # Relative path. + ac_sub_cache_file="$ac_dots$cache_file" ;; + esac + case "$ac_given_INSTALL" in + "") ;; + [/$]*|[A-z]:/*) INSTALL="$ac_given_INSTALL" ;; + *) INSTALL="$ac_dots$ac_given_INSTALL" ;; + esac + + echo "running ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_sub_srcdir" + # The eval makes quoting arguments work. + if eval ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_sub_srcdir + then : + else + { echo "configure: error: $ac_sub_configure failed for $ac_config_dir" 1>&2; exit 1; } + fi + fi + + cd $ac_popdir + done +fi + diff --git a/Build/source/texk/chktex/configure.in b/Build/source/texk/chktex/configure.in new file mode 100644 index 00000000000..ced6ef94ceb --- /dev/null +++ b/Build/source/texk/chktex/configure.in @@ -0,0 +1,181 @@ +dnl +dnl ChkTeX v1.5, configuration file. +dnl Copyright (C) 1995-96 Jens T. Berger Thielemann +dnl +dnl This program is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 2 of the License, or +dnl (at your option) any later version. +dnl +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +dnl GNU General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with this program; if not, write to the Free Software +dnl Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +dnl +dnl Contact the author at: +dnl Jens Berger +dnl Spektrumvn. 4 +dnl N-0666 Oslo +dnl Norway +dnl E-mail: <jensthi@ifi.uio.no> +dnl +dnl + + +dnl Process this file with autoconf to produce a configure script. +AC_INIT(ChkTeX.c) +AC_SUBST(SCRIPTS) +SCRIPTS= +AC_SUBST(ELISPDIR) +ELISPDIR= + + +AC_ARG_ENABLE(lacheck-replace,[ + --enable-lacheck-replace: Installs a lacheck replacement for the + AUC-TeX interface. (Default: no).],, +enable_lacheck_replace=no) + +AC_ARG_ENABLE(emacs-hack,[ + --enable-emacs-hack: Installs a Elisp file, which makes ChkTeX + available in Emacs. Must be followed by + the path of your elisp files (e.g. + "--enable-emacs-hack=/usr/lib/emacs/"). + (Default: no).],, +enable_emacs_hack=no) + +AC_ARG_ENABLE(debug-info,[ + --enable-debug-info: Compile in miscellaneous runtime debugging + information. (Default: yes).],, +enable_debug_info=yes) + +if test "$silent" != "yes"; then +cat <<EOF + + + ##### ### ### ######## ### ## + ### ## ## ## ## ## #0 + @@ @@ @@@ @@ @@ @@ ####### @@ @ + @@ @@@ @@ @@ @@ @@ ## # @@ + && && && &&&& && @@ & && + &&& && && && && && && @@@@ & && + %%%%% %%% %%% %%% %%% %% && %%% %%% + && & + %%%%%%% + + Welcome to the ChkTeX configuration script! + Before taking the program in use, please read the + COPYING file; it applies to this script as well + as the remaining parts of the package. In short: + + *NO WARRANTIES WHATSOEVER* + + Copyright © 1995-96 + Jens T. Berger Thielemann + <jensthi@ifi.uio.no> +EOF +sleep 1 +cat <<EOF +Supported features: + --enable-lacheck-replace: Installs a lacheck replacement for the + AUC-TeX interface. (Default: no). + --enable-debug-info: Compile in miscellaneous runtime debugging + information. (Default: yes). + --enable-emacs-hack: Installs a Elisp file, which makes ChkTeX + available in Emacs. Must be followed by + the path of your elisp files (e.g. + "--enable-emacs-hack=/usr/lib/emacs/"). + (Default: no). +EOF +sleep 1 +fi + +AC_MSG_CHECKING(whether lacheck replacement should be installed) +if test "$enable_lacheck_replace" = "yes"; then + SCRIPTS="$SCRIPTS lacheck" + AC_MSG_RESULT(yes) +else + SCRIPTS= + AC_MSG_RESULT(no) +fi + +AC_MSG_CHECKING(whether runtime debug info should be used) +if test "$enable_debug_info" = "yes"; then + AC_MSG_RESULT(yes) +else + AC_DEFINE(STRIP_DEBUG, 1) + AC_MSG_RESULT(no) +fi + +AC_MSG_CHECKING(whether the emacs hack should be installed) +case $enable_emacs_hack in + no) AC_MSG_RESULT(no) + ;; + /*|*/*) ELISPDIR=$enable_emacs_hack + AC_MSG_RESULT(yes) + ;; + *) echo; + AC_MSG_ERROR(--enable-emacs-hack needs the *full path* of Elisp files) + ;; +esac + +dnl Checks for programs. +AC_PROG_CC +AC_PROG_INSTALL +AC_PROG_LN_S +AC_PATH_PROGS(PERL5, perl5 perl, no, $PATH:/usr/bin:/usr/local/bin) +if test "$PERL5" != no; then + AC_MSG_CHECKING(whether perl is v5 or higher) + if $PERL5 -e 'exit($] >= 5)'; then + PERL5=no + AC_MSG_RESULT(no) + else + AC_MSG_RESULT(yes) + fi +fi + +if test "$PERL5" != no; then + AC_SYS_INTERPRETER + if test "$ac_cv_sys_interpreter" = "yes"; then + SCRIPTS="$SCRIPTS chkweb deweb" + else + AC_MSG_WARN(deweb will not be installed since your system does) + AC_MSG_WARN(not support the pound-bang notation.) + fi +else + AC_MSG_WARN(deweb will not be installed since you do not have perl5.) +fi + +AC_CHECK_PROGS(GROFF, 'groff -man -P-bu -Tlatin1' 'nroff -man', 'nroff -man') + +AC_PATH_PROG(LATEX, latex) +AC_PATH_PROG(DVIPS, dvips) + +AC_PATH_PROG(LYNX, lynx) +AC_PATH_PROG(LATEX2HTML, latex2html) + +dnl Checks for libraries. +AC_CHECK_LIB(termlib, tgetent) +AC_CHECK_LIB(termcap, tgetent) + +dnl Checks for header files. +AC_HEADER_STDC +AC_HEADER_DIRENT +AC_CONFIG_HEADER(config.h) +AC_CHECK_HEADERS(limits.h stat.h strings.h stdarg.h dnl +sys/stat.h termcap.h termlib.h unistd.h) + +dnl Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_C_INLINE +AC_TYPE_SIZE_T + +dnl Checks for library functions. +AC_FUNC_VPRINTF +AC_CHECK_FUNCS(access closedir fileno isatty opendir readdir stat dnl +strcasecmp strdup strlwr strtol) + +AC_OUTPUT(Makefile deweb MakeHTML) diff --git a/Build/source/texk/chktex/depend.mak b/Build/source/texk/chktex/depend.mak new file mode 100644 index 00000000000..9f6f43f3d01 --- /dev/null +++ b/Build/source/texk/chktex/depend.mak @@ -0,0 +1,88 @@ +$(objdir)/FindErrs.obj: \ + ChkTeX.h \ + $(gnuw32dir)/win32lib.h \ + config.h \ + chktypes.h \ + FindErrs.h \ + OpSys.h \ + Utility.h \ + Resource.h + +$(objdir)/chktex.obj: \ + getopt.h \ + ChkTeX.h \ + $(gnuw32dir)/win32lib.h \ + config.h \ + chktypes.h \ + FindErrs.h \ + OpSys.h \ + Utility.h \ + Resource.h \ + $(kpathseadir)/config.h \ + $(kpathseadir)/c-auto.h \ + $(kpathseadir)/c-std.h \ + $(kpathseadir)/c-unistd.h \ + $(kpathseadir)/systypes.h \ + $(kpathseadir)/c-memstr.h \ + $(kpathseadir)/c-errno.h \ + $(kpathseadir)/c-minmax.h \ + $(kpathseadir)/c-limits.h \ + $(kpathseadir)/c-proto.h \ + $(kpathseadir)/debug.h \ + $(kpathseadir)/types.h \ + $(kpathseadir)/lib.h \ + $(kpathseadir)/progname.h + +$(objdir)/Utility.obj: \ + ChkTeX.h \ + $(gnuw32dir)/win32lib.h \ + config.h \ + chktypes.h \ + FindErrs.h \ + Utility.h \ + Resource.h \ + OpSys.h + +$(objdir)/getopt1.obj: \ + config.h \ + getopt.h + +$(objdir)/OpSys.obj: \ + $(kpathseadir)/config.h \ + $(kpathseadir)/c-auto.h \ + $(kpathseadir)/c-std.h \ + $(kpathseadir)/c-unistd.h \ + $(kpathseadir)/systypes.h \ + $(kpathseadir)/c-memstr.h \ + $(kpathseadir)/c-errno.h \ + $(kpathseadir)/c-minmax.h \ + $(kpathseadir)/c-limits.h \ + $(kpathseadir)/c-proto.h \ + $(gnuw32dir)/win32lib.h \ + $(kpathseadir)/debug.h \ + $(kpathseadir)/types.h \ + $(kpathseadir)/lib.h \ + $(kpathseadir)/progname.h \ + $(kpathseadir)/expand.h \ + $(kpathseadir)/tex-file.h \ + $(kpathseadir)/c-vararg.h \ + ChkTeX.h \ + config.h \ + chktypes.h \ + FindErrs.h \ + OpSys.h \ + Utility.h + +$(objdir)/getopt.obj: \ + config.h + +$(objdir)/Resource.obj: \ + ChkTeX.h \ + $(gnuw32dir)/win32lib.h \ + config.h \ + chktypes.h \ + FindErrs.h \ + OpSys.h \ + Utility.h \ + Resource.h + diff --git a/Build/source/texk/chktex/deweb.1 b/Build/source/texk/chktex/deweb.1 new file mode 100644 index 00000000000..a84036a8466 --- /dev/null +++ b/Build/source/texk/chktex/deweb.1 @@ -0,0 +1,116 @@ +.TH deweb 1 "June 8, 1996" +.AT 3 +.SH NAME +deweb \- strips away C & CWEB commands from CWEB sources +.SH SYNOPSIS +.B deweb +[ +.B file1 file2 ... +] +.SH DESCRIPTION +.I deweb +filters away all C & CWEB commands from a CWEB source code. This +leaves only the +.I LaTeX +code. This stripped code, in turn, may then +be passed to a suitable syntax checker for LaTeX, like +.I ChkTeX +and +.I lacheck, +or spell-checkers like +.I ispell. +.PP +The +.I chkweb +tool, included in the +.I ChkTeX +distribution will do just this; writing similar scripts should be +trivial. +.PP +When +.I deweb +strips away the C code from your CWEB source, it tries to preserve line breaks. +This means that the error reports from +.I <your favorite tool> +will be correct regarding to line numbers. In most cases, +the column position +will also be correct. This significantly simplifies +finding the errors in the +.I LaTeX +source (in contrast to the output from +.I cweave, +which output is truly difficult to figure anything out from). +.PP +.I deweb +accepts a list of filenames on the argument line, and will send its output +to +.I stdout. +If no filenames are given, it will read from stdin, acting as +a filter. No options are currently accepted. +.PP +Macho users may try to pipe the output from +.I deweb +directly into +.I LaTeX, +theoretically, this should work. This would ease the debugging +of the +.I LaTeX +code significantly, as when +.I LaTeX +complains about wrong syntax, you'll be able to find the erroneous +line much more easily. Don't expect that the output looks very much +like the final one, though. +.PP +.I deweb +should now understand all correct +.I CWEB +opcodes. If it complains about not understanding a correct opcode, +please inform the author. +.SH DISTRIBUTION +Copyright (C) 1996 Jens T. Berger Thielemann +.PP +This program is free software; you can redistribute it and/or modify +it under the terms of the +.I GNU General Public License +as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. +.PP +This program is distributed in the hope that it will be useful, +but +.B WITHOUT ANY WARRANTY; +without even the implied warranty of +.B MERCHANTABILITY +or +.B FITNESS FOR A PARTICULAR PURPOSE. +See the +.I GNU General Public License +for more details. +.PP +You should have received a copy of the +.B GNU General Public License +along with this program; if not, write to the +.I Free Software Foundation, Inc., +675 Mass Ave, Cambridge, MA 02139, USA. +.SH ENVIRONMENT +No environment variables are used. +.SH FILES +None. +.SH AUTHOR +Jens T. Berger Thielemann, +.I <jensthi@ifi.uio.no> +.SH "SEE ALSO" +.B cweave(1), perl(1), chktex, lacheck(1), ispell(1) +.SH BUGS +Doesn't even +.B compile +under +.I Perl +versions before perl v5. Unfortunately, this means that we can't even +tell the user why we failed; +.I Perl +will just complain about not being able to compile the regexps. +.PP +The program will try to swallow the whole input file at once, instead of +processing it on a line\-by\-line basis. +.ex diff --git a/Build/source/texk/chktex/deweb.doc b/Build/source/texk/chktex/deweb.doc new file mode 100644 index 00000000000..2636687602d --- /dev/null +++ b/Build/source/texk/chktex/deweb.doc @@ -0,0 +1,132 @@ + + + +deweb(1) deweb(1) + + +NAME + deweb - strips away C & CWEB commands from CWEB sources + +SYNOPSIS + deweb [ file1 file2 ... ] + +DESCRIPTION + deweb filters away all C & CWEB commands from a CWEB + source code. This leaves only the LaTeX code. This + stripped code, in turn, may then be passed to a suitable + syntax checker for LaTeX, like ChkTeX and lacheck, or + spell-checkers like ispell. + + The chkweb tool, included in the ChkTeX distribution will + do just this; writing similar scripts should be trivial. + + When deweb strips away the C code from your CWEB source, + it tries to preserve line breaks. This means that the + error reports from <your favorite tool> will be correct + regarding to line numbers. In most cases, the column posi + tion will also be correct. This significantly simplifies + finding the errors in the LaTeX source (in contrast to the + output from cweave, which output is truly difficult to + figure anything out from). + + deweb accepts a list of filenames on the argument line, + and will send its output to stdout. If no filenames are + given, it will read from stdin, acting as a filter. No + options are currently accepted. + + Macho users may try to pipe the output from deweb directly + into LaTeX, theoretically, this should work. This would + ease the debugging of the LaTeX code significantly, as + when LaTeX complains about wrong syntax, you'll be able to + find the erroneous line much more easily. Don't expect + that the output looks very much like the final one, + though. + + deweb should now understand all correct CWEB opcodes. If + it complains about not understanding a correct opcode, + please inform the author. + +DISTRIBUTION + Copyright (C) 1996 Jens T. Berger Thielemann + + This program is free software; you can redistribute it + and/or modify it under the terms of the GNU General Public + License as published by the Free Software Foundation; + either version 2 of the License, or (at your option) any + later version. + + This program is distributed in the hope that it will be + useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + + + + June 8, 1996 1 + + + + + +deweb(1) deweb(1) + + + PURPOSE. See the GNU General Public License for more + details. + + You should have received a copy of the GNU General Public + License along with this program; if not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA + 02139, USA. + +ENVIRONMENT + No environment variables are used. + +FILES + None. + +AUTHOR + Jens T. Berger Thielemann, <jensthi@ifi.uio.no> + +SEE ALSO + cweave(1), perl(1), chktex, lacheck(1), ispell(1) + +BUGS + Doesn't even compile under Perl versions before perl v5. + Unfortunately, this means that we can't even tell the user + why we failed; Perl will just complain about not being + able to compile the regexps. + + The program will try to swallow the whole input file at + once, instead of processing it on a line-by-line basis. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + June 8, 1996 2 + + diff --git a/Build/source/texk/chktex/deweb.in b/Build/source/texk/chktex/deweb.in new file mode 100644 index 00000000000..b40f2e0b57b --- /dev/null +++ b/Build/source/texk/chktex/deweb.in @@ -0,0 +1,122 @@ +#! @PERL5@ +# deweb v1.2, kills the C sections of a CWEB file, for passing to ChkTeX. +# Copyright (C) 1996 Jens T. Berger Thielemann +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +# Contact the author at: +# Jens Berger +# Spektrumvn. 4 +# N-0666 Oslo +# Norway +# E-mail: <jensthi@ifi.uio.no> +# +# +# + +print STDERR "DeWEB v1.2 - Copyright 1996 Jens T. Berger Thielemann\n"; + +undef $/; +$texmode = 1; +$_ = <>; + +while(/\@/) +{ + &out($`); + $_ = $'; + + if(/^@/) { + $_ = $'; + &out('@'); + next; + } + + if(/^([\s\n])/) { + $_ = $'; + print "\n" if $1 eq "\n"; + $texmode = 1; + next; + } + + if(/^[cpd]/i) { + $_ = $'; + $texmode = 0; + next; + } + + if(/^\,/i) { + $_ = $'; + print '\,'; + next; + } + + if(m!^/!) { + $_ = $'; + print '\\\\'; + next; + } + + if(/^[h\&\|\;\#\+]/i || /^i.*/i) { + $_ = $'; + next; + } + + if(/^\*[0-9\*]?((.|\n)*?\.)/) { + $_ = $'; + print $1; + $texmode = 1; + next; + } + + if(/^[<(^.t!]((.|\n)*?)\@\>/i) { + $_ = $'; + print '{'.$1.'}'; + $texmode = 0; + next; + } + + if(/^[=]((.|\n)*?)\@\>/) { + $_ = $'; + print &printnl($1); + next; + } + + if(/^[fsl](\s+\S+\s+\S+)|^\'(.|\n)*?\'|^\[((.|\n)*?)\@\]/i) { + $_ = $'; + print &printnl($+); + next; + } + + @line = split(/\n/, $_, 2); + print STDERR "Unknown opcode, ignored. Buffer:\n$line[0]\n"; + +} + +print $_; + +sub printnl { + my($foo); + if(defined $_[0]) { + $foo = $_[0]; + $foo =~ s/.//g; + } else { + $foo = ""; + } + $foo; +} + +sub out { + print $texmode? $_[0] : &printnl($_[0]); +} diff --git a/Build/source/texk/chktex/getopt.c b/Build/source/texk/chktex/getopt.c new file mode 100644 index 00000000000..6a083c7e9f0 --- /dev/null +++ b/Build/source/texk/chktex/getopt.c @@ -0,0 +1,756 @@ +/* Getopt for GNU. + NOTE: getopt is now part of the C library, so if you don't know what + "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu + before changing it! + + Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94 + Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ + +/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>. + Ditto for AIX 3.2 and <stdlib.h>. */ +#ifndef _NO_PROTO +#define _NO_PROTO +#endif + +#ifdef HAVE_CONFIG_H +#if defined (emacs) || defined (CONFIG_BROKETS) +/* We use <config.h> instead of "config.h" so that a compilation + using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h + (which it would do because it found this file in $srcdir). */ +#include <config.h> +#else +#include "config.h" +#endif +#endif + +#ifndef __STDC__ +/* This is a separate conditional since some stdc systems + reject `defined (const)'. */ +#ifndef const +#define const +#endif +#endif + +#include <stdio.h> + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#if defined (_LIBC) || !defined (__GNU_LIBRARY__) + + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +/* Don't include stdlib.h for non-GNU C libraries because some of them + contain conflicting prototypes for getopt. */ +#include <stdlib.h> +#endif /* GNU C library. */ + +/* This version of `getopt' appears to the caller like standard Unix `getopt' + but it behaves differently for the user, since it allows the user + to intersperse the options with the other arguments. + + As `getopt' works, it permutes the elements of ARGV so that, + when it is done, all the options precede everything else. Thus + all application programs are extended to handle flexible argument order. + + Setting the environment variable POSIXLY_CORRECT disables permutation. + Then the behavior is completely standard. + + GNU application programs can use a third alternative mode in which + they can distinguish the relative order of options and other arguments. */ + +#include "getopt.h" + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +char *optarg = NULL; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns EOF, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +/* XXX 1003.2 says this must be 1 before any call. */ +int optind = 0; + +/* The next char to be scanned in the option-element + in which the last option character we returned was found. + This allows us to pick up the scan where we left off. + + If this is zero, or a null string, it means resume the scan + by advancing to the next ARGV-element. */ + +static char *nextchar; + +/* Callers store zero here to inhibit the error message + for unrecognized options. */ + +int opterr = 1; + +/* Set to an option character which was unrecognized. + This must be initialized on some systems to avoid linking in the + system's own getopt implementation. */ + +int optopt = '?'; + +/* Describe how to deal with options that follow non-option ARGV-elements. + + If the caller did not specify anything, + the default is REQUIRE_ORDER if the environment variable + POSIXLY_CORRECT is defined, PERMUTE otherwise. + + REQUIRE_ORDER means don't recognize them as options; + stop option processing when the first non-option is seen. + This is what Unix does. + This mode of operation is selected by either setting the environment + variable POSIXLY_CORRECT, or using `+' as the first character + of the list of option characters. + + PERMUTE is the default. We permute the contents of ARGV as we scan, + so that eventually all the non-options are at the end. This allows options + to be given in any order, even with programs that were not written to + expect this. + + RETURN_IN_ORDER is an option available to programs that were written + to expect options and other ARGV-elements in any order and that care about + the ordering of the two. We describe each non-option ARGV-element + as if it were the argument of an option with character code 1. + Using `-' as the first character of the list of option characters + selects this mode of operation. + + The special argument `--' forces an end of option-scanning regardless + of the value of `ordering'. In the case of RETURN_IN_ORDER, only + `--' can cause `getopt' to return EOF with `optind' != ARGC. */ + +static enum +{ + REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER +} ordering; + +/* Value of POSIXLY_CORRECT environment variable. */ +static char *posixly_correct; + +#ifdef __GNU_LIBRARY__ +/* We want to avoid inclusion of string.h with non-GNU libraries + because there are many ways it can cause trouble. + On some systems, it contains special magic macros that don't work + in GCC. */ +#include <string.h> +#define my_index strchr +#else + +/* Avoid depending on library functions or files + whose names are inconsistent. */ + +char *getenv (); + +static char * +my_index (str, chr) + const char *str; + int chr; +{ + while (*str) + { + if (*str == chr) + return (char *) str; + str++; + } + return 0; +} + +/* If using GCC, we can safely declare strlen this way. + If not using GCC, it is ok not to declare it. */ +#ifdef __GNUC__ +/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. + That was relevant to code that was here before. */ +#ifndef __STDC__ +/* gcc with -traditional declares the built-in strlen to return int, + and has done so at least since version 2.4.5. -- rms. */ +extern int strlen (const char *); +#endif /* not __STDC__ */ +#endif /* __GNUC__ */ + +#endif /* not __GNU_LIBRARY__ */ + +/* Handle permutation of arguments. */ + +/* Describe the part of ARGV that contains non-options that have + been skipped. `first_nonopt' is the index in ARGV of the first of them; + `last_nonopt' is the index after the last of them. */ + +static int first_nonopt; +static int last_nonopt; + +/* Exchange two adjacent subsequences of ARGV. + One subsequence is elements [first_nonopt,last_nonopt) + which contains all the non-options that have been skipped so far. + The other is elements [last_nonopt,optind), which contains all + the options processed since those non-options were skipped. + + `first_nonopt' and `last_nonopt' are relocated so that they describe + the new indices of the non-options in ARGV after they are moved. */ + +static void +exchange (argv) + char **argv; +{ + int bottom = first_nonopt; + int middle = last_nonopt; + int top = optind; + char *tem; + + /* Exchange the shorter segment with the far end of the longer segment. + That puts the shorter segment into the right place. + It leaves the longer segment in the right place overall, + but it consists of two parts that need to be swapped next. */ + + while (top > middle && middle > bottom) + { + if (top - middle > middle - bottom) + { + /* Bottom segment is the short one. */ + int len = middle - bottom; + register int i; + + /* Swap it with the top part of the top segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[top - (middle - bottom) + i]; + argv[top - (middle - bottom) + i] = tem; + } + /* Exclude the moved bottom segment from further swapping. */ + top -= len; + } + else + { + /* Top segment is the short one. */ + int len = top - middle; + register int i; + + /* Swap it with the bottom part of the bottom segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[middle + i]; + argv[middle + i] = tem; + } + /* Exclude the moved top segment from further swapping. */ + bottom += len; + } + } + + /* Update records for the slots the non-options now occupy. */ + + first_nonopt += (optind - last_nonopt); + last_nonopt = optind; +} + +/* Initialize the internal data when the first call is made. */ + +static const char * +_getopt_initialize (optstring) + const char *optstring; +{ + /* Start processing options with ARGV-element 1 (since ARGV-element 0 + is the program name); the sequence of previously skipped + non-option ARGV-elements is empty. */ + + first_nonopt = last_nonopt = optind = 1; + + nextchar = NULL; + + posixly_correct = getenv ("POSIXLY_CORRECT"); + + /* Determine how to handle the ordering of options and nonoptions. */ + + if (optstring[0] == '-') + { + ordering = RETURN_IN_ORDER; + ++optstring; + } + else if (optstring[0] == '+') + { + ordering = REQUIRE_ORDER; + ++optstring; + } + else if (posixly_correct != NULL) + ordering = REQUIRE_ORDER; + else + ordering = PERMUTE; + + return optstring; +} + +/* Scan elements of ARGV (whose length is ARGC) for option characters + given in OPTSTRING. + + If an element of ARGV starts with '-', and is not exactly "-" or "--", + then it is an option element. The characters of this element + (aside from the initial '-') are option characters. If `getopt' + is called repeatedly, it returns successively each of the option characters + from each of the option elements. + + If `getopt' finds another option character, it returns that character, + updating `optind' and `nextchar' so that the next call to `getopt' can + resume the scan with the following option character or ARGV-element. + + If there are no more option characters, `getopt' returns `EOF'. + Then `optind' is the index in ARGV of the first ARGV-element + that is not an option. (The ARGV-elements have been permuted + so that those that are not options now come last.) + + OPTSTRING is a string containing the legitimate option characters. + If an option character is seen that is not listed in OPTSTRING, + return '?' after printing an error message. If you set `opterr' to + zero, the error message is suppressed but we still return '?'. + + If a char in OPTSTRING is followed by a colon, that means it wants an arg, + so the following text in the same ARGV-element, or the text of the following + ARGV-element, is returned in `optarg'. Two colons mean an option that + wants an optional arg; if there is text in the current ARGV-element, + it is returned in `optarg', otherwise `optarg' is set to zero. + + If OPTSTRING starts with `-' or `+', it requests different methods of + handling the non-option ARGV-elements. + See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. + + Long-named options begin with `--' instead of `-'. + Their names may be abbreviated as long as the abbreviation is unique + or is an exact match for some defined option. If they have an + argument, it follows the option name in the same ARGV-element, separated + from the option name by a `=', or else the in next ARGV-element. + When `getopt' finds a long-named option, it returns 0 if that option's + `flag' field is nonzero, the value of the option's `val' field + if the `flag' field is zero. + + The elements of ARGV aren't really const, because we permute them. + But we pretend they're const in the prototype to be compatible + with other systems. + + LONGOPTS is a vector of `struct option' terminated by an + element containing a name which is zero. + + LONGIND returns the index in LONGOPT of the long-named option found. + It is only valid when a long-named option has been found by the most + recent call. + + If LONG_ONLY is nonzero, '-' as well as '--' can introduce + long-named options. */ + +int +_getopt_internal (argc, argv, optstring, longopts, longind, long_only) + int argc; + char *const *argv; + const char *optstring; + const struct option *longopts; + int *longind; + int long_only; +{ + optarg = NULL; + + if (optind == 0) + optstring = _getopt_initialize (optstring); + + if (nextchar == NULL || *nextchar == '\0') + { + /* Advance to the next ARGV-element. */ + + if (ordering == PERMUTE) + { + /* If we have just processed some options following some non-options, + exchange them so that the options come first. */ + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (last_nonopt != optind) + first_nonopt = optind; + + /* Skip any additional non-options + and extend the range of non-options previously skipped. */ + + while (optind < argc + && (argv[optind][0] != '-' || argv[optind][1] == '\0')) + optind++; + last_nonopt = optind; + } + + /* The special ARGV-element `--' means premature end of options. + Skip it like a null option, + then exchange with previous non-options as if it were an option, + then skip everything else like a non-option. */ + + if (optind != argc && !strcmp (argv[optind], "--")) + { + optind++; + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (first_nonopt == last_nonopt) + first_nonopt = optind; + last_nonopt = argc; + + optind = argc; + } + + /* If we have done all the ARGV-elements, stop the scan + and back over any non-options that we skipped and permuted. */ + + if (optind == argc) + { + /* Set the next-arg-index to point at the non-options + that we previously skipped, so the caller will digest them. */ + if (first_nonopt != last_nonopt) + optind = first_nonopt; + return EOF; + } + + /* If we have come to a non-option and did not permute it, + either stop the scan or describe it to the caller and pass it by. */ + + if ((argv[optind][0] != '-' || argv[optind][1] == '\0')) + { + if (ordering == REQUIRE_ORDER) + return EOF; + optarg = argv[optind++]; + return 1; + } + + /* We have found another option-ARGV-element. + Skip the initial punctuation. */ + + nextchar = (argv[optind] + 1 + + (longopts != NULL && argv[optind][1] == '-')); + } + + /* Decode the current option-ARGV-element. */ + + /* Check whether the ARGV-element is a long option. + + If long_only and the ARGV-element has the form "-f", where f is + a valid short option, don't consider it an abbreviated form of + a long option that starts with f. Otherwise there would be no + way to give the -f short option. + + On the other hand, if there's a long option "fubar" and + the ARGV-element is "-fu", do consider that an abbreviation of + the long option, just like "--fu", and not "-f" with arg "u". + + This distinction seems to be the most useful approach. */ + + if (longopts != NULL + && (argv[optind][1] == '-' + || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound; + int option_index; + + for (nameend = nextchar; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, nextchar, nameend - nextchar)) + { + if (nameend - nextchar == strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else + /* Second or later nonexact match found. */ + ambig = 1; + } + + if (ambig && !exact) + { + if (opterr) + fprintf (stderr, "%s: option `%s' is ambiguous\n", + argv[0], argv[optind]); + nextchar += strlen (nextchar); + optind++; + return '?'; + } + + if (pfound != NULL) + { + option_index = indfound; + optind++; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + optarg = nameend + 1; + else + { + if (opterr) + { + if (argv[optind - 1][1] == '-') + /* --option */ + fprintf (stderr, + "%s: option `--%s' doesn't allow an argument\n", + argv[0], pfound->name); + else + /* +option or -option */ + fprintf (stderr, + "%s: option `%c%s' doesn't allow an argument\n", + argv[0], argv[optind - 1][0], pfound->name); + } + nextchar += strlen (nextchar); + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (optind < argc) + optarg = argv[optind++]; + else + { + if (opterr) + fprintf (stderr, "%s: option `%s' requires an argument\n", + argv[0], argv[optind - 1]); + nextchar += strlen (nextchar); + return optstring[0] == ':' ? ':' : '?'; + } + } + nextchar += strlen (nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + + /* Can't find it as a long option. If this is not getopt_long_only, + or the option starts with '--' or is not a valid short + option, then it's an error. + Otherwise interpret it as a short option. */ + if (!long_only || argv[optind][1] == '-' + || my_index (optstring, *nextchar) == NULL) + { + if (opterr) + { + if (argv[optind][1] == '-') + /* --option */ + fprintf (stderr, "%s: unrecognized option `--%s'\n", + argv[0], nextchar); + else + /* +option or -option */ + fprintf (stderr, "%s: unrecognized option `%c%s'\n", + argv[0], argv[optind][0], nextchar); + } + nextchar = (char *) ""; + optind++; + return '?'; + } + } + + /* Look at and handle the next short option-character. */ + + { + char c = *nextchar++; + char *temp = my_index (optstring, c); + + /* Increment `optind' when we start to process its last character. */ + if (*nextchar == '\0') + ++optind; + + if (temp == NULL || c == ':') + { + if (opterr) + { + if (posixly_correct) + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, "%s: illegal option -- %c\n", argv[0], c); + else + fprintf (stderr, "%s: invalid option -- %c\n", argv[0], c); + } + optopt = c; + return '?'; + } + if (temp[1] == ':') + { + if (temp[2] == ':') + { + /* This is an option that accepts an argument optionally. */ + if (*nextchar != '\0') + { + optarg = nextchar; + optind++; + } + else + optarg = NULL; + nextchar = NULL; + } + else + { + /* This is an option that requires an argument. */ + if (*nextchar != '\0') + { + optarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + optind++; + } + else if (optind == argc) + { + if (opterr) + { + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, "%s: option requires an argument -- %c\n", + argv[0], c); + } + optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + nextchar = NULL; + } + } + return c; + } +} + +int +getopt (argc, argv, optstring) + int argc; + char *const *argv; + const char *optstring; +{ + return _getopt_internal (argc, argv, optstring, + (const struct option *) 0, + (int *) 0, + 0); +} + +#endif /* _LIBC or not __GNU_LIBRARY__. */ + +/* + +#ifdef TEST + +int +main (argc, argv) + int argc; + char **argv; +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + + c = getopt (argc, argv, "abc:d:0123456789"); + if (c == EOF) + break; + + switch (c) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case '?': + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif + +*/ diff --git a/Build/source/texk/chktex/getopt.h b/Build/source/texk/chktex/getopt.h new file mode 100644 index 00000000000..45541f5ac0f --- /dev/null +++ b/Build/source/texk/chktex/getopt.h @@ -0,0 +1,129 @@ +/* Declarations for getopt. + Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#ifndef _GETOPT_H +#define _GETOPT_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +extern char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns EOF, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +extern int optind; + +/* Callers store zero here to inhibit the error message `getopt' prints + for unrecognized options. */ + +extern int opterr; + +/* Set to an option character which was unrecognized. */ + +extern int optopt; + +/* Describe the long-named options requested by the application. + The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector + of `struct option' terminated by an element containing a name which is + zero. + + The field `has_arg' is: + no_argument (or 0) if the option does not take an argument, + required_argument (or 1) if the option requires an argument, + optional_argument (or 2) if the option takes an optional argument. + + If the field `flag' is not NULL, it points to a variable that is set + to the value given in the field `val' when the option is found, but + left unchanged if the option is not found. + + To have a long-named option do something other than set an `int' to + a compiled-in constant, such as set a value from `optarg', set the + option's `flag' field to zero and its `val' field to a nonzero + value (the equivalent single-letter option character, if there is + one). For long options that have a zero `flag' field, `getopt' + returns the contents of the `val' field. */ + +struct option +{ +#if __STDC__ + const char *name; +#else + char *name; +#endif + /* has_arg can't be an enum because some compilers complain about + type mismatches in all the code that assumes it is an int. */ + int has_arg; + int *flag; + int val; +}; + +/* Names for the values of the `has_arg' field of `struct option'. */ + +#define no_argument 0 +#define required_argument 1 +#define optional_argument 2 + +#if __STDC__ +#if defined(__GNU_LIBRARY__) +/* Many other libraries have conflicting prototypes for getopt, with + differences in the consts, in stdlib.h. To avoid compilation + errors, only prototype getopt for the GNU C library. */ +extern int getopt (int argc, char *const *argv, const char *shortopts); +#else /* not __GNU_LIBRARY__ */ +extern int getopt (); +#endif /* not __GNU_LIBRARY__ */ +extern int getopt_long (int argc, char *const *argv, const char *shortopts, + const struct option *longopts, int *longind); +extern int getopt_long_only (int argc, char *const *argv, + const char *shortopts, + const struct option *longopts, int *longind); + +/* Internal only. Users should not call this directly. */ +extern int _getopt_internal (int argc, char *const *argv, + const char *shortopts, + const struct option *longopts, int *longind, + int long_only); +#else /* not __STDC__ */ +extern int getopt (); +extern int getopt_long (); +extern int getopt_long_only (); + +extern int _getopt_internal (); +#endif /* not __STDC__ */ + +#ifdef __cplusplus +} +#endif + +#endif /* _GETOPT_H */ diff --git a/Build/source/texk/chktex/getopt1.c b/Build/source/texk/chktex/getopt1.c new file mode 100644 index 00000000000..4e9b7ca9b2b --- /dev/null +++ b/Build/source/texk/chktex/getopt1.c @@ -0,0 +1,189 @@ +/* getopt_long and getopt_long_only entry points for GNU getopt. + Copyright (C) 1987, 88, 89, 90, 91, 92, 1993 + Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#ifdef HAVE_CONFIG_H +#if defined (emacs) || defined (CONFIG_BROKETS) +/* We use <config.h> instead of "config.h" so that a compilation + using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h + (which it would do because it found this file in $srcdir). */ +#include <config.h> +#else +#include "config.h" +#endif +#endif + +#include "getopt.h" + +#ifndef __STDC__ +/* This is a separate conditional since some stdc systems + reject `defined (const)'. */ +#ifndef const +#define const +#endif +#endif + +#include <stdio.h> + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#if defined (_LIBC) || !defined (__GNU_LIBRARY__) + + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +#include <stdlib.h> +#else +char *getenv (); +#endif + +#ifndef NULL +#define NULL 0 +#endif + +int +getopt_long (argc, argv, options, long_options, opt_index) + int argc; + char *const *argv; + const char *options; + const struct option *long_options; + int *opt_index; +{ + return _getopt_internal (argc, argv, options, long_options, opt_index, 0); +} + +/* Like getopt_long, but '-' as well as '--' can indicate a long option. + If an option that starts with '-' (not '--') doesn't match a long option, + but does match a short option, it is parsed as a short option + instead. */ + +int +getopt_long_only (argc, argv, options, long_options, opt_index) + int argc; + char *const *argv; + const char *options; + const struct option *long_options; + int *opt_index; +{ + return _getopt_internal (argc, argv, options, long_options, opt_index, 1); +} + + +#endif /* _LIBC or not __GNU_LIBRARY__. */ + +/* +#ifdef TEST + +#include <stdio.h> + +int +main (argc, argv) + int argc; + char **argv; +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + int option_index = 0; + static struct option long_options[] = + { + {"add", 1, 0, 0}, + {"append", 0, 0, 0}, + {"delete", 1, 0, 0}, + {"verbose", 0, 0, 0}, + {"create", 0, 0, 0}, + {"file", 1, 0, 0}, + {0, 0, 0, 0} + }; + + c = getopt_long (argc, argv, "abc:d:0123456789", + long_options, &option_index); + if (c == EOF) + break; + + switch (c) + { + case 0: + printf ("option %s", long_options[option_index].name); + if (optarg) + printf (" with arg %s", optarg); + printf ("\n"); + break; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case 'd': + printf ("option d with value `%s'\n", optarg); + break; + + case '?': + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif +*/ diff --git a/Build/source/texk/chktex/input.tex b/Build/source/texk/chktex/input.tex new file mode 100644 index 00000000000..76bc301ff25 --- /dev/null +++ b/Build/source/texk/chktex/input.tex @@ -0,0 +1 @@ +\this is a test of whether the file is actually inputted... diff --git a/Build/source/texk/chktex/win32.mak b/Build/source/texk/chktex/win32.mak new file mode 100644 index 00000000000..7a92352517d --- /dev/null +++ b/Build/source/texk/chktex/win32.mak @@ -0,0 +1,65 @@ +################################################################################ +# +# Makefile : ChkTeX +# Author : Fabrice Popineau <Fabrice.Popineau@supelec.fr> +# Platform : Win32, Microsoft VC++ 6.0, depends upon fpTeX 0.5 sources +# Time-stamp: <03/08/23 19:02:50 popineau> +# +################################################################################ +root_srcdir = ..\.. +!ifdef DEVELOPMENT +INCLUDE=$(INCLUDE);$(root_srcdir)\texk.development +!else +INCLUDE=$(INCLUDE);$(root_srcdir)\texk +!endif + +USE_KPATHSEA = 1 +USE_GNUW32 = 1 + +!include <msvc/common.mak> + +# We need to get getopt.h from kpathsea, not from the current directory. +DEFS = -I$(kpathseadir) -I. $(DEFS) -D_MSDOS -DHAVE_CONFIG_H + +objects = $(objdir)\ChkTeX.obj $(objdir)\FindErrs.obj $(objdir)\OpSys.obj \ + $(objdir)\Resource.obj $(objdir)\Utility.obj + +programs = $(objdir)\ChkTeX.exe + +manfiles = +#infofiles = ChkTeX.info +docsubdir = chktex +pdfdocfiles = ChkTeX.pdf +htmlfiles = + +installdirs = $(bindir) $(texmf)\chktex + +default: all + +all: $(objdir) $(programs) + +$(objdir)\ChkTeX.exe: $(objects) $(kpathsealib) + $(link) $(objects) $(kpathsealib) $(conlibs) + +!include <msvc/config.mak> +!include <msvc/install.mak> + +install:: install-exec install-data install-man install-doc + +install-data:: + -@echo $(verbose) & ( \ + echo "Installing data in $(MAKEDIR)" & \ + $(copy) chktexrc $(texmf)\chktex\.chktexrc $(redir_stdout) \ + ) + +distclean:: + -@$(del) config.h chktex.dvi chktex.pdf + +!include <msvc/clean.mak> +!include <msvc/rdepend.mak> +!include "./depend.mak" + +# +# Local Variables: +# mode: makefile +# End:
\ No newline at end of file |