chktex-1.7.9/000755 000767 000024 00000000000 14613045515 013634 5ustar00iandrusstaff000000 000000 chktex-1.7.9/MakeChkTeXRC.pl000755 000767 000024 00000002742 14613043276 016354 0ustar00iandrusstaff000000 000000 # Used to convert chktexrc.in (which see) into chktexrc and ChkTeXRC.tex use strict; use warnings; my $chktexrc_output; if ( $ARGV[0] eq '--chktexrc' ) { $chktexrc_output = 1; } elsif ( $ARGV[0] eq '--latex' ) { $chktexrc_output = 0; } else { exit 1; } # Filter the lines of the file open(my $fh, '<:encoding(UTF-8)', $ARGV[1]) or die "Could not open file '$ARGV[1]' $!"; while ( <$fh> ) { if (/^#### END$/) { exit 0; } if ($chktexrc_output) { # chktexrc output, so discard all lines over 2 next if /^#{3,}/; s/\@verb\@/`/g; s/\@endverb\@/'/g; s/\@emph\@/*/g; s/\@endemph\@/*/g; s/\@ref\@/ /g; s/\@endref\@//g; s/\@TeX@/TeX/g; s/\@LaTeX@/LaTeX/g; s/\@ChkTeX@/ChkTeX/g; s/\@\\{2}\@//g; # \\ in LaTeX s/\\\@ */ /g; # \@ in LaTeX s/\@bf //g; s/\@\&\@//g; print; } else { # LaTeX output, so discard lines except with 1,3 next if /^#{4,}/; next if /^#{2} /; # next unless /^#/; s/^#+[ ]*//; s/\@emph\@/\\emph{/g; s/\@endemph\@/}/g; s/\@ref\@(.*)\@endref\@/~\\hyperref[rc:$1]{$1}/g; s/\@TeX@/\\TeX{}/g; s/\@LaTeX@/\\LaTeX{}/g; s/\@ChkTeX@/\\chktex{}/g; s/\@verb\@/\\verb@/g; s/\@endverb\@/@/g; s/\@\\{2}\@/\\\\/g; s/\@bf/\\bf/g; s/\@\&\@/&/g; print; } } # TODO: # \ChkTeX chktex-1.7.9/lacheck000755 000767 000024 00000001717 14613043276 015164 0ustar00iandrusstaff000000 000000 #! /bin/sh # lacheck replacement 1.0, lacheck <-> ChkTeX interface (UNIX). # Copyright (C) 1996 Jens T. Berger Thielemann # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Contact the author at: # Jens Berger # Spektrumvn. 4 # N-0666 Oslo # Norway # E-mail: chktex -v3 $* chktex-1.7.9/stamp-h.in000644 000767 000024 00000000012 14613045514 015525 0ustar00iandrusstaff000000 000000 timestamp chktex-1.7.9/test-all.sh000755 000767 000024 00000000440 14613043276 015720 0ustar00iandrusstaff000000 000000 #!/usr/local/bin/bash set -e # All 3 RE options ./configure --disable-pcre --disable-posixre make check ./configure --disable-pcre --enable-posixre make check ./configure --enable-pcre make check # Out of directory build mkdir -p build cd build ../configure --enable-pcre make check chktex-1.7.9/OpSys.c000644 000767 000024 00000033112 14613043276 015057 0ustar00iandrusstaff000000 000000 /* * ChkTeX, operating system specific code for ChkTeX. * Copyright (C) 1995-96 Jens T. Berger Thielemann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * Contact the author at: * Jens Berger * Spektrumvn. 4 * N-0666 Oslo * Norway * E-mail: * * */ /* * Some functions which have to be made different from OS to OS, * unfortunately...:\ * */ #include "ChkTeX.h" #include "OpSys.h" #include "Utility.h" #ifdef KPATHSEA #include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef HAVE_STAT_H # include #endif #if HAVE_DIRENT_H # include # define NAMLEN(dirent) strlen((dirent)->d_name) #else # define dirent direct # define NAMLEN(dirent) (dirent)->d_namlen # if HAVE_SYS_NDIR_H # include # endif # if HAVE_SYS_DIR_H # include # endif # if HAVE_NDIR_H # include # 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 # elif HAVE_TERMLIB_H # include # else int tgetent(char *BUFFER, char *TERMTYPE); char *tgetstr(char *NAME, char **AREA); # endif static char term_buffer[2048]; #endif /* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ /* * This is the name of the global resource file. */ #ifndef SYSCONFDIR # if defined(__unix__) # define SYSCONFDIR "/usr/local/lib/" # elif defined(__MSDOS__) # define SYSCONFDIR "\\emtex\\data\\" # else # define SYSCONFDIR # endif #endif #define RCBASENAME "chktexrc" #ifdef __MSDOS__ # define LOCALRCFILE RCBASENAME #elif defined(WIN32) # define LOCALRCFILE RCBASENAME #else # define LOCALRCFILE "." RCBASENAME #endif char ConfigFile[BUFFER_SIZE] = LOCALRCFILE; struct WordList ConfigFiles; const char *ReverseOn; const char *ReverseOff; static int HasFile(char *Dir, const char *Filename, const char *App); #if USE_RECURSE static int SearchFile(char *Dir, const char *Filename, const char *App); #endif /* USE_RECURSE */ /* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ /* * Modify this one to suit your needs. In any case, it should fill * the ConfigFile (sized BUFLEN) buffer above with full name & path * for the configuration file. The macro RCFILE will give you the * filename part of the file, if you need that. * * Note: This routine will be called several times. Your mission will * be to look in each location, and see whether a .chktexrc file exist * there. * * If you choose to do nothing, only the current directory will be * searched. * */ enum LookIn { liMin, liSysDir, liUsrDir, liXdgDir, liEnvir, liCurDir, liNFound, liMax }; int SetupVars(void) { char *Env; #ifdef __MSDOS__ char *Ptr; #endif static enum LookIn i = liMin; static int FoundFile; while (++i < liMax) { switch (i) { case liCurDir: /* Current directory */ strcpy(ConfigFile, LOCALRCFILE); break; case liEnvir: /* Environment defined */ #ifdef __MSDOS__ if ((Env = getenv("CHKTEXRC")) || (Env = getenv("CHKTEX_HOME"))) #elif defined(TEX_LIVE) if ((Env = kpse_var_value("CHKTEXRC"))) #else if ((Env = getenv("CHKTEXRC"))) #endif { strcpy(ConfigFile, Env); tackon(ConfigFile, LOCALRCFILE); #ifdef TEX_LIVE free(Env); #endif } else #ifdef __MSDOS__ if ((Env = getenv("EMTEXDIR"))) { strcpy(ConfigFile, Env); tackon(ConfigFile, "data"); tackon(ConfigFile, LOCALRCFILE); } else #endif *ConfigFile = 0; break; case liXdgDir: /* Cross-desktop group dir for resource files */ /* XDG is really unix specific, but it shouldn't hurt to * support it on Windows, should someone set the variables. */ if ((Env = getenv("XDG_CONFIG_HOME")) && *Env) { strcpy(ConfigFile, Env); tackon(ConfigFile, RCBASENAME); } else if ((Env = getenv("HOME")) && *Env) { strcpy(ConfigFile, Env); tackon(ConfigFile, ".config"); tackon(ConfigFile, RCBASENAME); } else *ConfigFile = 0; break; case liUsrDir: /* User dir for resource files */ #if defined(__unix__) if ((Env = getenv("HOME")) || (Env = getenv("LOGDIR"))) { strcpy(ConfigFile, Env); tackon(ConfigFile, LOCALRCFILE); } else #elif defined(__MSDOS__) strcpy(ConfigFile, PrgName); if ((Ptr = strrchr(ConfigFile, '\\')) || (Ptr = strchr(ConfigFile, ':'))) strcpy(++Ptr, RCBASENAME); else #endif *ConfigFile = 0; break; case liSysDir: /* System dir for resource files */ #ifdef TEX_LIVE if ((Env = kpse_var_value("CHKTEX_CONFIG"))) { strcpy(ConfigFile, Env); free(Env); } else if ((Env = kpse_var_value("TEXMFMAIN"))) { strcpy(ConfigFile, Env); tackon(ConfigFile, "chktex"); tackon(ConfigFile, RCBASENAME); free(Env); } else *ConfigFile = 0; #else /* TEX_LIVE */ #if defined(__unix__) || defined(__MSDOS__) strcpy(ConfigFile, SYSCONFDIR); tackon(ConfigFile, RCBASENAME); #else *ConfigFile = 0; #endif #endif /* TEX_LIVE */ break; case liNFound: case liMin: case liMax: *ConfigFile = 0; if (!FoundFile) PrintPrgErr(pmNoRsrc); } if (*ConfigFile && fexists(ConfigFile)) break; } FoundFile |= *ConfigFile; return (*ConfigFile); } /* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ /* * This function should initialize the global variables ReverseOn * and ReverseOff to magic cookies, which when printed, makes the * text in between stand out. */ void SetupTerm(void) { #ifdef USE_TERMCAP char *termtype = getenv("TERM"); int success; char *buffer; static char str_so[3] = "so", str_se[3] = "se"; if (termtype) { success = tgetent(term_buffer, termtype); if (success < 0) PrintPrgErr(pmNoTermData); if (success == 0) PrintPrgErr(pmNoTermDefd); buffer = (char *) malloc(sizeof(term_buffer)); ReverseOn = tgetstr(str_so, &buffer); ReverseOff = tgetstr(str_se, &buffer); if (ReverseOn && ReverseOff) return; } #endif ReverseOn = PRE_ERROR_STR; ReverseOff = POST_ERROR_STR; } /* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ /* * Concatenates the `File' string to the `Dir' string, leaving the result * in the `Dir' buffer. Takes care of inserting `directory' characters; * if we've got the strings "/usr/foo" and "bar", we'll get * "/usr/foo/bar". * * Behaviour somewhat controlled by the macros SLASH and DIRCHARS in the * OpSys.h file. * */ void tackon(char *Dir, const char *File) { int EndC; unsigned long SLen; if (Dir && (SLen = strlen(Dir))) { EndC = Dir[SLen - 1]; if (!(strchr(DIRCHARS, EndC))) { Dir[SLen++] = SLASH; Dir[SLen] = 0L; } } strcat(Dir, File); } /* * This function should add the appendix App to the filename Name. * If the resulting filename gets too long due to this, it may * overwrite the old appendix. * * Name may be assumed to be a legal filename under your OS. * * The appendix should contain a leading dot. */ void AddAppendix(char *Name, const char *App) { #ifdef __MSDOS__ char *p; if ((p = strrchr(Name, '.'))) strcpy(p, App); else strcat(Name, App); #else /* * NOTE! This may fail if your system has a claustrophobic file * name length limit. */ strcat(Name, App); #endif } /* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ /* * Locates a file, given a wordlist containing paths. If a * dir ends in a double SLASH, we'll search it recursively. * * We assume that * a) a deeper level in the dir. tree. has a longer path than * one above. * b) adding a level doesn't change any of the previous levels. * * If this function returns TRUE, Dest is guaranteed to contain * path & name of the found file. * * FALSE indicates that the file was not found; Dest is then * unspecified. */ int LocateFile(const char *Filename, /* File to search for */ char *Dest, /* Where to put final file */ const char *App, /* Extra optional appendix */ struct WordList *wl) /* List of paths, entries * ending in // will be recursed */ { unsigned long i; #if USE_RECURSE unsigned long Len; #endif FORWL(i, *wl) { strcpy(Dest, wl->Stack.Data[i]); #if USE_RECURSE Len = strlen(Dest); if (Len && (Dest[Len - 1] == SLASH) && (Dest[Len - 2] == SLASH)) { Dest[Len - 1] = Dest[Len - 2] = 0; if (SearchFile(Dest, Filename, App)) return (TRUE); } else #endif /* USE_RECURSE */ { if (HasFile(Dest, Filename, App)) return (TRUE); } } return (FALSE); } static int HasFile(char *Dir, const char *Filename, const char *App) { int DirLen = strlen(Dir); tackon(Dir, Filename); if (fexists(Dir)) return (TRUE); if (App) { AddAppendix(Dir, App); if (fexists(Dir)) return (TRUE); } Dir[DirLen] = 0; return (FALSE); } /* * If Filename is contains a directory component, then add a fully qualified * directory to the TeXInputs WordList. * * I'm not sure how it will work with some Windows paths, * e.g. C:path\to\file.tex since it doesn't really understand the leading C: * But I'm not sure it would even work with a path like that, and I have no * way to test it. * * Behaviour somewhat controlled by the macros SLASH and DIRCHARS in the * OpSys.h file. * */ void AddDirectoryFromRelativeFile(const char * Filename, struct WordList *TeXInputs) { if ( ! Filename ) return; /* There are no path delimiters, so it's just a file, return null */ if ( ! strstr( Filename, DIRCHARS ) ) return; char buf[BUFFER_SIZE]; if ( strchr(DIRCHARS,Filename[0]) ) { strcpy(buf,Filename); } else { getcwd(buf, BUFFER_SIZE); tackon(buf,Filename); } /* Keep up to the final SLASH -- that will be the directory. */ char * end = strrchr(buf,SLASH); *end = '\0'; InsertWord(buf,TeXInputs); } #if USE_RECURSE static int SearchFile(char *Dir, const char *Filename, const char *App) { struct stat *statbuf; struct dirent *de; DIR *dh; int DirLen = strlen(Dir); int Found = FALSE; DEBUG(("Searching %s for %s\n", Dir, Filename)); if (HasFile(Dir, Filename, App)) return (TRUE); else { if ((statbuf = malloc(sizeof(struct stat)))) { if ((dh = opendir(Dir))) { while (!Found && (de = readdir(dh))) { Dir[DirLen] = 0; if (strcmp(de->d_name, ".") && strcmp(de->d_name, "..")) { tackon(Dir, de->d_name); if (!stat(Dir, statbuf)) { if ((statbuf->st_mode & S_IFMT) == S_IFDIR) Found = SearchFile(Dir, Filename, App); } } } closedir(dh); } else PrintPrgErr(pmNoOpenDir, Dir); free(statbuf); } } return (Found); } #endif /* USE_RECURSE */ #if defined(HAVE_STAT) int IsRegFile(const char *Filename) { int Retval = FALSE; struct stat *statbuf; if ((statbuf = malloc(sizeof(struct stat)))) { if (!stat(Filename, statbuf)) { if ((statbuf->st_mode & S_IFMT) == S_IFREG) Retval = TRUE; } free(statbuf); } return Retval; } #else int IsRegFile(const char *Filename) { printf("WTF\n");return TRUE; } #endif chktex-1.7.9/install-sh000755 000767 000024 00000035776 14613045514 015661 0ustar00iandrusstaff000000 000000 #!/bin/sh # install - install a program, script, or datafile scriptversion=2020-11-14.01; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_mkdir= # Desired mode of installed file. mode=0755 # Create dirs (including intermediate dirs) using mode 755. # This is like GNU 'install' as of coreutils 8.32 (2020). mkdir_umask=22 backupsuffix= chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -p pass -p to $cpprog. -s $stripprog installed files. -S SUFFIX attempt to back up existing files, with suffix SUFFIX. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG By default, rm is invoked with -f; when overridden with RMPROG, it's up to you to specify -f if you want it. If -S is not specified, no backups are attempted. Email bug reports to bug-automake@gnu.org. Automake home page: https://www.gnu.org/software/automake/ " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -p) cpprog="$cpprog -p";; -s) stripcmd=$stripprog;; -S) backupsuffix="$2" shift;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? # Don't chown directories that already exist. if test $dstdir_status = 0; then chowncmd="" fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dstbase=`basename "$src"` case $dst in */) dst=$dst$dstbase;; *) dst=$dst/$dstbase;; esac dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi case $dstdir in */) dstdirslash=$dstdir;; *) dstdirslash=$dstdir/;; esac obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false # The $RANDOM variable is not portable (e.g., dash). Use it # here however when possible just to lower collision chance. tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap ' ret=$? rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null exit $ret ' 0 # Because "mkdir -p" follows existing symlinks and we likely work # directly in world-writeable /tmp, make sure that the '$tmpdir' # directory is successfully created first before we actually test # 'mkdir -p'. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi trap '' 0;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=${dstdirslash}_inst.$$_ rmtmp=${dstdirslash}_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && { test -z "$stripcmd" || { # Create $dsttmp read-write so that cp doesn't create it read-only, # which would cause strip to fail. if test -z "$doit"; then : >"$dsttmp" # No need to fork-exec 'touch'. else $doit touch "$dsttmp" fi } } && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # If $backupsuffix is set, and the file being installed # already exists, attempt a backup. Don't worry if it fails, # e.g., if mv doesn't support -f. if test -n "$backupsuffix" && test -f "$dst"; then $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null fi # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: chktex-1.7.9/configure.ac000644 000767 000024 00000012705 14613043276 016131 0ustar00iandrusstaff000000 000000 dnl dnl ChkTeX, configuration file. dnl Copyright (C) 1995-96 Jens T. Berger Thielemann dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. dnl dnl Contact the author at: dnl Jens Berger dnl Spektrumvn. 4 dnl N-0666 Oslo dnl Norway dnl E-mail: dnl dnl dnl Process this file with autoconf to produce a configure script. AC_INIT([ChkTeX],[1.7.9]) AC_SUBST(SCRIPTS) AC_SUBST(BUILT_SCRIPTS) AC_SUBST(CLEAN) CLEAN= AC_ARG_ENABLE(pcre,[ --enable-pcre: Use PCRE to allow regular expressions in user warnings. (Default: yes, if available).],, enable_pcre=yes) AC_ARG_ENABLE(posixre,[ --enable-posixre: Use POSIX extended regular expressions in user warnings. (Default: yes, unless using PCRE).],, enable_posixre=yes) AC_ARG_ENABLE(lacheck-replace,[ --enable-lacheck-replace: Installs a lacheck replacement. (Default: no).],, enable_lacheck_replace=no) AC_ARG_ENABLE(debug-info,[ --enable-debug-info: Compile in miscellaneous runtime debugging information. (Default: yes).],, enable_debug_info=yes) AC_ARG_ENABLE(coverage-testing,[ --enable-coverage-testing: Activate coverage testing with gcov. (Default: no)],, enable_coverage_testing=no) AC_MSG_CHECKING(whether lacheck replacement should be installed) if test "$enable_lacheck_replace" = "yes"; then SCRIPTS="$SCRIPTS lacheck" AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) fi AC_MSG_CHECKING(whether runtime debug info should be used) if test "$enable_debug_info" = "yes"; then AC_MSG_RESULT(yes) else AC_DEFINE(STRIP_DEBUG, 1, Strip debug info) AC_MSG_RESULT(no) fi AC_MSG_CHECKING(whether coverage testing is enabled) if test "$enable_coverage_testing" = "yes"; then AC_MSG_RESULT(yes) CFLAGS="${CFLAGS} -fprofile-arcs -ftest-coverage -O0" CLEAN="${CLEAN} \$(wildcard *.bb *.bbg *.da *.gcov)" else AC_MSG_RESULT(no) fi dnl Check compiler and flags AC_PROG_CC AX_CFLAGS_STRICT_PROTOTYPES VL_PROG_CC_WARNINGS dnl Checks for programs. AC_PROG_INSTALL AC_PROG_LN_S AC_PROG_MKDIR_P AC_PATH_PROGS(PERL5, perl5 perl, no, $PATH:/usr/bin:/usr/local/bin) if test "$PERL5" != no; then AC_MSG_CHECKING(whether perl is v5 or higher) if $PERL5 -e 'exit($] >= 5)'; then PERL5=no AC_MSG_RESULT(no) else AC_MSG_RESULT(yes) fi fi if test "$PERL5" != no; then BUILT_SCRIPTS="$BUILT_SCRIPTS deweb" SCRIPTS="$SCRIPTS chkweb" else AC_MSG_WARN(chkweb will not be installed since you do not have perl5.) fi AC_CHECK_PROGS(GROFF, 'groff -man -P-bu -Tlatin1' 'nroff -man', 'nroff -man') AC_PATH_PROG(PDFLATEX, pdflatex, no) AC_PATH_PROG(LATEX, latex, no) dnl if test "$LATEX" = no; then dnl AC_MSG_ERROR([No LaTeX on the system, cannot find latex program.]) dnl fi AC_PATH_PROG(DVIPS, dvips) AC_PATH_PROG(LYNX, lynx) AC_PATH_PROG(LATEX2HTML, latex2html) dnl Checks for libraries. AC_CHECK_LIB(termlib, tgetent) AC_CHECK_LIB(termcap, tgetent) AC_HEADER_DIRENT AC_CHECK_HEADERS(limits.h stat.h strings.h stdarg.h dnl sys/stat.h termcap.h termlib.h unistd.h) dnl Checks for typedefs, structures, and compiler characteristics. AC_C_CONST AC_C_INLINE AC_TYPE_SIZE_T AC_TYPE_UINT64_T dnl Checks for library functions. AC_FUNC_VPRINTF AC_CHECK_FUNCS(access closedir fileno isatty opendir readdir stat dnl strcasecmp strdup strlwr strtol) dnl Checks for declarations. AC_CHECK_DECLS([stpcpy]) dnl Check for PCRE regular expression support AC_MSG_CHECKING(whether PCRE regular expressions are enabled) AC_MSG_RESULT($enable_pcre) if test "$enable_pcre" = "yes"; then AC_CHECK_PROG(WITH_PCRE, pcre-config, yes, no) if test "$WITH_PCRE" = "yes"; then AC_DEFINE(HAVE_PCRE, 1, Whether PCRE can be used for user warnings.) CFLAGS="${CFLAGS} $(pcre-config --cflags-posix)" LDFLAGS="${LDFLAGS} $(pcre-config --libs-posix)" else AC_DEFINE(HAVE_PCRE, 0) AC_MSG_WARN(PCRE library not found.) fi else AC_DEFINE(HAVE_PCRE, 0) AC_MSG_WARN(PCRE regular expressions not enabled.) fi dnl Check for POSIX extended regular expression support AC_MSG_CHECKING(for POSIX extended regular expressions) AC_EGREP_CPP([yes], [#include #ifdef REG_EXTENDED yes # endif ], posix_ere=yes, posix_ere=no) AC_MSG_RESULT($posix_ere) if test "$WITH_PCRE" = "yes"; then AC_DEFINE(HAVE_POSIX_ERE, 0, Whether POSIX ERE can be used for user warnings.) else if test "$enable_posixre" = "yes"; then if test "$posix_ere" = "yes"; then AC_DEFINE(HAVE_POSIX_ERE, 1) else AC_DEFINE(HAVE_POSIX_ERE, 0) fi else AC_DEFINE(HAVE_POSIX_ERE, 0) AC_MSG_WARN(Regular expressions not enabled.) fi fi AC_CONFIG_HEADERS([config.h]) AC_CONFIG_FILES([stamp-h], [echo timestamp > stamp-h]) AC_CONFIG_FILES([Makefile deweb rmeheader ChkTeX.tex]) AC_OUTPUT chktex-1.7.9/chktex.1000644 000767 000024 00000006122 14613043276 015207 0ustar00iandrusstaff000000 000000 .TH chktex 1 "March 30, 2001" .AT 3 .SH NAME chktex \- finds typographic errors in LaTeX. .SH SYNOPSIS .B chktex .I [-hiqrW] [-v[0-...]] [-l ] [-[wemn] <[1-42]|all>] .I [-d[0-...]] [-p ] [-o ] [-[btxgI][0|1]] .B file1 file2 ... .SH DESCRIPTION .I chktex finds typographic errors in .I LaTeX . .SH OPTIONS .PP Miscellaneous options: .TP .B "-h --help" Print a help screen. .TP .B "-i --license" Show distribution information. .TP .B "-l --localrc" Read local .chktexrc formatted file. .TP .B "-d --debug" Debug information. Give it a number. .TP .B "-r --reset" Reset settings to default. .PP Muting warning messages: .TP .B "-w --warnon" Makes msg # given a warning and turns it on. .TP .B "-e --erroron" Makes msg # given an error and turns it on. .TP .B "-m --msgon" Makes msg # given a message and turns it on. .TP .B "-n --nowarn" Mutes msg # given. .TP .B "-L --nolinesupp" Do not allow per-line suppressions. These are TeX comments of the form .I "% chktex ##". .PP Output control flags: .TP .B "-v --verbosity" How errors are displayed. Default 1, 0=Less, 2=Fancy, 3=lacheck. .TP .B "-V --pipeverb" How errors are displayed when stdout != tty. Defaults to the same as -v. .TP .B "-s --splitchar" String used to split fields when doing -v0 .TP .B "-o --output" Redirect error report to a file. .TP .B "-q --quiet" Shuts up about version information. .TP .B "-p --pseudoname" Input file-name when reporting. .TP .B "-f --format" Format to use for output .PP Boolean switches (1 -> enables / 0 -> disables): .TP .B "-b --backup" Backup output file. .TP .B "-x --wipeverb" Ignore contents of `\\verb' commands. .TP .B "-g --globalrc" Read global .chktexrc file. .TP .B "-I --inputfiles" Execute \\input statements. .TP .B "-H --headererr" Show errors found in front of \\begin{document} .PP Miscellaneous switches: .TP .B "-W --version" Version information .PP If no LaTeX files are specified on the command line, we will read from stdin. For explanation of warning/error messages, please consult the main document /usr/share/doc/chktex/ChkTeX.dvi.gz. .SH DISTRIBUTION Copyright (C) 1996 Jens T. Berger Thielemann .PP This program is free software; you can redistribute it and/or modify it under the terms of the .I GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. .PP This program is distributed in the hope that it will be useful, but .B WITHOUT ANY WARRANTY; without even the implied warranty of .B MERCHANTABILITY or .B FITNESS FOR A PARTICULAR PURPOSE. See the .I GNU General Public License for more details. .PP You should have received a copy of the .B GNU General Public License along with this program; if not, write to the .I Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA .SH ENVIRONMENT No environment variables are used. .SH FILES None. .SH AUTHOR Jens T. Berger Thielemann, .I .PP This manual page was cobbled together by Clint Adams , based on the output of "chktex --help" and deweb(1). .SH "SEE ALSO" .B deweb(1), chkweb(1) chktex-1.7.9/ChkTeX.h000644 000767 000024 00000025311 14613043276 015137 0ustar00iandrusstaff000000 000000 /* * ChkTeX, header file for main program. * Copyright (C) 1995-96 Jens T. Berger Thielemann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * Contact the author at: * Jens Berger * Spektrumvn. 4 * N-0666 Oslo * Norway * E-mail: * * */ #ifndef CHKTEX_H #define CHKTEX_H 1 #if defined(HAVE_CONFIG_H) || defined(CONFIG_H_NAME) # ifndef CONFIG_H_NAME # define CONFIG_H_NAME "config.h" # endif # ifndef HAVE_CONFIG_H # define HAVE_CONFIG_H 1 # endif # include CONFIG_H_NAME #endif /* For TeX Live */ #ifdef KPATHSEA #include #endif #include #include #include #ifdef HAVE_STDARG_H # include #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 #include #include #ifdef HAVE_UNISTD_H # include #endif #ifdef HAVE_LIMITS_H # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #include "types.h" #ifndef LONG_MAX # define LONG_MAX (0x7fffffff) #endif #ifndef CHAR_BIT # define CHAR_BIT (8) #endif #include "FindErrs.h" #if defined(HAVE_FILENO) && defined(HAVE_ISATTY) # include #endif /* * Define aliases for preprocessor statements */ #if defined(__unix__) || defined(__unix) || defined(unix) #undef __unix__ #define __unix__ 1 #elif defined(__APPLE__) && defined(__MACH__) /* OS X should be considered a UNIX */ #undef __unix__ #define __unix__ 1 #elif defined(MSDOS) || defined(__MSDOS__) || defined(__msdos__) #undef __MSDOS__ #define __MSDOS__ 1 #endif /* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ /* * NOTE: All macros below should return FALSE (0) if the input * character is 0. * * The next macro should return TRUE if LaTeX (and you?) considers * the character `c' as a space, which should be detected when * we're checking whether commands are terminated by spaces. * * Note: If you wish to change this macro, you'll have to update * the main loop in FindErrs.c as well. */ #define LATEX_SPACE(c) (c > 0 && c <= ' ') /* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ #define betw(a,b,c) ((a < b) && (b < c)) #define within(a,b,c) ((a <= b) && (b <= c)) #ifndef min # define min(a,b) ((a)<=(b)?(a):(b)) #endif #ifndef max # define max(a,b) ((a)>(b)?(a):(b)) #endif #ifndef abs # define abs(a) (a>=0?a:(-a)) #endif #define LOOP(name, body) {{body} _end__##name:;} #define LAST(name) goto _end__##name #define NUMBRACKETS 6 #define NEWBUF(name,len) \ static char _ ## name [len + (WALLBYTES<<1)] = {0}; \ char *name = &_ ## name[WALLBYTES] #define INTFAULTMSG "INTERNAL FAULT OCCURED! PLEASE SUBMIT A BUG REPORT!\n" #define INTERNFAULT INTFAULTMSG #define BITDEF1(a) BIT_ ## a #define BITDEF2(a) FLG_ ## a = (1<'.")\ MSG(pmNoTermData, etErr, TRUE, 0,\ "Could not access the termcap data base.")\ MSG(pmNoTermDefd, etErr, TRUE, 0,\ "Terminal type `%s' is not defined.")\ MSG(pmNoRegExp, etWarn, TRUE, 0,\ "Regular expressions not compiled in. Please recompile.")\ MSG(pmNoCommon, etErr, TRUE, 0,\ "`%s' can't be a member of both `%s' and `%s'.") \ MSG(pmNoOpenDir, etWarn, TRUE, 0, \ "Could not open the directory `%s'.") \ MSG(pmNoDebugFlag, etWarn, TRUE, 0, \ "This version of doesn't support the -d flag. Please recompile.")\ MSG(pmNoRegexMem, etErr, TRUE, 0,\ "Unable to allocate regular expressions - no memory?\n")\ MSG(pmRegexCompileFailed, etWarn, TRUE, 0,\ "Compilation of regular expression %s failed with error %s.\n")\ MSG(pmRegexMatchingError, etErr, TRUE, 0,\ "PCRE matching error %d.\n") \ MSG(pmSuppTooHigh, etWarn, TRUE, 0,\ "Warning %d is numbered too high (max %d) and won't be suppressed.\n") \ MSG(pmLongLines, etWarn, TRUE, 0,\ "ChkTeX does not handle lines over %d bytes correctly. Some errors and line numbers may be wrong in this file.") \ MSG(pmTabExpands, etWarn, TRUE, 0,\ "ChkTeX could not fully expand tabs because the resulting line would be more than %d bytes. Some errors and line numbers may be wrong in this file.") \ MSG(pmCmdSpaceStyle, etWarn, TRUE, 0,\ "Illegal CmdSpaceStyle `%s' using `Ignore'.") #undef MSG #define MSG(num, type, inuse, ctxt, text) num, enum PrgErrNum { PRGMSGS pmMaxFault }; #undef MSG extern struct ErrMsg PrgMsgs[pmMaxFault + 1]; struct ErrInfo { char *Data; char *LineBuf; char *File; unsigned long Line, Column, ErrLen; enum { efNone = 0x00, efNoItal = 0x01, efItal = 0x02, efNoMath = 0x04, efMath = 0x08 } Flags; }; extern char *ReadBuffer; extern char *CmdBuffer; extern char *TmpBuffer; extern const char BrOrder[NUMBRACKETS + 1]; extern unsigned long Brackets[NUMBRACKETS]; extern FILE *OutputFile, *InputFile; /* We include semicolons on all but the last so that we can include a * semicolon where it's called. This helps with indentation at the * calling location. It also means that DEF must never have a * semicolon. The reason for the care is that isolated semicolons * have been known to break some compilers. */ /* See also RESOURCE_INFO where the same trick doesn't work, and we * cannot include semicolons at the calling site, regardless of * indentation concerns. */ #define OPTION_DEFAULTS \ DEF(int, GlobalRC, TRUE); \ DEF(int, WipeVerb, TRUE); \ DEF(int, BackupOut, TRUE); \ DEF(int, Quiet, FALSE); \ DEF(int, LicenseOnly, FALSE); \ DEF(int, UsingStdIn, FALSE); \ DEF(int, InputFiles, TRUE); \ DEF(int, HeadErrOut, TRUE); \ DEF(const char *, OutputName, ""); \ DEF(const char *, PseudoInName, NULL); \ DEF(char *, OutputFormat, VerbNormal); \ DEF(char *, PipeOutputFormat, NULL); \ DEF(const char *, Delimit, ":"); \ DEF(long, DebugLevel, 0); \ DEF(int, NoLineSupp, FALSE) #define STATE_VARS \ DEF(enum ItState, ItState, itOff); /* Are we doing italics? */ \ DEF(int, AtLetter, FALSE); /* Whether `@' is a letter or not. */ \ DEF(int, InHeader, TRUE); /* Whether we're in the header */ \ DEF(int, VerbMode, FALSE); /* Whether we're in complete ignore-mode */ \ DEF(const char *, VerbStr, ""); /* String we'll terminate verbmode upon */ \ DEF(unsigned long, ErrPrint, 0); /* # errors printed */ \ DEF(unsigned long, WarnPrint, 0); /* # warnings printed */ \ DEF(unsigned long, UserSupp, 0); /* # user suppressed warnings */ \ DEF(unsigned long, LineSupp, 0); /* # warnings suppressed on a single line */ #define DEF(type, name, value) extern type name OPTION_DEFAULTS; STATE_VARS; #undef DEF extern struct Stack CharStack, InputStack, EnvStack, ConTeXtStack; extern struct Stack FileSuppStack, UserFileSuppStack; extern struct Stack MathModeStack; enum Quote { quLogic, quTrad }; extern enum Quote Quote; extern int StdInTTY, StdOutTTY, UsingStdIn; enum CmdSpace { csIgnore = 0, csInterWord = 0x1, csInterSentence = 0x2, csBoth = 0x3, /* both bits set */ }; extern enum CmdSpace CmdSpace; int main(int argc, char **argv); void PrintPrgErr(enum PrgErrNum, ...); void ErrPrintf(const char *fmt, ...); extern char *PrgName; #endif /* CHKTEX_H */ chktex-1.7.9/Resource.c000644 000767 000024 00000035763 14613043276 015607 0ustar00iandrusstaff000000 000000 /* * ChkTeX, resource file reader. * Copyright (C) 1995-96 Jens T. Berger Thielemann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * Contact the author at: * Jens Berger * Spektrumvn. 4 * N-0666 Oslo * Norway * E-mail: * * */ #include "ChkTeX.h" #include "OpSys.h" #include "Utility.h" #include "Resource.h" #define LNEMPTY(a) struct WordList a = {0, 1, {0}, {0}}; #define LIST(a) struct WordList a = {0, 0, {0}, {0}}; #define LCASE(a) LIST(a) LIST(a ## Case) #define KEY(a,def) const char *a = def; RESOURCE_INFO #undef KEY #undef LCASE #undef LNEMPTY #undef LIST struct KeyWord { const char *Name; const char **String; /* Keyword = item */ struct WordList *List, /* Case-sensitive strings */ *CaseList; /* Case-insensitive strings */ }; #define LNEMPTY LIST #define LIST(name) {#name, NULL, &name, NULL}, #define LCASE(name) {#name, NULL, &name, &name ## Case}, #define KEY(name,def) {#name, &name, NULL, NULL}, struct KeyWord Keys[] = { RESOURCE_INFO {NULL, NULL, NULL, NULL} }; #undef KEY #undef LCASE #undef LNEMPTY #undef LIST /***************************** RESOURCE HANDLING **************************/ /* We don't include a trailing semicolon here, so that we can add it * at the calling site, thereby preserving proper indentation. Double * semicolons are undesirable since they have been known to break some * compilers. */ #define TOKENBITS(name) enum name { \ BIT(Eof), /* End-of-file */ \ BIT(Open), /* { */ \ BIT(Close), /* } */ \ BIT(BrOpen), /* [ */ \ BIT(BrClose), /* ] */ \ BIT(Equal), /* = */ \ BIT(Word), /* Keyword */ \ BIT(Item) /* List item */ \ } #undef BIT #define BIT BITDEF1 TOKENBITS(Token_BIT); #undef BIT #define BIT BITDEF2 TOKENBITS(Token); static enum Token Expect; static unsigned long RsrcLine; static enum Token ReadWord(char *, FILE *, char *(fgetsfun)(char *, int, FILE *)); static char MapChars(char **String); /* * Parses the contents of a resource file. * * Format: * Keyword { item1 item2 ... } [ item1 item2 ... ] * Keyword [ item1 item2 ... ] { item1 item2 ... } * Keyword = { item1 item2 ... } * Keyword = [ item1 item2 ... ] * Keyword = item * * Returns whether the attempt was a successful one. */ int ProcessRC(FILE *fh, const char *Filename, char *(fgetsfun)(char *, int, FILE *)) { const char *String = NULL; int Success = TRUE; enum Token Token; unsigned long Counter; struct KeyWord *CurWord = NULL; /* Interpret incoming words as ... */ enum { whList, /* List elements */ whCaseList, /* Case insensitive list elements */ whEqual, /* Solo elements */ whNone /* List items not accepted */ } What = whNone; RsrcLine = 0; Expect = FLG_Word | FLG_Eof; do { Token = ReadWord(ReadBuffer, fh, fgetsfun); if (!(Expect & Token)) { switch (Token) { case FLG_Item: String = "item"; break; case FLG_Word: String = "word"; break; case FLG_Equal: String = "`='"; break; case FLG_Open: String = "`{'"; break; case FLG_Close: String = "`}'"; break; case FLG_BrOpen: String = "`['"; break; case FLG_BrClose: String = "`]'"; break; case FLG_Eof: String = "EOF"; break; } PrintPrgErr(pmFaultFmt, Filename, RsrcLine, String); Success = FALSE; Token = FLG_Eof; } switch (Token) { case FLG_Word: for (Counter = 0; Keys[Counter].Name; Counter++) { if (!strcasecmp(ReadBuffer, Keys[Counter].Name)) { CurWord = &Keys[Counter]; Expect = (CurWord->List ? FLG_Open : 0) | (CurWord->CaseList ? FLG_BrOpen : 0) | FLG_Equal; break; } } if (!Keys[Counter].Name) { PrintPrgErr(pmKeyWord, ReadBuffer, Filename); Success = FALSE; Token = FLG_Eof; } break; case FLG_Item: switch (What) { case whEqual: if (!(*(CurWord->String) = strdup(ReadBuffer))) { PrintPrgErr(pmStrDupErr); Token = FLG_Eof; Success = FALSE; } What = whNone; Expect = FLG_Word | FLG_Eof; break; case whCaseList: if (!InsertWord(ReadBuffer, CurWord->CaseList)) { Token = FLG_Eof; Success = FALSE; } break; case whList: if (!InsertWord(ReadBuffer, CurWord->List)) { Token = FLG_Eof; Success = FALSE; } break; case whNone: PrintPrgErr(pmAssert); } break; case FLG_Equal: What = whEqual; Expect = (CurWord->List ? FLG_Open : 0) | (CurWord->CaseList ? FLG_BrOpen : 0) | (CurWord->String ? FLG_Item : 0); break; case FLG_BrOpen: if (What == whEqual) ClearWord(CurWord->CaseList); What = whCaseList; Expect = FLG_Item | FLG_BrClose; break; case FLG_Open: if (What == whEqual) ClearWord(CurWord->List); What = whList; Expect = FLG_Item | FLG_Close; break; case FLG_BrClose: case FLG_Close: Expect = (CurWord->List ? FLG_Open : 0) | (CurWord->CaseList ? FLG_BrOpen : 0) | FLG_Equal | FLG_Word | FLG_Eof; What = whNone; break; case FLG_Eof: break; } } while (Token != FLG_Eof); return (Success); } /* * Opens a file and passes to ProcessRC(). */ int ReadRC(const char *Filename) { int Success = FALSE; FILE *fh; if ((fh = fopen(Filename, "r"))) { Success = ProcessRC(fh, Filename, &fgets); fclose(fh); } else PrintPrgErr(pmRsrcOpen, Filename); return (Success); } const char *FGETS_TMP = NULL; char *fgets_from_string(char *out, int size, FILE *fh) { char *res; if (FGETS_TMP == NULL) return NULL; res = strncpy(out, FGETS_TMP, size - 1); if (size - 1 < strlen(FGETS_TMP)) { /* It wasn't all read, so null terminate it, and get ready for * next time. */ res[size] = '\0'; FGETS_TMP = FGETS_TMP + (size - 1); } else { /* We're done, so signal that */ FGETS_TMP = NULL; } return res; } /* * Opens a file and passes to ProcessRC(). */ int ReadRCFromCmdLine(const char *CmdLineArg) { if (!CmdLineArg) return FALSE; FGETS_TMP = CmdLineArg; return ProcessRC(NULL, "CommandLineArg", &fgets_from_string); } /* * Reads a token from the `.chktexrc' file; if the token is * FLG_Item or FLG_Word, Buffer will contain the plaintext of the * token. If not, the contents are undefined. */ static enum Token ReadWord(char *Buffer, FILE *fh, char *(fgetsfun)(char *, int, FILE *)) { static char *String = NULL; static char StatBuf[BUFFER_SIZE]; enum Token Retval = FLG_Eof; unsigned short Chr; char *Ptr; int OnceMore = TRUE, Cont = TRUE; if (Buffer) { do { if (!(String && *String)) { if ((fgetsfun)(StatBuf, BUFFER_SIZE - 1, fh)) String = strip(StatBuf, STRP_RGT); RsrcLine++; } Ptr = Buffer; if (String && (String = strip(String, STRP_LFT))) { switch (Chr = *String) { case 0: case CMNT: String = NULL; break; case QUOTE: /* Quoted argument */ Cont = TRUE; String++; while (Cont) { switch (Chr = *String++) { case 0: case QUOTE: Cont = FALSE; break; case ESCAPE: if (!(Chr = MapChars(&String))) break; /* FALLTHRU */ default: *Ptr++ = Chr; } } *Ptr = 0; Retval = FLG_Item; OnceMore = FALSE; break; #define DONEKEY (FLG_Open | FLG_Equal | FLG_BrOpen) #define DONELIST (FLG_Close | FLG_BrClose) #define TOKEN(c, ctxt, tk) case c: if(Expect & (ctxt)) Retval = tk; LAST(token) LOOP(token, TOKEN('{', DONEKEY, FLG_Open); TOKEN('[', DONEKEY, FLG_BrOpen); TOKEN('=', DONEKEY, FLG_Equal); TOKEN(']', DONELIST, FLG_BrClose); TOKEN('}', DONELIST, FLG_Close); ) if (Retval != FLG_Eof) { OnceMore = FALSE; String++; break; } /* FALLTHRU */ default: /* Non-quoted argument */ OnceMore = FALSE; if (Expect & FLG_Word) { while (Cont) { Chr = *String++; if (isalpha((unsigned char)Chr)) *Ptr++ = Chr; else Cont = FALSE; } String--; Retval = FLG_Word; } else /* Expect & FLG_Item */ { while (Cont) { switch (Chr = *String++) { case CMNT: case 0: String = NULL; Cont = FALSE; break; case ESCAPE: if (!(Chr = MapChars(&String))) break; *Ptr++ = Chr; break; default: if (!isspace((unsigned char)Chr)) *Ptr++ = Chr; else Cont = FALSE; } } Retval = FLG_Item; } if (!(Buffer[0])) { PrintPrgErr(pmEmptyToken); if (*String) String++; } *Ptr = 0; break; } } else OnceMore = FALSE; } while (OnceMore); } return (Retval); } /* * Translates escape codes. Give it a pointer to the char after the * escape char, and we'll return what it maps to. */ #define MAP(a,b) case a: Tmp = b; break; static char MapChars(char **String) { int Chr, Tmp = 0; unsigned short Cnt; Chr = *((char *) (*String)++); switch (tolower((unsigned char)Chr)) { MAP(QUOTE, QUOTE); MAP(ESCAPE, ESCAPE); MAP(CMNT, CMNT); MAP('n', '\n'); MAP('r', '\r'); MAP('b', '\b'); MAP('t', '\t'); MAP('f', '\f'); MAP('{', '{'); MAP('}', '}'); MAP('[', '['); MAP(']', ']'); MAP('=', '='); MAP(' ', ' '); case 'x': Tmp = 0; for (Cnt = 0; Cnt < 2; Cnt++) { Chr = *((*String)++); if (isxdigit((unsigned char)Chr)) { Chr = toupper((unsigned char)Chr); Tmp = (Tmp << 4) + Chr; if (isdigit((unsigned char)Chr)) Tmp -= '0'; else Tmp -= 'A' - 10; } else { if (Chr) { PrintPrgErr(pmNotPSDigit, Chr, "hex"); Tmp = 0; } break; } } break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': Tmp = Chr - '0'; for (Cnt = 0; Cnt < 2; Cnt++) { Chr = *((*String)++); if (within('0', Chr, '7')) Tmp = (Tmp * 8) + Chr - '0'; else { if (Chr) { PrintPrgErr(pmNotPSDigit, Chr, "octal"); Tmp = 0; } break; } } break; case 'd': for (Cnt = 0; Cnt < 3; Cnt++) { if (isdigit((unsigned char)(Chr = *((*String)++)))) Tmp = (Tmp * 10) + Chr - '0'; else { if (Chr) { PrintPrgErr(pmNotPSDigit, Chr, ""); Tmp = 0; } break; } } break; default: PrintPrgErr(pmEscCode, ESCAPE, Chr); } return (Tmp); } chktex-1.7.9/FindErrs.h000644 000767 000024 00000014763 14613043276 015536 0ustar00iandrusstaff000000 000000 /* * ChkTeX, header file for main program. * Copyright (C) 1995-96 Jens T. Berger Thielemann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * Contact the author at: * Jens Berger * Spektrumvn. 4 * N-0666 Oslo * Norway * E-mail: * * */ #ifndef FINDERRS_H #define FINDERRS_H #include "ChkTeX.h" #undef ERRMSGS #undef MSG #define ERRMSGS \ MSG(emMinFault, etErr, iuOK, ctNone,\ INTERNFAULT)\ MSG(emSpaceTerm, etWarn, iuOK, ctOutMath,\ "Command terminated with space.")\ MSG(emNBSpace, etWarn, iuOK, ctNone,\ "Non-breaking space (`~') should have been used.")\ MSG(emEnclosePar, etWarn, iuOK, ctInMath,\ "You should enclose the previous parenthesis with `{}\'.")\ MSG(emItInNoIt, etWarn, iuOK, ctNone,\ "Italic correction (`\\/') found in non-italic buffer.")\ MSG(emItDup, etWarn, iuOK, ctNone,\ "Italic correction (`\\/') found more than once.")\ MSG(emNoItFound, etWarn, iuOK, ctNone,\ "No italic correction (`\\/') found.")\ MSG(emAccent, etWarn, iuOK, ctNone,\ "Accent command `%s' needs use of `\\%c%s'.")\ MSG(emWrongDash, etWarn, iuOK, ctOutMath,\ "Wrong length of dash may have been used.")\ MSG(emExpectC, etWarn, iuOK, ctNone,\ "`%s' expected, found `%s'.")\ MSG(emSoloC, etWarn, iuOK, ctNone,\ "Solo `%s' found.")\ MSG(emEllipsis, etWarn, iuOK, ctNone,\ "You should use %s to achieve an ellipsis.")\ MSG(emInterWord, etWarn, iuOK, ctOutMath,\ "Interword spacing (`\\ ') should perhaps be used.")\ MSG(emInterSent, etWarn, iuOK, ctOutMath,\ "Intersentence spacing (`\\@') should perhaps be used.")\ MSG(emNoArgFound, etErr, iuOK, ctNone,\ "Could not find argument for command.")\ MSG(emNoMatchC, etWarn, iuOK, ctOutMath,\ "No match found for `%s'.")\ MSG(emMathStillOn, etWarn, iuOK, ctNone,\ "Mathmode still on at end of LaTeX file.")\ MSG(emNoMatchCC, etWarn, iuOK, ctNone,\ "Number of `%c' doesn't match the number of `%c'!")\ MSG(emUseQuoteLiga, etWarn, iuOK, ctNone,\ "Use either `` or '' as an alternative to `\"'.")\ MSG(emUseOtherQuote, etWarn, iuNotSys, ctNone,\ "Use \"'\" (ASCII 39) instead of \"\xB4\" (ASCII 180).")\ MSG(emUserWarn, etWarn, iuOK, ctNone,\ "User-specified pattern found: %s.")\ MSG(emNotIntended, etWarn, iuNotSys, ctNone,\ "This command might not be intended.")\ MSG(emComment, etMsg, iuNotSys, ctNone,\ "Comment displayed.")\ MSG(emThreeQuotes, etWarn, iuOK, ctNone,\ "Either %c\\,%c%c or %c%c\\,%c will look better.")\ MSG(emFalsePage, etWarn, iuOK, ctOutMath,\ "Delete this space to maintain correct pagereferences.")\ MSG(emEmbrace, etWarn, iuOK, ctInMath,\ "You might wish to put this between a pair of `{}'")\ MSG(emSpacePunct, etWarn, iuOK, ctOutMath,\ "You ought to remove spaces in front of punctuation.")\ MSG(emNoCmdExec, etWarn, iuOK, ctNone,\ "Could not execute LaTeX command.")\ MSG(emItPunct, etWarn, iuOK, ctNone,\ "Don't use \\/ in front of small punctuation.")\ MSG(emUseTimes, etWarn, iuOK, ctNone,\ "$\\times$ may look prettier here.")\ MSG(emMultiSpace, etWarn, iuNotSys, ctOutMath,\ "Multiple spaces detected in input.")\ MSG(emIgnoreText, etWarn, iuOK, ctNone,\ "This text may be ignored.")\ MSG(emBeginQ, etWarn, iuOK, ctOutMath,\ "Use ` to begin quotation, not '.")\ MSG(emEndQ, etWarn, iuOK, ctOutMath,\ "Use ' to end quotation, not `.")\ MSG(emQuoteMix, etWarn, iuOK, ctNone,\ "Don't mix quotes.")\ MSG(emWordCommand, etWarn, iuOK, ctInMath,\ "You should perhaps use `\\%s' instead.")\ MSG(emSpaceParen, etWarn, iuOK, ctOutMath,\ "You should put a space %s parenthesis.")\ MSG(emNoSpaceParen, etWarn, iuOK, ctOutMath,\ "You should avoid spaces %s parenthesis.")\ MSG(emQuoteStyle, etWarn, iuOK, ctOutMath,\ "You should not use punctuation %s quotes.")\ MSG(emDblSpace, etWarn, iuOK, ctOutMath,\ "Double space found.")\ MSG(emPunctMath, etWarn, iuOK, ctNone,\ "You should put punctuation %s math mode.")\ MSG(emTeXPrim, etWarn, iuNotSys, ctNone,\ "You ought to not use primitive TeX in LaTeX code.")\ MSG(emRemPSSpace, etWarn, iuOK, ctOutMath,\ "You should remove spaces in front of `%s'") \ MSG(emNoCharMean, etWarn, iuOK, ctNone,\ "`%s' is normally not followed by `%c'.")\ MSG(emUserWarnRegex, etWarn, iuOK, ctNone,\ "User Regex: %.*s.") \ MSG(emDisplayMath, etWarn, iuOK, ctOutMath,\ "Use \\[ ... \\] instead of $$ ... $$.")\ MSG(emInlineMath, etWarn, iuNotSys, ctOutMath,\ "Use \\( ... \\) instead of $ ... $.")\ MSG(emExpectConTeXt, etWarn, iuOK, ctNone,\ "`%s' expected, found `%s' (ConTeXt).")\ MSG(emNoMatchConTeXt, etWarn, iuOK, ctNone,\ "No match found for `%s' (ConTeXt).") \ MSG(emMathModeConfusion, etWarn, iuOK, ctNone,\ "Expected math mode to be %s here.") #undef MSG #define MSG(num, type, inuse, ctxt, text) num, enum ErrNum { ERRMSGS emMaxFault }; #undef MSG enum Context { ctNone = 0x00, ctInMath = 0x01, ctOutMath = 0x02, ctInHead = 0x04, ctOutHead = 0x08 }; struct ErrMsg { enum ErrNum Number; enum { etMsg, etWarn, etErr } Type; enum { iuNotSys, iuNotUser, iuOK } InUse; /* Requirements posed upon environment */ enum Context Context; const char *Message; }; enum ItState { itOff, itOn, itCorrected }; enum DotLevel { dtUnknown = 0x0, dtCDots = 0x1, dtLDots = 0x2, dtDots = 0x4 }; extern struct ErrMsg LaTeXMsgs[emMaxFault + 1]; extern char *OutputFormat; int CheckSilentRegex(void); int FindErr(const char *, const unsigned long); void PrintError(const enum ErrNum, const char *, const char *, const long, const long, const long, ...); void PrintStatus(unsigned long Lines); #endif /* FINDERRS */ chktex-1.7.9/configure000755 000767 000024 00000577011 14613045515 015556 0ustar00iandrusstaff000000 000000 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.72 for ChkTeX 1.7.9. # # # Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation, # Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in #( e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case e in #( e) case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ) then : else case e in #( e) exitcode=1; echo positional parameters were not saved. ;; esac fi test x\$exitcode = x0 || exit 1 blah=\$(echo \$(echo blah)) test x\"\$blah\" = xblah || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null then : as_have_required=yes else case e in #( e) as_have_required=no ;; esac fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : else case e in #( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$as_shell as_have_required=yes if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null then : break 2 fi fi done;; esac as_found=false done IFS=$as_save_IFS if $as_found then : else case e in #( e) if { test -f "$SHELL" || test -f "$SHELL.exe"; } && as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$SHELL as_have_required=yes fi ;; esac fi if test "x$CONFIG_SHELL" != x then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno then : printf "%s\n" "$0: This script requires a shell more modern than all" printf "%s\n" "$0: the shells that I found on your system." if test ${ZSH_VERSION+y} ; then printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else printf "%s\n" "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi ;; esac fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in #( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in #( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' t clear :clear s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='ChkTeX' PACKAGE_TARNAME='chktex' PACKAGE_VERSION='1.7.9' PACKAGE_STRING='ChkTeX 1.7.9' PACKAGE_BUGREPORT='' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_STDIO_H # include #endif #ifdef HAVE_STDLIB_H # include #endif #ifdef HAVE_STRING_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_c_list= ac_func_c_list= ac_subst_vars='LTLIBOBJS LIBOBJS CPP WITH_PCRE LATEX2HTML LYNX DVIPS LATEX PDFLATEX GROFF PERL5 MKDIR_P LN_S INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC CLEAN BUILT_SCRIPTS SCRIPTS target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_pcre enable_posixre enable_lacheck_replace enable_debug_info enable_coverage_testing ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: '$ac_option' Try '$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: '$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: '$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but 'cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF 'configure' configures ChkTeX 1.7.9 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print 'checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for '--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or '..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, 'make install' will install all the files in '$ac_default_prefix/bin', '$ac_default_prefix/lib' etc. You can specify an installation prefix other than '$ac_default_prefix' using '--prefix', for instance '--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/chktex] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of ChkTeX 1.7.9:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-pcre: Use PCRE to allow regular expressions in user warnings. (Default: yes, if available). --enable-posixre: Use POSIX extended regular expressions in user warnings. (Default: yes, unless using PCRE). --enable-lacheck-replace: Installs a lacheck replacement. (Default: no). --enable-debug-info: Compile in miscellaneous runtime debugging information. (Default: yes). --enable-coverage-testing: Activate coverage testing with gcov. (Default: no) Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by 'configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for configure.gnu first; this name is used for a wrapper for # Metaconfig's "Configure" on case-insensitive file systems. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF ChkTeX configure 1.7.9 generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext } then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$3=yes" else case e in #( e) eval "$3=no" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else case e in #( e) eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in #( e) eval "$3=yes" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_find_uintX_t LINENO BITS VAR # ------------------------------------ # Finds an unsigned integer type with width BITS, setting cache variable VAR # accordingly. ac_fn_c_find_uintX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 printf %s "checking for uint$2_t... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else case e in #( e) eval "$3=no" # Order is important - never check a type that is potentially smaller # than half of the expected target width. for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \ 'unsigned long long int' 'unsigned short int' 'unsigned char'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main (void) { static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : case $ac_type in #( uint$2_t) : eval "$3=yes" ;; #( *) : eval "$3=\$ac_type" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext if eval test \"x\$"$3"\" = x"no" then : else case e in #( e) break ;; esac fi done ;; esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_find_uintX_t # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (void); below. */ #include #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (void); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main (void) { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : eval "$3=yes" else case e in #( e) eval "$3=no" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_check_decl LINENO SYMBOL VAR INCLUDES EXTRA-OPTIONS FLAG-VAR # ------------------------------------------------------------------ # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR # accordingly. Pass EXTRA-OPTIONS to the compiler, using FLAG-VAR. ac_fn_check_decl () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack as_decl_name=`echo $2|sed 's/ *(.*//'` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 printf %s "checking whether $as_decl_name is declared... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else case e in #( e) as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` eval ac_save_FLAGS=\$$6 as_fn_append $6 " $5" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { #ifndef $as_decl_name #ifdef __cplusplus (void) $as_decl_use; #else (void) $as_decl_name; #endif #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$3=yes" else case e in #( e) eval "$3=no" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext eval $6=\$ac_save_FLAGS ;; esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_check_decl # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err } then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp ac_configure_args_raw= for ac_arg do case $ac_arg in *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_configure_args_raw " '$ac_arg'" done case $ac_configure_args_raw in *$as_nl*) ac_safe_unquote= ;; *) ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. ac_unsafe_a="$ac_unsafe_z#~" ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; esac cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by ChkTeX $as_me 1.7.9, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac printf "%s\n" "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Sanitize IFS. IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo printf "%s\n" "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo printf "%s\n" "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then printf "%s\n" "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then printf "%s\n" "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && printf "%s\n" "$as_me: caught signal $ac_signal" printf "%s\n" "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi for ac_site_file in $ac_site_files do case $ac_site_file in #( */*) : ;; #( *) : ac_site_file=./$ac_site_file ;; esac if test -f "$ac_site_file" && test -r "$ac_site_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See 'config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 printf "%s\n" "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Test code for whether the C compiler supports C89 (global declarations) ac_c_conftest_c89_globals=' /* Does the compiler advertise C89 conformance? Do not test the value of __STDC__, because some compilers set it to 0 while being otherwise adequately conformant. */ #if !defined __STDC__ # error "Compiler does not advertise C89 conformance" #endif #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ struct buf { int x; }; struct buf * (*rcsopen) (struct buf *, struct stat *, int); static char *e (char **p, int i) { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* C89 style stringification. */ #define noexpand_stringify(a) #a const char *stringified = noexpand_stringify(arbitrary+token=sequence); /* C89 style token pasting. Exercises some of the corner cases that e.g. old MSVC gets wrong, but not very hard. */ #define noexpand_concat(a,b) a##b #define expand_concat(a,b) noexpand_concat(a,b) extern int vA; extern int vbee; #define aye A #define bee B int *pvA = &expand_concat(v,aye); int *pvbee = &noexpand_concat(v,bee); /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not \xHH hex character constants. These do not provoke an error unfortunately, instead are silently treated as an "x". The following induces an error, until -std is added to get proper ANSI mode. Curiously \x00 != x always comes out true, for an array size at least. It is necessary to write \x00 == 0 to get something that is true only with -std. */ int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) '\''x'\'' int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), int, int);' # Test code for whether the C compiler supports C89 (body of main). ac_c_conftest_c89_main=' ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); ' # Test code for whether the C compiler supports C99 (global declarations) ac_c_conftest_c99_globals=' /* Does the compiler advertise C99 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L # error "Compiler does not advertise C99 conformance" #endif // See if C++-style comments work. #include extern int puts (const char *); extern int printf (const char *, ...); extern int dprintf (int, const char *, ...); extern void *malloc (size_t); extern void free (void *); // Check varargs macros. These examples are taken from C99 6.10.3.5. // dprintf is used instead of fprintf to avoid needing to declare // FILE and stderr. #define debug(...) dprintf (2, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK #error "your preprocessor is broken" #endif #if BIG_OK #else #error "your preprocessor is broken" #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) continue; return 0; } // Check varargs and va_copy. static bool test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str = ""; int number = 0; float fnumber = 0; while (*format) { switch (*format++) { case '\''s'\'': // string str = va_arg (args_copy, const char *); break; case '\''d'\'': // int number = va_arg (args_copy, int); break; case '\''f'\'': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); return *str && number && fnumber; } ' # Test code for whether the C compiler supports C99 (body of main). ac_c_conftest_c99_main=' // Check bool. _Bool success = false; success |= (argc != 0); // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Work around memory leak warnings. free (ia); // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[0] = argv[0][0]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' || dynamic_array[ni.number - 1] != 543); ' # Test code for whether the C compiler supports C11 (global declarations) ac_c_conftest_c11_globals=' /* Does the compiler advertise C11 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L # error "Compiler does not advertise C11 conformance" #endif // Check _Alignas. char _Alignas (double) aligned_as_double; char _Alignas (0) no_special_alignment; extern char aligned_as_int; char _Alignas (0) _Alignas (int) aligned_as_int; // Check _Alignof. enum { int_alignment = _Alignof (int), int_array_alignment = _Alignof (int[100]), char_alignment = _Alignof (char) }; _Static_assert (0 < -_Alignof (int), "_Alignof is signed"); // Check _Noreturn. int _Noreturn does_not_return (void) { for (;;) continue; } // Check _Static_assert. struct test_static_assert { int x; _Static_assert (sizeof (int) <= sizeof (long int), "_Static_assert does not work in struct"); long int y; }; // Check UTF-8 literals. #define u8 syntax error! char const utf8_literal[] = u8"happens to be ASCII" "another string"; // Check duplicate typedefs. typedef long *long_ptr; typedef long int *long_ptr; typedef long_ptr long_ptr; // Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. struct anonymous { union { struct { int i; int j; }; struct { int k; long int l; } w; }; int m; } v1; ' # Test code for whether the C compiler supports C11 (body of main). ac_c_conftest_c11_main=' _Static_assert ((offsetof (struct anonymous, i) == offsetof (struct anonymous, w.k)), "Anonymous union alignment botch"); v1.i = 2; v1.w.k = 5; ok |= v1.i != 5; ' # Test code for whether the C compiler supports C11 (complete). ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} ${ac_c_conftest_c11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} ${ac_c_conftest_c11_main} return ok; } " # Test code for whether the C compiler supports C99 (complete). ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} return ok; } " # Test code for whether the C compiler supports C89 (complete). ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} return ok; } " as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" as_fn_append ac_func_c_list " vprintf HAVE_VPRINTF" # Auxiliary files required by this configure script. ac_aux_files="install-sh" # Locations in which to look for auxiliary files. ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.." # Search for a directory containing all of the required auxiliary files, # $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. # If we don't find one directory that contains all the files we need, # we report the set of missing files from the *first* directory in # $ac_aux_dir_candidates and give up. ac_missing_aux_files="" ac_first_candidate=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in $ac_aux_dir_candidates do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 ac_aux_dir_found=yes ac_install_sh= for ac_aux in $ac_aux_files do # As a special case, if "install-sh" is required, that requirement # can be satisfied by any of "install-sh", "install.sh", or "shtool", # and $ac_install_sh is set appropriately for whichever one is found. if test x"$ac_aux" = x"install-sh" then if test -f "${as_dir}install-sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 ac_install_sh="${as_dir}install-sh -c" elif test -f "${as_dir}install.sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 ac_install_sh="${as_dir}install.sh -c" elif test -f "${as_dir}shtool"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 ac_install_sh="${as_dir}shtool install -c" else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} install-sh" else break fi fi else if test -f "${as_dir}${ac_aux}"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" else break fi fi fi done if test "$ac_aux_dir_found" = yes; then ac_aux_dir="$as_dir" break fi ac_first_candidate=false as_found=false done IFS=$as_save_IFS if $as_found then : else case e in #( e) as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 ;; esac fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. if test -f "${ac_aux_dir}config.guess"; then ac_config_guess="$SHELL ${ac_aux_dir}config.guess" fi if test -f "${ac_aux_dir}config.sub"; then ac_config_sub="$SHELL ${ac_aux_dir}config.sub" fi if test -f "$ac_aux_dir/configure"; then ac_configure="$SHELL ${ac_aux_dir}configure" fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was not set in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' has changed since the previous run:" >&5 printf "%s\n" "$as_me: error: '$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&5 printf "%s\n" "$as_me: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: '$ac_old_val'" >&5 printf "%s\n" "$as_me: former value: '$ac_old_val'" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: '$ac_new_val'" >&5 printf "%s\n" "$as_me: current value: '$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run '${MAKE-make} distclean' and/or 'rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CLEAN= # Check whether --enable-pcre was given. if test ${enable_pcre+y} then : enableval=$enable_pcre; else case e in #( e) enable_pcre=yes ;; esac fi # Check whether --enable-posixre was given. if test ${enable_posixre+y} then : enableval=$enable_posixre; else case e in #( e) enable_posixre=yes ;; esac fi # Check whether --enable-lacheck-replace was given. if test ${enable_lacheck_replace+y} then : enableval=$enable_lacheck_replace; else case e in #( e) enable_lacheck_replace=no ;; esac fi # Check whether --enable-debug-info was given. if test ${enable_debug_info+y} then : enableval=$enable_debug_info; else case e in #( e) enable_debug_info=yes ;; esac fi # Check whether --enable-coverage-testing was given. if test ${enable_coverage_testing+y} then : enableval=$enable_coverage_testing; else case e in #( e) enable_coverage_testing=no ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether lacheck replacement should be installed" >&5 printf %s "checking whether lacheck replacement should be installed... " >&6; } if test "$enable_lacheck_replace" = "yes"; then SCRIPTS="$SCRIPTS lacheck" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether runtime debug info should be used" >&5 printf %s "checking whether runtime debug info should be used... " >&6; } if test "$enable_debug_info" = "yes"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else printf "%s\n" "#define STRIP_DEBUG 1" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether coverage testing is enabled" >&5 printf %s "checking whether coverage testing is enabled... " >&6; } if test "$enable_coverage_testing" = "yes"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } CFLAGS="${CFLAGS} -fprofile-arcs -ftest-coverage -O0" CLEAN="${CLEAN} \$(wildcard *.bb *.bbg *.da *.gcov)" else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. set dummy ${ac_tool_prefix}clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "clang", so it can be a program name with args. set dummy clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi fi test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See 'config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 printf %s "checking whether the C compiler works... " >&6; } ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # Autoconf-2.13 could set the ac_cv_exeext variable to 'no'. # So ignore a value of 'no', otherwise this would lead to 'EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an '-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else case e in #( e) ac_file='' ;; esac fi if test -z "$ac_file" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See 'config.log' for more details" "$LINENO" 5; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 printf %s "checking for C compiler default output file name... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 printf "%s\n" "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 printf %s "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # If both 'conftest.exe' and 'conftest' are 'present' (well, observable) # catch 'conftest.exe'. For instance with Cygwin, 'ls conftest' will # work properly (i.e., refer to 'conftest.exe'), while it won't with # 'rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else case e in #( e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See 'config.log' for more details" "$LINENO" 5; } ;; esac fi rm -f conftest conftest$ac_cv_exeext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 printf "%s\n" "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { FILE *f = fopen ("conftest.out", "w"); if (!f) return 1; return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 printf %s "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "cannot run C compiled programs. If you meant to cross compile, use '--host'. See 'config.log' for more details" "$LINENO" 5; } fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 printf "%s\n" "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext \ conftest.o conftest.obj conftest.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 printf %s "checking for suffix of object files... " >&6; } if test ${ac_cv_objext+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See 'config.log' for more details" "$LINENO" 5; } ;; esac fi rm -f conftest.$ac_cv_objext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 printf "%s\n" "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes else case e in #( e) ac_compiler_gnu=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_c_compiler_gnu if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes else case e in #( e) CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in #( e) ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } if test $ac_test_CFLAGS; 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_prog_cc_stdc=no if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c11_program _ACEOF for ac_arg in '' -std=gnu11 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } CC="$CC $ac_cv_prog_cc_c11" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c99_program _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } CC="$CC $ac_cv_prog_cc_c99" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c89_program _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } CC="$CC $ac_cv_prog_cc_c89" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 ;; esac fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking CFLAGS for strict prototypes" >&5 printf %s "checking CFLAGS for strict prototypes... " >&6; } if test ${ac_cv_cflags_strict_prototypes+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_cflags_strict_prototypes="no, unknown" ac_save_CFLAGS="$CFLAGS" for ac_arg in "-pedantic -Werror % -fstrict-prototypes -Wstrict-prototypes" "-pedantic -Werror % -Wstrict-prototypes" "-pedantic -Werror % -Wmissing-prototypes" "-pedantic -Werror % -Werror-implicit-function-declaration" "-pedantic -Werror % -Wimplicit-function-declaration" "-pedantic % -Wstrict-prototypes %% no, unsupported" # do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_cflags_strict_prototypes=`echo $ac_arg | sed -e 's,.*% *,,'` ; break fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done case ".$ac_cv_cflags_strict_prototypes" in .|.no|.no,*) ;; *) # sanity check with signal() from sys/signal.h cp config.log config.tmp cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { if (signal (SIGINT, SIG_IGN) == SIG_DFL) return 1; if (signal (SIGINT, SIG_IGN) != SIG_DFL) return 2; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : if test `diff config.log config.tmp | grep -i warning | wc -l` != 0 then if test `diff config.log config.tmp | grep -i warning | wc -l` != 1 then ac_cv_cflags_strict_prototypes="no, suppressed, signal.h," ; fi ; fi else case e in #( e) ac_cv_cflags_strict_prototypes="no, suppressed, signal.h" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext rm config.tmp ;; esac CFLAGS="$ac_save_CFLAGS" ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags_strict_prototypes" >&5 printf "%s\n" "$ac_cv_cflags_strict_prototypes" >&6; } case ".$ac_cv_cflags_strict_prototypes" in .ok|.ok,*) ;; .|.no|.no,*) ;; *) if test ${CFLAGS+y} then : case " $CFLAGS " in #( *" $ac_cv_cflags_strict_prototypes "*) : { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CFLAGS already contains \$ac_cv_cflags_strict_prototypes"; } >&5 (: CFLAGS already contains $ac_cv_cflags_strict_prototypes) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } ;; #( *) : as_fn_append CFLAGS " $ac_cv_cflags_strict_prototypes" { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS\""; } >&5 (: CFLAGS="$CFLAGS") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } ;; esac else case e in #( e) CFLAGS=$ac_cv_cflags_strict_prototypes { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS\""; } >&5 (: CFLAGS="$CFLAGS") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } ;; esac fi ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ansi= if test -z "$ansi"; then msg="for C compiler warning flags" else msg="for C compiler warning and ANSI conformance flags" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking $msg" >&5 printf %s "checking $msg... " >&6; } if test ${vl_cv_prog_cc_warnings+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then cat > conftest.c <&1 | grep -i "WorkShop" > /dev/null 2>&1 && $CC -c -v -Xc conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="-v" else vl_cv_prog_cc_warnings="-v -Xc" fi elif $CC -V 2>&1 | grep -i "Digital UNIX Compiler" > /dev/null 2>&1 && $CC -c -verbose -w0 -warnprotos -std1 conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="-verbose -w0 -warnprotos" else vl_cv_prog_cc_warnings="-verbose -w0 -warnprotos -std1" fi elif $CC 2>&1 | grep -i "C for AIX Compiler" > /dev/null 2>&1 && $CC -c -qlanglvl=ansi -qinfo=all conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="-qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" else vl_cv_prog_cc_warnings="-qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd -qlanglvl=ansi" fi elif $CC -version 2>&1 | grep -i "MIPSpro Compilers" > /dev/null 2>&1 && $CC -c -fullwarn -ansi -ansiE conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="-fullwarn" else vl_cv_prog_cc_warnings="-fullwarn -ansi -ansiE" fi elif what $CC 2>&1 | grep -i "HP C Compiler" > /dev/null 2>&1 && $CC -c -Aa +w1 conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="+w1" else vl_cv_prog_cc_warnings="+w1 -Aa" fi elif $CC -V 2>&1 | grep "/SX" > /dev/null 2>&1 && $CC -c -pvctl,fullmsg -Xc conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="-pvctl,fullmsg" else vl_cv_prog_cc_warnings="-pvctl,fullmsg -Xc" fi elif $CC -V 2>&1 | grep -i "Cray" > /dev/null 2>&1 && $CC -c -h msglevel 2 conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="-h msglevel 2" else vl_cv_prog_cc_warnings="-h msglevel 2 -h conform" fi fi rm -f conftest.* fi if test -n "$vl_cv_prog_cc_warnings"; then CFLAGS="$CFLAGS $vl_cv_prog_cc_warnings" else vl_cv_prog_cc_warnings="unknown" fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $vl_cv_prog_cc_warnings" >&5 printf "%s\n" "$vl_cv_prog_cc_warnings" >&6; } # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 printf %s "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if test ${ac_cv_path_install+y} then : printf %s "(cached) " >&6 else case e in #( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac # Account for fact that we put trailing slashes in our PATH walk. case $as_dir in #(( ./ | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir ;; esac fi if test ${ac_cv_path_install+y}; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 printf "%s\n" "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 printf %s "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 printf "%s\n" "no, using $LN_S" >&6; } fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5 printf %s "checking for a race-free mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if test ${ac_cv_path_mkdir+y} then : printf %s "(cached) " >&6 else case e in #( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir ('*'coreutils) '* | \ *'BusyBox '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS ;; esac fi test -d ./--version && rmdir ./--version if test ${ac_cv_path_mkdir+y}; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use plain mkdir -p, # in the hope it doesn't have the bugs of ancient mkdir. MKDIR_P='mkdir -p' fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 printf "%s\n" "$MKDIR_P" >&6; } for ac_prog in perl5 perl do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_PERL5+y} then : printf %s "(cached) " >&6 else case e in #( e) case $PERL5 in [\\/]* | ?:[\\/]*) ac_cv_path_PERL5="$PERL5" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy="$PATH:/usr/bin:/usr/local/bin" for as_dir in $as_dummy do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_PERL5="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac ;; esac fi PERL5=$ac_cv_path_PERL5 if test -n "$PERL5"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PERL5" >&5 printf "%s\n" "$PERL5" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$PERL5" && break done test -n "$PERL5" || PERL5="no" if test "$PERL5" != no; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether perl is v5 or higher" >&5 printf %s "checking whether perl is v5 or higher... " >&6; } if $PERL5 -e 'exit($] >= 5)'; then PERL5=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } fi fi if test "$PERL5" != no; then BUILT_SCRIPTS="$BUILT_SCRIPTS deweb" SCRIPTS="$SCRIPTS chkweb" else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: chkweb will not be installed since you do not have perl5." >&5 printf "%s\n" "$as_me: WARNING: chkweb will not be installed since you do not have perl5." >&2;} fi for ac_prog in 'groff -man -P-bu -Tlatin1' 'nroff -man' do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_GROFF+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$GROFF"; then ac_cv_prog_GROFF="$GROFF" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_GROFF="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi GROFF=$ac_cv_prog_GROFF if test -n "$GROFF"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GROFF" >&5 printf "%s\n" "$GROFF" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$GROFF" && break done test -n "$GROFF" || GROFF="'nroff -man'" # Extract the first word of "pdflatex", so it can be a program name with args. set dummy pdflatex; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_PDFLATEX+y} then : printf %s "(cached) " >&6 else case e in #( e) case $PDFLATEX in [\\/]* | ?:[\\/]*) ac_cv_path_PDFLATEX="$PDFLATEX" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_PDFLATEX="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_PDFLATEX" && ac_cv_path_PDFLATEX="no" ;; esac ;; esac fi PDFLATEX=$ac_cv_path_PDFLATEX if test -n "$PDFLATEX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PDFLATEX" >&5 printf "%s\n" "$PDFLATEX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi # Extract the first word of "latex", so it can be a program name with args. set dummy latex; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_LATEX+y} then : printf %s "(cached) " >&6 else case e in #( e) case $LATEX in [\\/]* | ?:[\\/]*) ac_cv_path_LATEX="$LATEX" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_LATEX="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_LATEX" && ac_cv_path_LATEX="no" ;; esac ;; esac fi LATEX=$ac_cv_path_LATEX if test -n "$LATEX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LATEX" >&5 printf "%s\n" "$LATEX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi # Extract the first word of "dvips", so it can be a program name with args. set dummy dvips; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_DVIPS+y} then : printf %s "(cached) " >&6 else case e in #( e) case $DVIPS in [\\/]* | ?:[\\/]*) ac_cv_path_DVIPS="$DVIPS" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_DVIPS="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac ;; esac fi DVIPS=$ac_cv_path_DVIPS if test -n "$DVIPS"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DVIPS" >&5 printf "%s\n" "$DVIPS" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi # Extract the first word of "lynx", so it can be a program name with args. set dummy lynx; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_LYNX+y} then : printf %s "(cached) " >&6 else case e in #( e) case $LYNX in [\\/]* | ?:[\\/]*) ac_cv_path_LYNX="$LYNX" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_LYNX="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac ;; esac fi LYNX=$ac_cv_path_LYNX if test -n "$LYNX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LYNX" >&5 printf "%s\n" "$LYNX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi # Extract the first word of "latex2html", so it can be a program name with args. set dummy latex2html; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_LATEX2HTML+y} then : printf %s "(cached) " >&6 else case e in #( e) case $LATEX2HTML in [\\/]* | ?:[\\/]*) ac_cv_path_LATEX2HTML="$LATEX2HTML" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_LATEX2HTML="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac ;; esac fi LATEX2HTML=$ac_cv_path_LATEX2HTML if test -n "$LATEX2HTML"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LATEX2HTML" >&5 printf "%s\n" "$LATEX2HTML" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tgetent in -ltermlib" >&5 printf %s "checking for tgetent in -ltermlib... " >&6; } if test ${ac_cv_lib_termlib_tgetent+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_check_lib_save_LIBS=$LIBS LIBS="-ltermlib $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char tgetent (void); int main (void) { return tgetent (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_termlib_tgetent=yes else case e in #( e) ac_cv_lib_termlib_tgetent=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_termlib_tgetent" >&5 printf "%s\n" "$ac_cv_lib_termlib_tgetent" >&6; } if test "x$ac_cv_lib_termlib_tgetent" = xyes then : printf "%s\n" "#define HAVE_LIBTERMLIB 1" >>confdefs.h LIBS="-ltermlib $LIBS" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tgetent in -ltermcap" >&5 printf %s "checking for tgetent in -ltermcap... " >&6; } if test ${ac_cv_lib_termcap_tgetent+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_check_lib_save_LIBS=$LIBS LIBS="-ltermcap $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char tgetent (void); int main (void) { return tgetent (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_termcap_tgetent=yes else case e in #( e) ac_cv_lib_termcap_tgetent=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_termcap_tgetent" >&5 printf "%s\n" "$ac_cv_lib_termcap_tgetent" >&6; } if test "x$ac_cv_lib_termcap_tgetent" = xyes then : printf "%s\n" "#define HAVE_LIBTERMCAP 1" >>confdefs.h LIBS="-ltermcap $LIBS" fi ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`printf "%s\n" "ac_cv_header_dirent_$ac_hdr" | sed "$as_sed_sh"` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 printf %s "checking for $ac_hdr that defines DIR... " >&6; } if eval test \${$as_ac_Header+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int main (void) { if ((DIR *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$as_ac_Header=yes" else case e in #( e) eval "$as_ac_Header=no" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi eval ac_res=\$$as_ac_Header { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } if eval test \"x\$"$as_ac_Header"\" = x"yes" then : cat >>confdefs.h <<_ACEOF #define `printf "%s\n" "HAVE_$ac_hdr" | sed "$as_sed_cpp"` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 printf %s "checking for library containing opendir... " >&6; } if test ${ac_cv_search_opendir+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char opendir (void); int main (void) { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_opendir+y} then : break fi done if test ${ac_cv_search_opendir+y} then : else case e in #( e) ac_cv_search_opendir=no ;; esac fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 printf "%s\n" "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 printf %s "checking for library containing opendir... " >&6; } if test ${ac_cv_search_opendir+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char opendir (void); int main (void) { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_opendir+y} then : break fi done if test ${ac_cv_search_opendir+y} then : else case e in #( e) ac_cv_search_opendir=no ;; esac fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 printf "%s\n" "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi ac_header= ac_cache= for ac_item in $ac_header_c_list do if test $ac_cache; then ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then printf "%s\n" "#define $ac_item 1" >> confdefs.h fi ac_header= ac_cache= elif test $ac_header; then ac_cache=$ac_item else ac_header=$ac_item fi done if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes then : printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default" if test "x$ac_cv_header_limits_h" = xyes then : printf "%s\n" "#define HAVE_LIMITS_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "stat.h" "ac_cv_header_stat_h" "$ac_includes_default" if test "x$ac_cv_header_stat_h" = xyes then : printf "%s\n" "#define HAVE_STAT_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "strings.h" "ac_cv_header_strings_h" "$ac_includes_default" if test "x$ac_cv_header_strings_h" = xyes then : printf "%s\n" "#define HAVE_STRINGS_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "stdarg.h" "ac_cv_header_stdarg_h" "$ac_includes_default" if test "x$ac_cv_header_stdarg_h" = xyes then : printf "%s\n" "#define HAVE_STDARG_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "sys/stat.h" "ac_cv_header_sys_stat_h" "$ac_includes_default" if test "x$ac_cv_header_sys_stat_h" = xyes then : printf "%s\n" "#define HAVE_SYS_STAT_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "termcap.h" "ac_cv_header_termcap_h" "$ac_includes_default" if test "x$ac_cv_header_termcap_h" = xyes then : printf "%s\n" "#define HAVE_TERMCAP_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "termlib.h" "ac_cv_header_termlib_h" "$ac_includes_default" if test "x$ac_cv_header_termlib_h" = xyes then : printf "%s\n" "#define HAVE_TERMLIB_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default" if test "x$ac_cv_header_unistd_h" = xyes then : printf "%s\n" "#define HAVE_UNISTD_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 printf %s "checking for an ANSI C-conforming const... " >&6; } if test ${ac_cv_c_const+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* IBM XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* IBM XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_c_const=yes else case e in #( e) ac_cv_c_const=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 printf "%s\n" "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then printf "%s\n" "#define const /**/" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 printf %s "checking for inline... " >&6; } if test ${ac_cv_c_inline+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo (void) {return 0; } $ac_kw foo_t foo (void) {return 0; } #endif _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext test "$ac_cv_c_inline" != no && break done ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 printf "%s\n" "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes then : else case e in #( e) printf "%s\n" "#define size_t unsigned int" >>confdefs.h ;; esac fi ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t" case $ac_cv_c_uint64_t in #( no|yes) ;; #( *) printf "%s\n" "#define _UINT64_T 1" >>confdefs.h printf "%s\n" "#define uint64_t $ac_cv_c_uint64_t" >>confdefs.h ;; esac ac_func= for ac_item in $ac_func_c_list do if test $ac_func; then ac_fn_c_check_func "$LINENO" $ac_func ac_cv_func_$ac_func if eval test \"x\$ac_cv_func_$ac_func\" = xyes; then echo "#define $ac_item 1" >> confdefs.h fi ac_func= else ac_func=$ac_item fi done if test "x$ac_cv_func_vprintf" = xno then : ac_fn_c_check_func "$LINENO" "_doprnt" "ac_cv_func__doprnt" if test "x$ac_cv_func__doprnt" = xyes then : printf "%s\n" "#define HAVE_DOPRNT 1" >>confdefs.h fi fi ac_fn_c_check_func "$LINENO" "access" "ac_cv_func_access" if test "x$ac_cv_func_access" = xyes then : printf "%s\n" "#define HAVE_ACCESS 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "closedir" "ac_cv_func_closedir" if test "x$ac_cv_func_closedir" = xyes then : printf "%s\n" "#define HAVE_CLOSEDIR 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "fileno" "ac_cv_func_fileno" if test "x$ac_cv_func_fileno" = xyes then : printf "%s\n" "#define HAVE_FILENO 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "isatty" "ac_cv_func_isatty" if test "x$ac_cv_func_isatty" = xyes then : printf "%s\n" "#define HAVE_ISATTY 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "opendir" "ac_cv_func_opendir" if test "x$ac_cv_func_opendir" = xyes then : printf "%s\n" "#define HAVE_OPENDIR 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "readdir" "ac_cv_func_readdir" if test "x$ac_cv_func_readdir" = xyes then : printf "%s\n" "#define HAVE_READDIR 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "stat" "ac_cv_func_stat" if test "x$ac_cv_func_stat" = xyes then : printf "%s\n" "#define HAVE_STAT 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "strcasecmp" "ac_cv_func_strcasecmp" if test "x$ac_cv_func_strcasecmp" = xyes then : printf "%s\n" "#define HAVE_STRCASECMP 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "strdup" "ac_cv_func_strdup" if test "x$ac_cv_func_strdup" = xyes then : printf "%s\n" "#define HAVE_STRDUP 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "strlwr" "ac_cv_func_strlwr" if test "x$ac_cv_func_strlwr" = xyes then : printf "%s\n" "#define HAVE_STRLWR 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "strtol" "ac_cv_func_strtol" if test "x$ac_cv_func_strtol" = xyes then : printf "%s\n" "#define HAVE_STRTOL 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC options needed to detect all undeclared functions" >&5 printf %s "checking for $CC options needed to detect all undeclared functions... " >&6; } if test ${ac_cv_c_undeclared_builtin_options+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_CFLAGS=$CFLAGS ac_cv_c_undeclared_builtin_options='cannot detect' for ac_arg in '' -fno-builtin; do CFLAGS="$ac_save_CFLAGS $ac_arg" # This test program should *not* compile successfully. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { (void) strchr; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in #( e) # This test program should compile successfully. # No library function is consistently available on # freestanding implementations, so test against a dummy # declaration. Include always-available headers on the # off chance that they somehow elicit warnings. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include extern void ac_decl (int, char *); int main (void) { (void) ac_decl (0, (char *) 0); (void) ac_decl; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : if test x"$ac_arg" = x then : ac_cv_c_undeclared_builtin_options='none needed' else case e in #( e) ac_cv_c_undeclared_builtin_options=$ac_arg ;; esac fi break fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done CFLAGS=$ac_save_CFLAGS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_undeclared_builtin_options" >&5 printf "%s\n" "$ac_cv_c_undeclared_builtin_options" >&6; } case $ac_cv_c_undeclared_builtin_options in #( 'cannot detect') : { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot make $CC report undeclared builtins See 'config.log' for more details" "$LINENO" 5; } ;; #( 'none needed') : ac_c_undeclared_builtin_options='' ;; #( *) : ac_c_undeclared_builtin_options=$ac_cv_c_undeclared_builtin_options ;; esac ac_fn_check_decl "$LINENO" "stpcpy" "ac_cv_have_decl_stpcpy" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_stpcpy" = xyes then : ac_have_decl=1 else case e in #( e) ac_have_decl=0 ;; esac fi printf "%s\n" "#define HAVE_DECL_STPCPY $ac_have_decl" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether PCRE regular expressions are enabled" >&5 printf %s "checking whether PCRE regular expressions are enabled... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_pcre" >&5 printf "%s\n" "$enable_pcre" >&6; } if test "$enable_pcre" = "yes"; then # Extract the first word of "pcre-config", so it can be a program name with args. set dummy pcre-config; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_WITH_PCRE+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$WITH_PCRE"; then ac_cv_prog_WITH_PCRE="$WITH_PCRE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_WITH_PCRE="yes" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_WITH_PCRE" && ac_cv_prog_WITH_PCRE="no" fi ;; esac fi WITH_PCRE=$ac_cv_prog_WITH_PCRE if test -n "$WITH_PCRE"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $WITH_PCRE" >&5 printf "%s\n" "$WITH_PCRE" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "$WITH_PCRE" = "yes"; then printf "%s\n" "#define HAVE_PCRE 1" >>confdefs.h CFLAGS="${CFLAGS} $(pcre-config --cflags-posix)" LDFLAGS="${LDFLAGS} $(pcre-config --libs-posix)" else printf "%s\n" "#define HAVE_PCRE 0" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: PCRE library not found." >&5 printf "%s\n" "$as_me: WARNING: PCRE library not found." >&2;} fi else printf "%s\n" "#define HAVE_PCRE 0" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: PCRE regular expressions not enabled." >&5 printf "%s\n" "$as_me: WARNING: PCRE regular expressions not enabled." >&2;} fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for POSIX extended regular expressions" >&5 printf %s "checking for POSIX extended regular expressions... " >&6; } ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 printf %s "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test ${ac_cv_prog_CPP+y} then : printf %s "(cached) " >&6 else case e in #( e) # Double quotes because $CC needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO" then : else case e in #( e) # Broken: fails on valid input. continue ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO" then : # Broken: success on invalid input. continue else case e in #( e) # Passes both tests. ac_preproc_ok=: break ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : break fi done ac_cv_prog_CPP=$CPP ;; esac fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 printf "%s\n" "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO" then : else case e in #( e) # Broken: fails on valid input. continue ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO" then : # Broken: success on invalid input. continue else case e in #( e) # Passes both tests. ac_preproc_ok=: break ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : else case e in #( e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See 'config.log' for more details" "$LINENO" 5; } ;; esac fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep -e" >&5 printf %s "checking for egrep -e... " >&6; } if test ${ac_cv_path_EGREP_TRADITIONAL+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -z "$EGREP_TRADITIONAL"; then ac_path_EGREP_TRADITIONAL_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in grep ggrep do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP_TRADITIONAL="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP_TRADITIONAL" || continue # Check for GNU ac_path_EGREP_TRADITIONAL and select it if it is found. # Check for GNU $ac_path_EGREP_TRADITIONAL case `"$ac_path_EGREP_TRADITIONAL" --version 2>&1` in #( *GNU*) ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_found=:;; #( *) ac_count=0 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" 'EGREP_TRADITIONAL' >> "conftest.nl" "$ac_path_EGREP_TRADITIONAL" -E 'EGR(EP|AC)_TRADITIONAL$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_TRADITIONAL_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_TRADITIONAL_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP_TRADITIONAL"; then : fi else ac_cv_path_EGREP_TRADITIONAL=$EGREP_TRADITIONAL fi if test "$ac_cv_path_EGREP_TRADITIONAL" then : ac_cv_path_EGREP_TRADITIONAL="$ac_cv_path_EGREP_TRADITIONAL -E" else case e in #( e) if test -z "$EGREP_TRADITIONAL"; then ac_path_EGREP_TRADITIONAL_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in egrep do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP_TRADITIONAL="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP_TRADITIONAL" || continue # Check for GNU ac_path_EGREP_TRADITIONAL and select it if it is found. # Check for GNU $ac_path_EGREP_TRADITIONAL case `"$ac_path_EGREP_TRADITIONAL" --version 2>&1` in #( *GNU*) ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_found=:;; #( *) ac_count=0 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" 'EGREP_TRADITIONAL' >> "conftest.nl" "$ac_path_EGREP_TRADITIONAL" 'EGR(EP|AC)_TRADITIONAL$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_TRADITIONAL_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_TRADITIONAL_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP_TRADITIONAL"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP_TRADITIONAL=$EGREP_TRADITIONAL fi ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP_TRADITIONAL" >&5 printf "%s\n" "$ac_cv_path_EGREP_TRADITIONAL" >&6; } EGREP_TRADITIONAL=$ac_cv_path_EGREP_TRADITIONAL cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef REG_EXTENDED yes # endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP_TRADITIONAL "yes" >/dev/null 2>&1 then : posix_ere=yes else case e in #( e) posix_ere=no ;; esac fi rm -rf conftest* { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $posix_ere" >&5 printf "%s\n" "$posix_ere" >&6; } if test "$WITH_PCRE" = "yes"; then printf "%s\n" "#define HAVE_POSIX_ERE 0" >>confdefs.h else if test "$enable_posixre" = "yes"; then if test "$posix_ere" = "yes"; then printf "%s\n" "#define HAVE_POSIX_ERE 1" >>confdefs.h else printf "%s\n" "#define HAVE_POSIX_ERE 0" >>confdefs.h fi else printf "%s\n" "#define HAVE_POSIX_ERE 0" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Regular expressions not enabled." >&5 printf "%s\n" "$as_me: WARNING: Regular expressions not enabled." >&2;} fi fi ac_config_headers="$ac_config_headers config.h" ac_config_files="$ac_config_files stamp-h" ac_config_files="$ac_config_files Makefile deweb rmeheader ChkTeX.tex" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # 'ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* 'ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # 'set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # 'set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 printf "%s\n" "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in #( e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in #( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in #( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by ChkTeX $as_me 1.7.9, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ '$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to the package provider." _ACEOF ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ ChkTeX config.status 1.7.9 configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" Copyright (C) 2023 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: '$1' Try '$0 --help' for more information.";; --help | --hel | -h ) printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: '$1' Try '$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX printf "%s\n" "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "stamp-h") CONFIG_FILES="$CONFIG_FILES stamp-h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "deweb") CONFIG_FILES="$CONFIG_FILES deweb" ;; "rmeheader") CONFIG_FILES="$CONFIG_FILES rmeheader" ;; "ChkTeX.tex") CONFIG_FILES="$CONFIG_FILES ChkTeX.tex" ;; *) as_fn_error $? "invalid argument: '$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to '$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with './config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with './config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script 'defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag '$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain ':'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: '$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is 'configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`printf "%s\n" "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when '$srcdir' = '.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&5 printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 printf "%s\n" "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac case $ac_file$ac_mode in "stamp-h":F) echo timestamp > stamp-h ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi chktex-1.7.9/types.h000644 000767 000024 00000000371 14613043276 015154 0ustar00iandrusstaff000000 000000 /* * Clone of , which could not be included because it's * (c) Commodore/Escom/Amiga/whatever. * */ #ifndef EXEC_TYPES_H #define EXEC_TYPES_H #ifndef TRUE # define TRUE 1L #endif #ifndef FALSE # define FALSE 0L #endif #endif chktex-1.7.9/input/000755 000767 000024 00000000000 14613043276 014775 5ustar00iandrusstaff000000 000000 chktex-1.7.9/Utility.c000644 000767 000024 00000051432 14613043276 015452 0ustar00iandrusstaff000000 000000 /* * ChkTeX, utility functions. * Copyright (C) 1995-96 Jens T. Berger Thielemann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * Contact the author at: * Jens Berger * Spektrumvn. 4 * N-0666 Oslo * Norway * E-mail: * * */ #include "ChkTeX.h" #include "Utility.h" #include "Resource.h" #include "OpSys.h" typedef unsigned long HASH_TYPE; /***************************** SUPPORT FUNCTIONS ************************/ /* * Copies a string with a maximum length of `len' starting at `pos' in * `source' into `dest'. * Returns -1 if the pos value is beyond the length of the source value, * else NULL. */ short substring(const char *source, char *dest, unsigned long pos, long len) { const char *Start; short Retval = -1; if (len >= 0) { if (strlen(source) > pos) { Start = &source[pos]; while ((len-- > 0) && (*dest++ = *Start++)) ; if (len == -1) Retval = 0; } } else Retval = 0L; *dest = 0; return (Retval); } /* * Determine whether a file exists. * */ int fexists(const char *Filename) { int Retval; #if defined(F_OK) && defined(R_OK) && defined(HAVE_ACCESS) Retval = access(Filename, F_OK | R_OK) == 0; #else FILE *fh; if ((fh = fopen(Filename, "r"))) { Retval = TRUE; fclose(fh); } else Retval = FALSE; #endif /* Ensure that it's not a directory */ if (Retval && !IsRegFile(Filename)) { Retval = FALSE; } return (Retval); } /* * 'Safe' memset() replacement. * Just tries to check the parameters, so that the risk of killing * innocent memory is lowered. * Please note that the `n' parameter now is an signed longword, not * an size_t. Won't permit that `n' exceeds BUFLEN, nor negative sizes. * Returns `to' if some memset()'ing was done, NULL if not. */ void *sfmemset(void *to, int c, long n) { if (to && (n > 0)) { n = min(n, BUFFER_SIZE); return (memset(to, c, (size_t) n)); } return (NULL); } /* * Quick replace function * Replaces every occurrence of a character in a string with another one. */ void strrep(char *String, /* String to replace within. */ const char From, /* Character to search for. */ const char To) /* Character to put instead. */ { register int c; while ((c = *String++)) { if (c == From) String[-1] = To; } } /* * Replaces every char not in Prot with To in Buf */ void strxrep(char *Buf, const char *Prot, const char To) { int c; while ((c = *Buf)) { if (!strchr(Prot, c)) *Buf = To; Buf++; } } /* * Strips tail and/or front of a string * Kills trailing/leading spaces. The macro/function LATEX_SPACE(char c) * is used to decide whether a space should be skipped. This function * should return TRUE if the character should be skipped, FALSE if not. * Returns the string which was passed onto it. */ char *strip(char *str, /* String to strip */ const enum Strip flags) /* One of the following: */ /* STRP_LFT - Strips leading blanks */ /* STRP_RGT - Strips trailing blanks */ /* STRP_BTH - Strips on both sides */ { char *bufptr = str; char *nlptr; char c; if (bufptr && (c = *bufptr)) { if (flags & STRP_LFT) { if (LATEX_SPACE(c) && c) { do { c = *++bufptr; } while (LATEX_SPACE(c) && c); } } if (flags & STRP_RGT) { if (c && *bufptr) { nlptr = bufptr; while (*++nlptr) ; do { *nlptr = 0; c = *--nlptr; } while (LATEX_SPACE(c) && c && (nlptr > bufptr)); } else *bufptr = 0; } } return (bufptr); } /* * Converts all the chars in the string passed into lowercase. */ #ifndef HAVE_STRLWR char *strlwr(char *String) { char *Bufptr; char TmpC; for (Bufptr = String; (TmpC = *Bufptr); Bufptr++) *Bufptr = tolower((unsigned char)TmpC); return (String); } #endif /* * Returns a duplicate of the string passed. */ #ifndef HAVE_STRDUP char *strdup(const char *String) { char *Retval = NULL; size_t Len; if (String) { Len = strlen(String) + 1; if ((Retval = malloc(Len))) memcpy(Retval, String, Len); } return (Retval); } #endif /* * Does the same as strdup, but adds a zero-filled padding, length extra bytes. */ char *strdupx(const char *String, int Extra) { char *Retval = NULL; size_t Len; if (String) { Len = strlen(String) + 1 + Extra; if ((Retval = malloc(Len))) strncpy(Retval, String, Len); } return (Retval); } /* * Case-insensitive comparison of two strings. */ #ifndef HAVE_STRCASECMP int strcasecmp(const char *a, const char *b) { int aa, bb; do { aa = *a++; bb = *b++; } while (aa && (tolower((unsigned char)aa) == tolower((unsigned char)bb))); /* bb != 0 is implicit */ return (tolower((unsigned char)aa) - tolower((unsigned char)bb)); } #endif /* * Not all reallocs are intelligent enough to handle NULL's as * parameters. This fixes this. */ void *saferealloc(void *b, size_t n) { void *Retval = NULL; if (b) { if (n) Retval = realloc(b, n); else free(b); } else Retval = malloc(n); return (Retval); } /* * Repeatedly writes the From string over To so that we overwrite Len bytes. * Does nothing if passed empty/NULL string. */ void strwrite(char *To, const char *From, unsigned long Len) { unsigned long i, j; unsigned long FromLen = strlen(From); Len = min(Len, BUFFER_SIZE); if (To && From) { switch (FromLen) { case 0: break; case 1: memset(To, *From, Len); break; default: for (i = j = 0; i < Len; i++, j++) { if (j >= FromLen) j = 0; To[i] = From[j]; } } } } /* * Checks whether Cmp comes after Str. * */ int strafter(const char *Str, const char *Cmp) { return (strncmp(Str, Cmp, strlen(Cmp))); } /* * Checks whether Cmp comes before Str. Returns 0 if so, non-zero if not. * */ int strinfront(const char *Str, const char *Cmp) { int CmpLen; if ((CmpLen = strlen(Cmp))) { Cmp += CmpLen; Str++; while ((*--Cmp == *--Str) && (--CmpLen > 0)) ; return (CmpLen); } else return (1); } /*************************** HASH INDEX **************************/ /* * Hashes a string. The string ought be rather short. * * The algorithm was designed by Peter Weinberger. This version was * adapted from Dr Dobb's Journal April 1996 page 26. */ static unsigned long HashWord(const char *str) { register unsigned long h = 0, hbit, c; while ((c = *str++)) { h = (h << 4) ^ c; if ((hbit = h & 0xf0000000)) h ^= hbit >> 24; h &= ~hbit; } return (h); } /* * Inserts a string into a hash index. Note: You'll have to * duplicate the string yourself. */ void InsertHash(char *a, struct Hash *h) { struct HashEntry **he, *newhe; if (!h->Index) { if (!((h->Index = calloc(HASH_SIZE, sizeof(struct HashEntry *))))) PrintPrgErr(pmWordListErr); } he = &h->Index[HashWord(a) % HASH_SIZE]; if ((newhe = malloc(sizeof(struct HashEntry)))) { newhe->Next = *he; newhe->Str = a; *he = newhe; } else PrintPrgErr(pmWordListErr); } /* * Checks whether a string previously has been registered in a * hash index. */ char *HasHash(const char *a, const struct Hash *h) { struct HashEntry *he; HASH_TYPE i; /* Special magic to optimize SAS/C */ /* Do we have a hash? */ if (!h->Index) return NULL; /* Find entry in hash */ i = HashWord(a); i %= HASH_SIZE; he = h->Index[i]; /* Search in the entry for the item */ while (he) { if (!strcmp(he->Str, a)) return (he->Str); else he = he->Next; } return (NULL); } /* * Clears a hash table. */ void ClearHash(struct Hash *h) { int i; struct HashEntry *he, *next; if (h && h->Index) { /* Free all the memory */ for ( i = 0; i < HASH_SIZE; ++i ) { he = h->Index[i]; while ( he ) { next = he->Next; free( he ); he = next; } } /* Reset the hash table */ memset(h->Index, '\0', HASH_SIZE * sizeof(struct HashEntry *)); } } /* * Rehashes a wordlist. If you change any of the elem's, you must * call this. * */ static void ReHash(struct WordList *WL) { unsigned long i = 0; ClearHash(&WL->Hash); FORWL(i, *WL) InsertHash(WL->Stack.Data[i], &WL->Hash); } /*************************** WORDLIST HANDLING **************************/ /* * Inserts a duplicate of `Word' into the `Wordlist' structure. You do thus * not need to make a duplicate of `Word' yourself. */ int InsertWord(const char *Word, struct WordList *WL) { char *WrdCpy; unsigned long Len; if ((WrdCpy = strdupx(Word, WALLBYTES))) { if (StkPush(WrdCpy, &WL->Stack)) { Len = strlen(Word); if (WL->MaxLen < Len) WL->MaxLen = Len; InsertHash(WrdCpy, &WL->Hash); return (TRUE); } free(WrdCpy); } return (FALSE); } /* * Clears a WordList; removing all items. */ void ClearWord(struct WordList *WL) { char *Word; if (WL) { while ( (Word = StkPop( &WL->Stack )) ) { free(Word); } WL->Stack.Used = 0; WL->MaxLen = 0; ClearHash(&WL->Hash); if (WL->NonEmpty) InsertWord("", WL); } } /* * Query whether a `Word' is previously InsertWord()'ed into the WL * structure. Does case-sensitive comparison. * * Returns the data in the list. */ char *HasWord(const char *Word, struct WordList *WL) { return HasHash(Word, &WL->Hash); } /* * Make all the words in a list lower case for later case-insensitive * comparison. */ void MakeLower(struct WordList *wl) { unsigned long i; FORWL(i, *wl) strlwr(wl->Stack.Data[i]); ReHash(wl); } /* * Calls strrep on each argument in a list. */ void ListRep(struct WordList *wl, const char From, const char To) { unsigned long i; FORWL(i, *wl) strrep(wl->Stack.Data[i], From, To); ReHash(wl); } /************************** GENERIC STACK ******************************/ /* * Push something onto a stack. Returns TRUE if successful, else FALSE. * Note: You can not push a NULL Data element. */ int StkPush(void *Data, struct Stack *Stack) { unsigned long NewSize; void **NewBuf; if (Data && Stack) { if (Stack->Used >= Stack->Size) { NewSize = Stack->Size + MINPUDDLE; if ((NewBuf = saferealloc(Stack->Data, (size_t) NewSize * sizeof(void *)))) { Stack->Size = NewSize; Stack->Data = NewBuf; } else return (FALSE); } Stack->Data[Stack->Used++] = Data; return (TRUE); } return (FALSE); } /* * Pops an element from the stack. * */ void *StkPop(struct Stack *Stack) { void *Retval = NULL; if (Stack && (Stack->Used > 0)) { Retval = Stack->Data[--Stack->Used]; #ifdef NO_DIRTY_TRICKS { void **NewBuf; if (Stack->Used < (Stack->Size / 2)) { unsigned long NewSize; NewSize = Stack->Size - MINPUDDLE; NewSize = max(NewSize, MINPUDDLE); if (NewBuf = saferealloc(Stack->Data, (size_t) NewSize * sizeof(void *))) { Stack->Size = NewSize; Stack->Data = NewBuf; } } } #endif } return (Retval); } /* * Returns the topmost element of the stack. */ void *StkTop(struct Stack *Stack) { if (Stack && (Stack->Used > 0)) return (Stack->Data[Stack->Used - 1]); else return (NULL); } /****************************** INPUT STACK *****************************/ int PushFileName(const char *Name, struct Stack *stack) { FILE *fh = NULL; static char NameBuf[BUFFER_SIZE]; if (Name && stack) { if (LocateFile(Name, NameBuf, ".tex", &TeXInputs)) { if ((fh = fopen(NameBuf, "r"))) { return (PushFile(NameBuf, fh, stack)); } } PrintPrgErr(pmNoTeXOpen, Name); } return (FALSE); } int PushFile(const char *Name, FILE * fh, struct Stack *stack) { struct FileNode *fn; uint64_t *filesupp; if (Name && fh && stack) { if ((fn = malloc(sizeof(struct FileNode)))) { if ((fn->Name = strdup(Name))) { fn->fh = fh; fn->Line = 0L; if ((filesupp = malloc(sizeof(uint64_t)))) { *filesupp = 0; StkPush(filesupp, &FileSuppStack); } else PrintPrgErr(pmNoStackMem); if ((filesupp = malloc(sizeof(uint64_t)))) { *filesupp = 0; StkPush(filesupp, &UserFileSuppStack); } else PrintPrgErr(pmNoStackMem); if (StkPush(fn, stack)) return (TRUE); free(fn->Name); } free(fn); } PrintPrgErr(pmNoStackMem); } return (FALSE); } char *FGetsStk(char *Dest, unsigned long len, struct Stack *stack) { static short HasSeenLong = 0; struct FileNode *fn; char *Retval = NULL; size_t Retlen = 0; if ((fn = StkTop(stack))) { do { Retval = fgets(Dest, (int)len, fn->fh); if (Retval) { Retlen = strlen(Retval); if (Retval[Retlen-1] == '\n' || Retlen < len-1) fn->Line++; /* We only want the long lines warning once per file */ else if (!HasSeenLong) { PrintPrgErr(pmLongLines, len-2); HasSeenLong = 1; } break; } fn = StkPop(stack); fclose(fn->fh); if ( fn->Name != NULL ) free(fn->Name); free(fn); HasSeenLong = 0; StkPop(&FileSuppStack); StkPop(&UserFileSuppStack); } while (!Retval && (fn = StkTop(stack))); } return (Retval); } const char *CurStkName(struct Stack *stack) { struct FileNode *fn; static const char *LastName = ""; if (PseudoInName && (stack->Used <= 1)) return (PseudoInName); else { if ((fn = StkTop(stack))) { if ( stack->Used == 1 && strlen(LastName) == 0 && fn->Name ) { LastName = strdup(fn->Name); } return (fn->Name); } else return (LastName); } } FILE *CurStkFile(struct Stack * stack) { struct FileNode *fn; if ((fn = StkTop(stack))) return (fn->fh); else return (NULL); } unsigned long CurStkLine(struct Stack *stack) { struct FileNode *fn; static unsigned long LastLine = 0L; if ((fn = StkTop(stack))) return (LastLine = fn->Line); else return (LastLine); } long CurStkMode(struct Stack *stack) { long * Mode; if ((Mode = StkTop(stack))) return *Mode; /* printf("Empty stack\n"); */ return FALSE; } long *PushMode(long mode, struct Stack *stack) { long *m; if ((m = malloc(sizeof(long)))) { *m = mode; StkPush(m, stack); return m; } return NULL; } /************************** CHARACTER STACK ******************************/ /* * Pushes the character on the stack. */ struct ErrInfo *PushChar(const char c, const unsigned long Line, const unsigned long Column, struct Stack *Stk, const char *LineCpy) { char Buf[2]; Buf[0] = c; Buf[1] = 0; return (PushErr(Buf, Line, Column, 1, LineCpy, Stk)); } struct ErrInfo *PushErr(const char *Data, const unsigned long Line, const unsigned long Column, const unsigned long ErrLen, const char *LineCpy, struct Stack *Stk) { struct ErrInfo *ci; if ((ci = malloc(sizeof(struct ErrInfo)))) { if ((ci->Data = strdup(Data))) { if ((ci->File = strdup(CurStkName(&InputStack)))) { if ((ci->LineBuf = strdup(LineCpy))) { ci->Line = Line; ci->ErrLen = ErrLen; ci->Column = Column; ci->Flags = efNone; if (StkPush(ci, Stk)) return (ci); free(ci->LineBuf); } else PrintPrgErr(pmStrDupErr); free(ci->File); } else PrintPrgErr(pmStrDupErr); free(ci->Data); } else PrintPrgErr(pmStrDupErr); free(ci); } return (NULL); } /* * Finds the uppermost entry in the stack with a data matching * String. */ struct ErrInfo *TopMatch(struct Stack *Stack, char *String) { int i; struct ErrInfo *retval = NULL; if (Stack && String) { for (i = Stack->Used - 1; i >= 0; i--) { if (!strcmp(String, ((struct ErrInfo *) Stack->Data[i])->Data)) { retval = (struct ErrInfo *) Stack->Data[i]; break; } } } return (retval); } /* * Returns and removes a character from the stack, returns NULL if * the stack is empty. */ struct ErrInfo *PopErr(struct Stack *Stack) { return ((struct ErrInfo *) StkPop(Stack)); } /* * Same as PopChar(), but lets the error alone on the stack. */ struct ErrInfo *TopErr(struct Stack *Stack) { return ((struct ErrInfo *) StkTop(Stack)); } /* * Free all resources associated with a struct FreeInfo. */ void FreeErrInfo(struct ErrInfo *ei) { if (ei) { if (ei->Data) free(ei->Data); if (ei->File) free(ei->File); if (ei->LineBuf) free(ei->LineBuf); free(ei); } } /************************* OPEN/CLOSE COUNTING **************************/ /* * Returns the index a given bracket (`()[]{}') character has in the * BrOrder array. Returns ~0 if the character was not a bracket. */ long BrackIndex(const char c) { switch (c) { case '(': return (0); case ')': return (1); case '[': return (2); case ']': return (3); case '{': return (4); case '}': return (5); default: return (~0L); } } /* * Counts brackets for you. Give it a bracket, and it will update the * corresponding counter. */ void AddBracket(const char c) { long Index; if ((Index = BrackIndex(c)) != -1) Brackets[Index]++; } /* * Returns the character that matches the given bracket, NULL if `c' * wasn't a bracket character. */ char MatchBracket(const char c) { unsigned long Index; char Char = 0; if ((Index = BrackIndex(c)) != ~0UL) Char = BrOrder[Index ^ 1]; return (Char); } chktex-1.7.9/ChkTeX.texrc000644 000767 000024 00000000302 14613043276 016026 0ustar00iandrusstaff000000 000000 # Ignore file for ChkTeX.tex, since it shows many errors in its examples # it raises many errors when checking ChkTeX.tex with chktex itself. VerbEnvir { errexam errdesc } WipeArg { \Cmd:{} } chktex-1.7.9/deweb.1000644 000767 000024 00000005705 14613043276 015015 0ustar00iandrusstaff000000 000000 .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 will be correct regarding to line numbers. In most cases, the column position will also be correct. This significantly simplifies finding the errors in the .I LaTeX source (in contrast to the output from .I cweave, which output is truly difficult to figure anything out from). .PP .I deweb accepts a list of filenames on the argument line, and will send its output to .I stdout. If no filenames are given, it will read from stdin, acting as a filter. No options are currently accepted. .PP Macho users may try to pipe the output from .I deweb directly into .I LaTeX, theoretically, this should work. This would ease the debugging of the .I LaTeX code significantly, as when .I LaTeX complains about wrong syntax, you'll be able to find the erroneous line much more easily. Don't expect that the output looks very much like the final one, though. .PP .I deweb should now understand all correct .I CWEB opcodes. If it complains about not understanding a correct opcode, please inform the author. .SH DISTRIBUTION Copyright (C) 1996 Jens T. Berger Thielemann .PP This program is free software; you can redistribute it and/or modify it under the terms of the .I GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. .PP This program is distributed in the hope that it will be useful, but .B WITHOUT ANY WARRANTY; without even the implied warranty of .B MERCHANTABILITY or .B FITNESS FOR A PARTICULAR PURPOSE. See the .I GNU General Public License for more details. .PP You should have received a copy of the .B GNU General Public License along with this program; if not, write to the .I Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. .SH ENVIRONMENT No environment variables are used. .SH FILES None. .SH AUTHOR Jens T. Berger Thielemann, .I .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 chktex-1.7.9/chkweb000755 000767 000024 00000002441 14613043276 015030 0ustar00iandrusstaff000000 000000 #! /bin/sh # ChkWEB v1.0, runs the LaTeX parts of a CWEB file through ChkTeX. # Copyright (C) 1996 Jens T. Berger Thielemann # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Contact the author at: # Jens Berger # Spektrumvn. 4 # N-0666 Oslo # Norway # E-mail: 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 chktex-1.7.9/tests/000755 000767 000024 00000000000 14613043276 015000 5ustar00iandrusstaff000000 000000 chktex-1.7.9/config.h.in000644 000767 000024 00000010613 14613043276 015662 0ustar00iandrusstaff000000 000000 /* config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if you have the 'access' function. */ #undef HAVE_ACCESS /* Define to 1 if you have the 'closedir' function. */ #undef HAVE_CLOSEDIR /* Define to 1 if you have the declaration of 'stpcpy', and to 0 if you don't. */ #undef HAVE_DECL_STPCPY /* Define to 1 if you have the header file, and it defines 'DIR'. */ #undef HAVE_DIRENT_H /* Define to 1 if you don't have 'vprintf' but do have '_doprnt.' */ #undef HAVE_DOPRNT /* Define to 1 if you have the 'fileno' function. */ #undef HAVE_FILENO /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the 'isatty' function. */ #undef HAVE_ISATTY /* Define to 1 if you have the 'termcap' library (-ltermcap). */ #undef HAVE_LIBTERMCAP /* Define to 1 if you have the 'termlib' library (-ltermlib). */ #undef HAVE_LIBTERMLIB /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if you have the header file, and it defines 'DIR'. */ #undef HAVE_NDIR_H /* Define to 1 if you have the 'opendir' function. */ #undef HAVE_OPENDIR /* Whether PCRE can be used for user warnings. */ #undef HAVE_PCRE /* Whether POSIX ERE can be used for user warnings. */ #undef HAVE_POSIX_ERE /* Define to 1 if you have the 'readdir' function. */ #undef HAVE_READDIR /* Define to 1 if you have the 'stat' function. */ #undef HAVE_STAT /* Define to 1 if you have the header file. */ #undef HAVE_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDARG_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDIO_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the 'strcasecmp' function. */ #undef HAVE_STRCASECMP /* Define to 1 if you have the 'strdup' function. */ #undef HAVE_STRDUP /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the 'strlwr' function. */ #undef HAVE_STRLWR /* Define to 1 if you have the 'strtol' function. */ #undef HAVE_STRTOL /* Define to 1 if you have the header file, and it defines 'DIR'. */ #undef HAVE_SYS_DIR_H /* Define to 1 if you have the header file, and it defines 'DIR'. */ #undef HAVE_SYS_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_TERMCAP_H /* Define to 1 if you have the header file. */ #undef HAVE_TERMLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the 'vprintf' function. */ #undef HAVE_VPRINTF /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if all of the C89 standard headers exist (not just the ones required in a freestanding environment). This macro is provided for backward compatibility; new code need not use it. */ #undef STDC_HEADERS /* Strip debug info */ #undef STRIP_DEBUG /* Define for Solaris 2.5.1 so the uint64_t typedef from , , or is not used. If the typedef were allowed, the #define below would cause a syntax error. */ #undef _UINT64_T /* Define to empty if 'const' does not conform to ANSI C. */ #undef const /* Define to '__inline__' or '__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define as 'unsigned int' if doesn't define. */ #undef size_t /* Define to the type of an unsigned integer type of width exactly 64 bits if such a type exists and the standard includes do not define it. */ #undef uint64_t chktex-1.7.9/ChkTeX.tex.in000644 000767 000024 00000225361 14613043276 016124 0ustar00iandrusstaff000000 000000 %% %% ChkTeX v@PACKAGE_VERSION@, LaTeX documentation for ChkTeX program. %% Copyright (C) 1995-96 Jens T. Berger Thielemann %% %% This program is free software; you can redistribute it and/or modify %% it under the terms of the GNU General Public License as published by %% the Free Software Foundation; either version 2 of the License, or %% (at your option) any later version. %% %% This program is distributed in the hope that it will be useful, %% but WITHOUT ANY WARRANTY; without even the implied warranty of %% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %% GNU General Public License for more details. %% %% You should have received a copy of the GNU General Public License %% along with this program; if not, write to the Free Software %% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. %% %% Contact the author at: %% Jens Berger %% Spektrumvn. 4 %% N-0666 Oslo %% Norway %% E-mail: %% %% NOTE: This file is written in LaTeX, and should be compiled %% before viewing. If you don't know how to do this, consult %% your local TeX guru. If you don't possess LaTeX, you are %% assumed to not need this program; so there's no text version %% of this file... %% %% You may still be able to view the DVI or PostScript versions of %% this file, though, they are included in the archive. %% \documentclass[a4paper]{article} %latex \usepackage{array, tabularx, verbatim, multicol} \usepackage[T1]{fontenc} \nonfrenchspacing \newcounter{errornum} \setcounter{errornum}{1} %endlatex \newcommand{\jtbt}{Jens~T. Berger~Thielemann} \newcommand{\Cmd}[1]{``\texttt{#1}''} \newcommand{\rsrc}{``\texttt{chktexrc}''} \newcommand{\chktex}{Chk\TeX} %latex \newcolumntype{Y}{>{\raggedright\arraybackslash}X} \newcommand{\fmted}[1]{% {\noindent\large% \begin{tabularx}{\linewidth}{lY}% \bf Warning \theerrornum: & \texttt{#1}% \end{tabularx}}\stepcounter{errornum}\nopagebreak[4]} \newcommand{\fmtrc}[1]{% {\noindent\large% %% \begin{tabularx}{\linewidth}{lY}% \phantomsection% \bf\texttt{#1}% \label{rc:#1} %% \end{tabularx} }\nopagebreak[4]} \newenvironment{errdesc}[1]{\noindent\fmted{#1}\begin{quote}}{\end{quote}% \pagebreak[3]} \newcommand\Keyword[1]{\marginpar{\texttt{\hfill\hyperref[rc:#1]{#1}}}} \newcommand{\chktexrcdefault}{\noindent The default value is} \newenvironment{chktexrcvar}[2]{% \smallskip\pagebreak[2]% %% \Keyword{#1} \fmtrc{#1} #2 Variable% \begin{quote}}{% \end{quote}\pagebreak[3]} \newenvironment{chktexrcsimplevar}[1]{\begin{chktexrcvar}{#1}{Simple}}{\end{chktexrcvar}} \newenvironment{chktexrclistvar}[1]{\begin{chktexrcvar}{#1}{List}}{\end{chktexrcvar}} \newenvironment{chktexrclistvar*}[1]{\begin{chktexrcvar}{#1}{Lowercase-able List}}{\end{chktexrcvar}} %% \newenvironment{chktexrclistvar}[1]{\fmtrc{#1}List Variable}{} %% \newenvironment{chktexrclistvar*}[1]{\fmtrc{#1}List Variable with Lowercase}{} \newenvironment{html}{\comment}{\endcomment} \newenvironment{rawhtml}{\comment}{\endcomment} \makeatletter \@namedef{errdesc*}#1{\begin{errdesc}{\textit{#1}}} \@namedef{enderrdesc*}{\end{errdesc}} \makeatother \newenvironment{errexam} { \vskip 0pt plus 5pt \begin{center} } {\end{center}} \columnseprule 0.1pt %!\newcommand{\BS}{\verb@\@} %!\newcommand{\chktex}{ChkTeX} %!\newcommand{\slash}{/} %endlatex % PDF table of contents \usepackage{hyperref} \hypersetup{ colorlinks=true, allcolors=blue, pdfpagemode=UseOutlines } \usepackage{hypcap} \title{\chktex\ v@PACKAGE_VERSION@} \author{Jens~T. Berger~Thielemann} \date{\today} \begin{document} \maketitle %latex \newcommand{\BS}{\char`\\} %endlatex \section{Introduction} This program has been written in frustration because some constructs in \LaTeX\ are sometimes non-intuitive, and easy to forget. It is \emph{not} a replacement for the built-in checker in \LaTeX\@; however it catches some typographic errors \LaTeX\ oversees. In other words, it is Lint for \LaTeX. Filters are also provided for checking the \LaTeX\ parts of CWEB documents. It is written in ANSI C and compiles silently under GCC using \Cmd{-Wall -ansi -pedantic} and almost all warning flags. This means that you can compile \& use the program on your favorite machine. Full source included. The program also supports output formats suitable for further processing by editors or other programs, making errors easy to cycle through. For example, recent versions of AUC\TeX\ (the Emacs mode) interface beautifully with \chktex. The program itself does not have any machine requirements; However compiling for other platforms has not been done for a long time now so the code has been removed. If interest rises it can be resurrected. \section{Features} \chktex\ begins to get quite a few bells \& whistles now. However, you should be aware of that in most cases, all this is transparent to the user. As you will see, \chktex\ offers the ability to adapt to many environments and configurations. \begin{itemize} \item Supports over 40 warnings. Warnings include: %latex \begin{multicols}{2} \begin{flushleft} %endlatex \begin{itemize} \item Commands terminated with space. Ignores \Cmd{\BS{}tt}, etc. \item Space in front of references instead of \Cmd{\~{}}. \item Forgetting to group parenthesis characters when sub-\slash{}super\-scripting. \item Italic correction (\Cmd{\BS/}) mistakes (double, missing, unnecessary). \item Parenthesis and environment matching. \item Ellipsis detection; also checks whether to use \Cmd{\BS{}dots}, \Cmd{\BS{}cdots} or \Cmd{\BS{}ldots}. \item Enforcement of normal space after abbreviation. Detects most abbreviations automagically. \item Enforcement of end-of-sentence space when the last sentence ended with capital letter. \item Math-mode on/off detection. \item Quote checking, both wrong types (\Cmd{"}) and wrong direction. \item Recommends splitting three quotes in a row. \item Searching for user patterns. \item Displays comments. \item Space in front of \Cmd{\BS{}label} and similar commands. \item Use of \Cmd{x} instead of \Cmd{\$\BS{}times\$} between numbers. \item Multiple spaces in input which will be rendered as one space (or multiple spaces, where that is undesirable). \item Warns about text which may be ignored. \item Mathematical operators typeset as variables. \item No space in front of/after parenthesis. \item Demands a consistent quote style. \item Punctuation inside inner math mode/outside display math mode. \item Use of \TeX\ primitives where \LaTeX\ equivalents are available. \item Space in front of footnotes. \item Bogus characters following commands. \item Ability to suppress warnings on a single line. \end{itemize} %latex \end{flushleft} \end{multicols} %endlatex \item Fully customizable. Intelligent resource format makes it possible to make \chktex\ respect your \LaTeX\ setup. Even command-line options may be specified globally in the \rsrc\ file. \item Supports \Cmd{\BS{}input} command; both \TeX\ and \LaTeX\ version. Actually includes the files. \Cmd{TEXINPUTS}-equivalent search path. \item Intelligent warning/error handling. The user may promote/mute warnings to suit his preferences. You may also mute warnings in the header of a file; thus killing much unwanted garbage. \item Scripts included for checking CWEB files written in \LaTeX. (Requires perl v5). \item Supports both \LaTeX\ 2.09 and \LaTeXe{}. \item Flexible output handling. Has some predefined formats and lets the user specify his own format. Uses a \Cmd{printf()} similar syntax. \Cmd{lacheck} compatible mode included for interfacing with systems which only support lacheck. \item Written in ANSI C\@. \Cmd{configure} script included for easy setup and installation on UNIX systems. \end{itemize} Still, it is important to realize that the output from \chktex\ is only intended as a \emph{guide} to fixing faults. However, it is by no means always correct. This means that correct \LaTeX\ code may produce errors in \chktex, and vice versa: Incorrect \LaTeX\ code may pass silently through. \section{Legal stuff} \chktex{}, documentation, installations scripts, CWEB filters and other materials provided are copyright \copyright\ 1995--96 Jens~T. Berger~Thielemann, unless explicitly stated otherwise. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY\@; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE\@. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to: \begin{quote} The Free Software Foundation, Inc. \\ 51 Franklin Street \\ Fifth Floor \\ Boston \\ MA 02110-1301 \\ USA \end{quote} \section{Availability} This program is on CTAN\@; thus it can be found at any mirrors of those. It is also part of TeX Live 2011. \section{Installation} A few words on installation on various platforms: \begin{description} \item[UNIX:] Type \Cmd{configure}, \Cmd{make} and finally \Cmd{make~install}. To make sure everything proceeded correctly, type \Cmd{make~check}. If you don't have superuser privileges and thus access to the default system areas, you should type \Cmd{configure~-{}-help} to help you set up correct paths. If you haven't installed any software like this before, that is distributed in source form, here are some guidelines to help you install it locally at your account. Please note that a mail to the system administrator may be less work for you. We assume that you have put the archive (\Cmd{chktex.tar.gz}) in a subdir of yours, with path \Cmd{\~{}/tmp}. We further assume that your shell is \Cmd{csh} or \Cmd{tcsh}. Do the following: \begin{enumerate} \item First of all, unpack the archive contents. \begin{verbatim} > cd ~/tmp > gunzip chktex.tar.gz > tar xf chktex.tar \end{verbatim} \item Now, we can configure the program. There are some configuration options you should know about: \begin{description} \item[\Cmd{-{}-enable-pcre}:] Allows using PCRE (perl compatible regular expressions) for use defined warnings. The default is to use PCRE if it is installed on your system as determined by \Cmd{pcre-config}. You can use \Cmd{-{}-disable-pcre} if you plan to distribute this for systems in which you cannot ensure PCRE will be installed. User defined regular expressions are defined using \texttt{UserWarnRegex} in the \rsrc\ file. See warning~44 for more information. \item[\Cmd{-{}-enable-lacheck-replace}] This enables a quick hack for using \chktex\ instead of lacheck. This is done by installing a stub script which ``overrides'' the original lacheck executable. In this way, tools which support lacheck can be easily made to support chktex instead. \item[\Cmd{-{}-enable-debug-info}] \chktex\ has an ability to spit out various diagnostic messages using the \Cmd{-d} flag. This behaviour is on by default. By adding the flag \Cmd{-{}-disable-debug-info} to the commandline, this will not be compiled in. This may be useful if you're running short of disk space (the time savings are neglible). \end{description} If you are installing the program on your local account, use the following command: \begin{verbatim} > configure --prefix ~/ \end{verbatim} Add eventual extra flags as specified above. This command will generate a significant amount of output, this can usually be ignored. \item Finally, we can just build the program and install it. \begin{verbatim} > make > make install \end{verbatim} \item Finished! The program is now installed and ready to use. You may now tell other people to put your bindir in their path in order to benefit from your work. All that remains is to make the shell aware of your installation. \begin{verbatim} > rehash \end{verbatim} To make the remaining parts of your system aware of this, you'll have to log out and re-log in, I'm afraid. However, you should delay this until you've completed this installation procedure. \item If you wish to make sure that everything is OK (you ought to), you may now ask \chktex\ to do a self-test: \begin{verbatim} > make check \end{verbatim} \end{enumerate} \item[Other platforms:] First of all, you have to copy the \Cmd{config.h.in} file to a file named \Cmd{config.h}. Then, edit it to reflect your system. Do the same with \Cmd{OpSys.h} (this file has been reduced significantly). If you wish, you may define \Cmd{DATADIR} to the path you want the global resource file to be put. Now, I would suggest that you take a peak at the \Cmd{OpSys.c} file, and edit it appropiately, for more comfort. This should not be necessary, though, at least not the first time. Finally, you may now compile and link all \verb@.c@ files. Do not forget to define \Cmd{HAVE\_CONFIG\_H} to 1 (on the command-line, for instance). If the \Cmd{config.h} you wish to use has another name, define \Cmd{CONFIG\_H\_NAME} to that (in that case, don't define \Cmd{HAVE\_CONFIG\_H}). Put the directory path of the \rsrc\ file in a environment variable named \Cmd{CHKTEXRC}. The files \Cmd{deweb.in} and \Cmd{chkweb} should be moved to a directory in your path. These files may need further setup, as they haven't got the location of perl initialized. If your compiler/the compiled program complains (or crashes!), you may try the hints listed below. Please note that it only makes sense to try these hints if your compiler fails to produce a working program. \begin{enumerate} \item Increase the preprocessor buffers and line buffers. The \chktex{} sources define macros sized 3--4k (expanding to about the same), and passes arguments sized about 1k. \item Use the magic switch which lets us use large \Cmd{switch(\dots)\{\dots\}} statements; some of these statements have about 120 \Cmd{case} entries. \item The sources require that at least the first 12 of each identifier is significant. \end{enumerate} \end{description} \paragraph{Note:} You \emph{must} install the new \rsrc\ file; \chktex\ will fail to function otherwise! After doing this, you may enhance \chktex's behaviour by reading/editing the \rsrc\ file. %latex \section{Usage} \subsection{\chktex} \subsubsection{Synopsis} A UNIX-compliant template format follows: \newcommand{\Group}[1]{\mbox{[#1]}} \begin{tabularx}{.95\linewidth}{lY} \texttt{chktex} & \ttfamily \Group{-hiqrW} \Group{-v[0-\dots]} \Group{-l } \Group{-[wemn] <[1-42]|all>} \Group{-d[0-\ldots]} \Group{-p } \Group{-o } \Group{-[btxgI][0|1]} file1 file2 \dots \end{tabularx} \subsubsection{Comamndline Options} These are the options \chktex\ currently accepts. Please note that single-lettered options requiring a numerical or no argument may be concatenated. E.g.\ saying \Cmd{-v0qb0w2} is the same as saying \Cmd{-v0~-q~-b0~-w2}, except for being less to type. Enough general talk; here's a rather detailed description of all options: \begin{description} \item[Misc.\ options:] General options which aren't related to some specific subpart of \chktex. \begin{description} \item[\texttt{-h [-{}-help]}] Gives you a command summary. \item[\texttt{-i [-{}-license]}] Shows distribution information. \item[\texttt{-l [-{}-localrc]}] Reads a resource-file formatted as the global resource-file \rsrc, in addition to the global resource-file. This option needs the name of the resource-file as a parameter. See also \texttt{-g}. \item[\texttt{-r [-{}-reset]}] This will reset all settings to their defaults. This may be useful if you use the \texttt{CMDLINE} directive in your \rsrc\ file, and wish to do something unusual. \item[\texttt{-d [-{}-debug]}] Needs a numeric argument; a bitmask telling what to output. The values below may be added in order to output multiple debugging info. \begin{tabularx}\linewidth{cX} \bf Value & \bf Dumps\ldots\\ 1 & All warnings available and their current status. \\ 2 & Statistics for all lists in the resource file. \\ 4 & The contents of all lists in the resource file. \\ 8 & Misc.\ other status information. \\ 16 & Run-time info (note that this isn't widely used). \\ \end{tabularx} The info is produced after all switches and resource files have been processed. It is possible to install versions of \chktex\ that ignore this flag; this means that it is not certain that this flag works. \item[\texttt{-W [-{}-version]}] Displays version information, and exits. \end{description} \item[Muting warning messages:] Controls whether and in what form error messages will appear. Usually they accept a specific warning number (e.g.\ \Cmd{-w2}), but you may also say \Cmd{all} (e.g.\ \Cmd{-wall}) which does the operation on \emph{all} warnings. \begin{description} \item[\texttt{-w [-{}-warnon]}] Makes the message number passed as parameter a warning and turns it on. \item[\texttt{-e [-{}-erroron]}] Makes the message number passed as parameter an error and turns it on. \item[\texttt{-m [-{}-msgon]}] Makes the message number passed as parameter a message and turns it on. Messages are not counted. \item[\texttt{-n [-{}-nowarn]}] Turns the warning/error number passed as a parameter off. \item[\texttt{-L [-{}-nolinesupp]}] Turns off suppression of messages on a per line basis. This is meant to be used to ensure that no new errors have crept into a document while editing. \end{description} \item[Output control flags:] Determines the appearance and destination of the error reports. \begin{description} \item[\texttt{-q [-{}-quiet]}] Shuts up about copyright information. \item[\texttt{-o [-{}-output]}] Normally, all errors are piped to \texttt{stdout}. Using this option with a parameter, errors will be sent to the named file instead. Only information relative to the \LaTeX\ file will be sent to that file. Memory problems and similar will as as always be sent to \texttt{stderr}. If a file with the name given already exists, it will be renamed to \Cmd{foobar.bak} (\Cmd{foobar.\$cl} under MS-DOS), \Cmd{foobar} being the name of the file. See also \Cmd{-b}. \item[\texttt{-v [-{}-verbosity]}] Specifies how much and how you wish the error reports to be displayed. This is specified in the \rsrc\ file; we'll list the default values below. If you wish, you may thus edit the \rsrc\ file to add or modify new formats. The default is mode 1 (that is, the \emph{second} entry in the \rsrc\ file), using \texttt{-v} without any parameter will give you mode 2. \begin{description} \item[0] Will show the information in a way that should be suitable for further parsing by \texttt{awk}, \texttt{sed} or similar. The format is as follows: \begin{verbatim} File:Line:Column:Warning number:Warning message \end{verbatim} The colons may be replaced with another string; use the \verb@-s@ switch for this. As the program does not output all errors in quite order, this output format is also suitable for piping through \Cmd{sort}. \item[1] Shows the information in a way which is more comprehensible for humans, but which still doesn't need anything but a glass tty. \item[2] Shows the information in a fancy way, using escape codes and stuff. It is the indeed most readable of all modes; however, it needs proper set up of the \Cmd{ChkTeX.h} at compilation time. UNIX boxes, however, will find the information automatically. \item[3] Shows the information suitable for parsing by Emacs; this is the same format as \texttt{lacheck} uses. More formally, it is the following: \begin{verbatim} "File", line Line: Warning message \end{verbatim} To utilize this, type \verb@M-x compile RET@. Delete whatever is written in the minibuffer, and type \verb@chktex -v3 texfile.tex@, and you should be able to browse through the error messages. Use \verb@C-x `@ to parse the messages. \item[4] More or less the same as \verb@-v3@, but also includes information on where the error actually was found. Takes somewhat longer time to parse, but much more informative in use. \end{description} \phantomsection\label{clarg:format}% \item[\texttt{-f [-{}-format]}] Specifies the format of the output. This is done using a format similar to \Cmd{printf()}, where we support the specifiers listed below. \smallskip \newcommand{\Pf}[1]{\texttt{\%#1} &} \begin{tabularx}{\linewidth}{cX} \bf Code & \bf Description \\ \Pf{b} String to print \textbf{b}etween fields (from \texttt{-s} option).\\ \Pf{c} \textbf{C}olumn position of error. \\ \Pf{d} Length of error (\textbf{d}igit). \\ \Pf{f} Current \textbf{f}ilename.\\ \Pf{i} Turn on \textbf{i}nverse printing mode.\\ \Pf{I} Turn off \textbf{i}nverse printing mode.\\ \Pf{k} \textbf{k}ind of error (warning, error, message).\\ \Pf{l} \textbf{l}ine number of error.\\ \Pf{m} Warning \textbf{m}essage.\\ \Pf{n} Warning \textbf{n}umber.\\ \Pf{u} An \textbf{u}nderlining line (like the one which appears when using \Cmd{-v1}).\\ \Pf{r} Part of line in front of error ($\mbox{`S'} - 1$).\\ \Pf{s} Part of line which contains error (\textbf{s}tring).\\ \Pf{t} Part of line after error ($\mbox{`S'} + 1$). \end{tabularx} \smallskip Other characters will be passed literally; thus you can say \Cmd{\%\%} to achieve a single percent sign in the output. Please note that we may introduce other specifiers in the future, so don't abuse this feature for other characters. Also, note that we do \emph{not} support field lengths (yet). This may come in the future, if I get the time\dots The \texttt{-v} command is implemented by indexing into the \rsrc\ file; read that for seeing how each format is implemented. If you find yourself using a particular format often by using the -f switch, consider putting it in the \rsrc\ file instead. \item[\texttt{-V [-{}-pipeverb]}] Which entry we'll use in the \rsrc\ file whenever \texttt{stdout} isn't a terminal. The default is to use the same mode as specified with the \texttt{-v} switch; using \texttt{-V} without any parameter will give you mode 1. This switch was implemented because GNU less has problems with the escape codes \chktex\ uses for displaying inverse text. Under UNIX, there's another way around, though, which is slightly more elegant. Add the following line to your \Cmd{.envir} file: \begin{verbatim} setenv LESS -r \end{verbatim} \item[\texttt{-p [-{}-pseudoname]}] With this switch, you can provide the filename which will be used when we report the errors. This may be useful in scripts, especially when doing pipes. It is in other words similar to C's \verb@#line@ directive. We will only assume this name for the uppermost file; files that this one in turn \verb@\@\verb@input@ are presented under their original names. This seems most logical to me. \item[\texttt{-s [-{}-splitchar]}] String to use instead of the colons when doing \texttt{-v0}; e.g.\ this string will be output between the fields. \end{description} \item[Boolean switches:] Common for all of these are that they take an optional parameter. If it is \texttt{0}, the feature will be disabled, if it is \texttt{1}, it will be enabled. All these features are on by default; and are toggled if you don't give any parameter. \begin{description} \item[\texttt{-b [-{}-backup]}] If you use the \texttt{-o} switch, and the named outputfile exists, it will be renamed to \texttt{filename.bak}. \item[\texttt{-I [-{}-inputfiles]}] Execute \verb@\@\verb@input@ statements; e.g.\ include the file in the input. Our input parsing does of course nest; we use an input-stack to keep track of this. \item[\texttt{-H [-{}-headererr]}] Show errors found in front of the \verb@\begin{document}@ line. Some people keep \emph{lots} of pure \TeX\ code there, which errors can't be detected reliably (in other words, we will in most cases just produce a lot of garbage). \item[\texttt{-g [-{}-globalrc]}] Read in the global resource file. This switch may be useful together with the \texttt{-l} option. \item[\texttt{-t [-{}-tictoc]}] Display a twirling baton, to show that we're working. \texttt{-v0} does an \texttt{-t0}, too, as it assumes that the user then uses the program non-interactively. This is now a no-op. \item[\texttt{-x [-{}-wipeverb]}] Ignore the ``\verb@\verb@'' command found within the \LaTeX\ file and its argument is completely by the checking routines. This is done by simply overwriting them. If you somehow don't like that (for instance, you would like to count brackets inside those commands, too), use this switch. \end{description} \end{description} If you don't specify any input \LaTeX-files on the commandline, we'll read from \texttt{stdin}. To abort \texttt{stdin} input, press the following keycombinations: \smallskip \begin{tabular}{ll} \bf Machine & \bf Key-combination \\ UNIX & $\fbox{\texttt{Ctrl}} + \fbox{\texttt{D}}$ \\ MS-DOS & $\fbox{\texttt{Ctrl}} + \fbox{Z}$, followed by return. \end{tabular} \smallskip By default, we use GNU's \Cmd{getopt()} routine. \begin{itemize} \item Options may be given in any order; the names of the \LaTeX-files do not have to be the last arguments. This behaviour may be turned off by creating an environment variable named \Cmd{POSIXLY\_CORRECT}. \item The special argument \Cmd{-{}-} forces an end of option-scanning. \item Long-named options begin with \Cmd{-{}-} instead of \Cmd{-}. Their names may be abbreviated as long as the abbreviation is unique or is an exact match for some defined option. If they have an argument, it follows the option name in the argument, separated from the option name by a \Cmd{=}, or else the in next argument. \end{itemize} \subsubsection{The \rsrc\ file} You should also take a look at the \rsrc\ file. As it is self-documenting, you should be able to get the meaning of each keyword by simply reading the file. In fact, since not all options are described in this documentation it is necessary that you read the \rsrc\ file in order to understand them all. The method for \emph{finding it} has grown rather complex. An outline is given below. If \chktex\ finds multiple files when searching, each and every one will be read in the order specified below. The \Cmd{Keyword = \{ item item \dots \}} may thus be necessary to reset previously defined lists. In this list, \Cmd{\$foo} is assumed to be the environment variable \Cmd{foo}: \begin{enumerate} \item First, we'll take a look at the directory which was specified as \Cmd{DATADIR} during compilation. On UNIX boxes, this usually evaluates to something similar to \Cmd{/usr/local/share/chktexrc}, under MS-DOS it is set to \Cmd{\BS{}emtex\BS{}data\BS{}chktexrc}. \item Look in the following system directories: \begin{tabular}{ll} \bf Machine & \bf Directory \\ UNIX & \Cmd{\$HOME/.chktexrc} or \Cmd{\$LOGDIR/.chktexrc} \\ MSDOS & Program installation path \end{tabular} \item Look for it in the directory pointed to by an environment variable, as specified in the table below: \begin{tabularx}\linewidth{lY} \bf Machine & \bf Directory \\ UNIX & \Cmd{\$CHKTEXRC/.chktexrc} \\ MSDOS & \Cmd{\$CHKTEXRC\BS{}chktexrc}, \Cmd{\$CHKTEX\_HOME\BS chktexrc} or \Cmd{\$EMTEXDIR\BS{}data\BS{}chktexrc} \end{tabularx} \item Look for it in the current directory. On UNIX boxes, we expect the filename to be \Cmd{.chktexrc}; on other machines \Cmd{chktexrc}. \end{enumerate} If you for some reason wish to undo what the previous files may have done, you may say \Cmd{CmdLine \{ -g0 -r \}} somewhere in the \rsrc\ file; this will reset all previous settings. \subsubsection{Per Line and File Suppressions} There are many cases in which \chktex{} will give a warning about a construct which, although it usually indicates a mistake, is intentional. In these cases it can be extremely annoying to have this message appear everytime \chktex{} is run. For this reason you can use \LaTeX{} comments to suppress a certain message on a single line. This can be done by adding a (case-insensitive) comment at the end of the line of the form \begin{center} \verb+% chktex ##+ \end{center} where \verb+##+ is the number of the message to be suppressed. For example the line \begin{center} \verb+$[0,\infty)$+\\* \end{center} will produce a warning (number 9) about mismatched \verb+]+ and \verb+)+. However the lines \begin{center} \verb+$[0,\infty)$ % chktex 9+\\* \verb+$[0,\infty)$ % ChkTeX 9+\\* \end{center} will not produce such a message. In this case, message number 17 will still appear at the end, stating that the numbers of \verb+]+ and \verb+)+ don't match for the entire file. To suppress two different errors on the same line you will need two instances of \verb+chktex+ in the comment. This format is a little cumbersome, but it shouldn't be needed often, and hopefully will help avoid accidental suppressions. \begin{center} \verb+Jordan--H\"older on $[0,\infty)$ % chktex 8 chktex 9+\\* \end{center} One problem inherent in line-by-line suppressions is that during editing another error of the same type may creep into the same line. Therefore, I suggest using the \texttt{-L} or \texttt{-{}-nolinesupp} option to disallow line based suppressions once just before the document is finished. At that point you should go back over all the warnings and decide if they should be fixed. In addition to line-specific suppressions, you can create a suppression which will be in effect for the remainder of the file. This can be used, for example, to turn off warning 18 (about \verb+"+) in a file which uses a package (like \Cmd{babel}) where \verb+"+ is an active character. The syntax is nearly the same, namely \begin{center} \verb+% chktex-file ##+ \end{center} \input{ChkTeXRC.tex} \subsubsection{Hints} I've tried to collect some advice that may be useful --- if you have a favourite hint, feel free to send it to me! \begin{itemize} \item If you use \Cmd{german.sty} or several of \Cmd{babel} languages which use \verb+"+ as an active character; it may be wise to put \Cmd{-n18} in the \Cmd{CmdLine} entry in the \rsrc\ file. This will probably reduce the amount of false warnings significantly. Alternately, you can put \verb+% chktex-file 18+ in your files which use one of these packages so that other files will still have these checks performed. \item Put \Cmd{-v} in the \Cmd{CmdLine} entry of the \rsrc\ file; this makes the fancy printing the default. \item If you're working on a large project, it may pay off to make a local resource file which is included in addition to the global one. In this one, add the necessary info to reduce the amount of false warnings --- these usually don't do anything but hide the real warnings. \item Create a total ignore environment, which \chktex\ will ignore completely. In here, you can place all that code which outsmarts \chktex\ completely. For instance, add the following lines at the top of your \LaTeX\ file: \begin{verbatim} % ChkTeX will ignore material within this environment \newenvironment{ignore}{}{} \end{verbatim} In addition, you should add the item \Cmd{ignore} to the \Cmd{VerbEnvir} entry in the \rsrc\ file. \end{itemize} \subsubsection{Bugs} No fatal ones, I think, but the program currently has some problems when a \LaTeX\ command/parameter stretch over a two lines --- some extra spaces may be inserted into the input. I regard the program as fairly well tested; using the SAS/C \Cmd{cover} utility I was able to make sure that approximately 95\% of the code has actually been run successfully in the final version. This does indeed leave some lines; most of these are procedure terminating brackets or ``can't happen'' lines, though. We've got some problems when isolating the arguments of a command. Although improved, it will certainly fail in certain cases; \chktex\ can for instance not handle arguments stretching over two lines. This also means that \Cmd{WIPEARG} entries in the \rsrc\ file will only have the first half of their argument wiped if the argument stretches over two lines. We will, however, take care not to wipe parenthesis in such cases, in order to avoid false warnings. Long lines are broken up into chunks and handled separately. The exact length is platform dependent, though is guaranteed to be at least 256 bytes. The first portions of the line will have line numbers that are 1 less than they should be. Some errors can be missed and some can be added erroneously. A warning will be issued if lines are too long. Before submitting a bug report, please first see whether the problem can be solved by editing the \rsrc\ file appropriately. \subsection{ChkWEB} This shell script is provided for checking CWEB files. The template is as follows: \begin{verbatim} chkweb [options] file1 file2 ... \end{verbatim} As you may see from the script, it is only a trivial interface towards \texttt{deweb} and \chktex. It does not support any individual options on the command line --- all options found will be passed onto \chktex. If \Cmd{-{}-} or a filename is found, the remaining parameters will be ignored. The only real intelligence it features is that it will try to append \verb@.w@ to filenames it can't find. If no filenames are given, we will read from \texttt{stdin}. \subsection{DeWEB} This program strips away C code and CWEB commands from CWEB sources. It is called with the following synopsis: \begin{verbatim} deweb file1 file2 ... \end{verbatim} \texttt{deweb} filters away all C \&\ CWEB commands from a CWEB source code. This leaves only the \LaTeX\ code. This stripped code, in turn, may then be passed to a suitable syntax checker for \LaTeX, like \chktex\ and \texttt{lacheck}, or spell-checkers like \texttt{ispell}. When \texttt{deweb} strips away the C code from your CWEB source, it tries to preserve line breaks. This means that the error reports from {\it your favorite tool\/} will be correct regarding to line numbers. In most cases, the column position will also be correct. This significantly simplifies finding the errors in the \LaTeX\ source (in contrast to the output from \texttt{cweave}, which output is truly difficult to figure anything out from). \texttt{deweb} accepts a list of filenames on the argument line, and will send its output to \texttt{stdout}. If no filenames are given, it will read from stdin, acting as a filter. No options are currently accepted. Macho users may try to pipe the output from \texttt{deweb} directly into \LaTeX, theoretically, this should work. This would ease the debugging of the \LaTeX\ code significantly, as when \LaTeX\ complains about wrong syntax, you'll be able to find the erroneous line much more easily. Don't expect that the output looks very much like the final one, though. \texttt{deweb} should now understand all correct \texttt{CWEB} opcodes. If it complains about not understanding a correct opcode, please inform the author. \subsubsection{Bugs} \texttt{deweb} will not even \emph{compile} under Perl versions before perl v5. Unfortunately, this means that we can't even tell the user why we failed; Perl will just complain about not being able to compile the regexps. \section{Explanation of error messages} Below is a description of all error-messages \chktex\ outputs. Error messages set in {\it italic type\/} are turned off by default. Where margin paragraphs are listed in the text, they refer to the keyword in the \rsrc\ file which controls the discussed warning. \smallskip\pagebreak[2] \phantomsection \Keyword{Silent}\label{warn:silent} \begin{errdesc}{Command terminated with space.} You tried to terminate a command with a blank space. Usually, this is an error as these are ignored by \LaTeX. In most cases, you would like to have a real space there. You can also specify regular expressions to match commands which can safely be terminated with a space. They are specified in the \rsrc\ file in \texttt{[]}, which in some other cases is used to indicate case-insensitive matching. This is used for example to support the \verb+\startXXX+ macros of Con\TeX t. \begin{errexam} \verb@\LaTeX@\underline{\tt\ }\verb@is a typesetter.@ \\* \LaTeX is a typesetter. \\* \smallskip \verb@\LaTeX\ is a typesetter.@ \\* \LaTeX\ is a typesetter. \\* \end{errexam} \end{errdesc} \Keyword{Linker} \begin{errdesc}{Non-breaking space (`\~{}') should have been used.} When reading a document, it is not very pretty when references are split across lines. If you use the \verb@~@ character, \LaTeX\ will assign a very high penalty for splitting a line at that point. \chktex\ issues this warning if you have forgot to do this. \begin{errexam} \verb@Please refer to figure@\underline{\tt\ }\verb@\ref{foo}.@ \\* Please refer to figure 11. \\* % Gotta cheat here! :) \smallskip \verb@Please refer to figure~\ref{foo}.@ \\* Please refer to figure~11. \\* \end{errexam} \end{errdesc} \begin{errdesc}{You should enclose the previous parenthesis with `\{\}'.} This is a warning which you may ignore, but for maximum aestethic pleasure, you should enclose your bracket characters with `\{\}'s. \begin{errexam} \verb@$@\underline{\tt\ }\verb@[(ab)^{-1}]@\underline{\tt\ }\verb@\^{-2}$@ \\* $[(ab)^{-1}]^{-2}$ \\* \smallskip \verb@${[{(ab)}^{-1}]}^{-2}$@ \\* ${[(ab)^{-1}]}^{-2}$ \\* \end{errexam} \end{errdesc} \Keyword{Italic} \Keyword{ItalCmd} \Keyword{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} \Keyword{ItalCmd} \Keyword{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} \Keyword{ItalCmd} \Keyword{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} \Keyword{NumDash} \Keyword{WordDash} \Keyword{DashExcpt} \begin{errdesc}{Wrong length of dash may have been used.} This warning suggests that a wrong number of dashes may have been used. It does this by classifying the dash according to the the character in front and after the dashes. If they are of the same type, \chktex\ will determine which keyword to use in the \rsrc\ file. If not, it will shut up and accept that it doesn't know. \begin{tabular}{ll} \bf Character type & \bf Keyword in \rsrc\ file \\* Space & \texttt{WordDash} \\* Number & \texttt{NumDash} \\* Alphabetic character & \texttt{HyphDash} \\* \end{tabular} This is more or less correct, according to my references. One complication is that most often a hyphen (single dash) is desired between letters, but occasionally an n-dash (double dash) is required. This is the case for theorems named after two people e.g.\ Jordan--H\"older. A hyphen would indicate that it was one person with a hyphenated name e.g.\ Gregorio Ricci-Curbastro. If this is rare enough, it can be dealt with via line based suppressions. However, exceptions can also be handled by adding them to the \texttt{DashExcpt} list. The ``words'' in this list are considered to be correct regardless of any other settings. Adding \verb+Jordan--H\"older+ to this list will cause no warning to be issued. There is still the problem that no warning will be raised for Jordan-H\"older (unless added explicitly via regular expression), so care must still be taken. Some manuals---particularly American manuals---also suggest \emph{not} adding space around an m-dash (triple dash). Hopefully this check can be improved even more (suggestions?). \begin{errexam} \verb@It wasn't anything @\underline{\tt-}\verb@ just a 2@\underline {\tt-{}-{}-}\verb@3 star@\underline{\tt-{}-}\verb@shots.@ \\* It wasn't anything - just a 2---3 star--shots. \\* \smallskip \verb@It wasn't anything --- just a 2--3 star-shots@ \\* It wasn't anything --- just a 2--3 star-shots. \\* \end{errexam} \end{errdesc} \fmted{`\%s' expected, found `\%s'.} \begin{errdesc}{Solo `\%s' found.} Either brackets or environments don't match. \chktex\ expects to find matching brackets/environments in the same order as their opposites were found, and no closing delimiters which haven't been preceded by an opening one. While bracket matching is not an explicit error, it is usually a sign that something is wrong. \end{errdesc} \Keyword{CenterDots} \Keyword{LowDots} \begin{errdesc}{You should use `\%s' to achieve an ellipsis.} Simply typing three \Cmd{.} in a row will not give a perfect spacing between the dots. The \verb@\ldots@ is much more suitable for this. Similar problems are noted for two periods in a row (instead of three) since lacheck does. In math mode, you should also distinguish between \verb@\cdots@ and \verb@\ldots@; take a look at the example below. \begin{errexam} \newcommand{\td}{\underline{\tt...}} \verb@Foo@\td\verb@bar. $1,@\td\verb@,3$. $1+@\td\verb@+3$. $1,@% \underline{\tt\BS{}cdots}\verb@,3$.@ \\* Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. \\* \smallskip \verb@Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$.@ \\* Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. \\ \end{errexam} \end{errdesc} \phantomsection \label{warn:interword} \Keyword{Abbrev} \Keyword{CmdSpaceStyle} \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. The error will be suppressed if you have used \verb@\frenchspacing@. You can also specify case-insensitive abbreviations in \texttt{[]}, though only the first letter is actually case-insensitive. \begin{errexam} \verb@This is an example, i.e.@\underline{\tt\ }\verb@a demonstration.@ \\* This is an example, i.e. a demonstration. \\* \smallskip \verb@This is an example, i.e.\ a demonstration.@ \\* This is an example, i.e.\ a demonstration. \\* \end{errexam} \end{errdesc} \phantomsection \label{warn:intersentence} \Keyword{CmdSpaceStyle} \begin{errdesc}{Intersentence spacing (`\BS{}@') should perhaps be used.} \LaTeX's 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. The error will be suppressed if you have used \verb@\frenchspacing@. \begin{errexam} \verb@I've seen an UFO!@\underline{\tt\ }\verb@Right over there!@ \\* I've seen an UFO! Right over there! \\* \smallskip \verb+I've seen an UFO\@! Right over there!+ \\* I've seen an UFO\@! Right over there! \\* \end{errexam} \end{errdesc} \begin{errdesc}{Could not find argument for command.} \chktex\ will in some cases need the argument of a function to detect an error. As \chktex\ currently processes the \LaTeX\ file on a line-by-line basis, it won't find the argument if the command which needed it was on the previous line. On the other hand, this \emph{may} also be an error; you ought to check it to be safe. \begin{errexam} \verb@$\hat$@ \\* This will give a \LaTeX\ error\dots \\* \smallskip \verb@$\hat{a}$@ \\* $\hat{a}$ \\* \end{errexam} \end{errdesc} \begin{errdesc}{No match found for `\%s'.} This warning is triggered if we find a single, \emph{opening} bracket or environment. While bracket matching is not an explicit error, it is usually a sign that something is wrong. \end{errdesc} \Keyword{MathEnvir} \begin{errdesc}{Mathmode still on at end of LaTeX file.} This error is triggered if you at some point have turned on mathmode, and \chktex\ couldn't see that you remembered to turn it off. \end{errdesc} \begin{errdesc}{Number of `character' doesn't match the number of `character'.} Should be self-explanatory. \chktex\ didn't find the same number of an opening bracket as it found of a closing bracket. \end{errdesc} \begin{errdesc}{You should use either `` or '' as an alternative to `\,"\,'.} Self-explanatory. Look in the example, and you'll understand why. \begin{errexam} \verb@This is an @\underline{\tt"}\verb@example@\underline{\tt"} \\* This is an "example" \\* \smallskip \verb@This is an ``example''@ \\* This is an ``example'' \\* \end{errexam} \end{errdesc} \begin{errdesc*}{You should use "'" (ASCII 39) instead of "'" (ASCII 180).} On some keyboards you might get the wrong quote. This quote looks, IMHO, \emph{ugly} compared to the standard quotes, it doesn't even come out as a quote! Just see in the example. In fact, this doesn't even compile anymore, so the warning is probably obsolete. \begin{errexam} \verb@``There@\underline{\tt '}\verb@s quotes and there@\underline{\tt '}\verb@s quotes@ \underline{\tt ''} \\* % '' % ``ThereŽs quotes and thereŽs quotesŽŽ \\* % '' \smallskip \verb@``There's quotes and there's quotes''@ \\* ``There's quotes and there's quotes'' \\* \end{errexam} \end{errdesc*} \Keyword{UserWarn} \begin{errdesc}{User-specified pattern found: \%s.} A substring you've specified using \texttt{UserWarn} in the \rsrc\ file, has been found. See also warning~44 which allows using regular expressions. You can also specify case-insensitive versions in \texttt{[]}. % Normally I would use a ref here, but if the numbers change that would be % hugely backwards incompatible. Also it would require adding special label code. \end{errdesc} \begin{errdesc*}{This command might not be intended.} I implemented this because a friend of mine kept on making these mistakes. Easily done if you haven't gotten quite into the syntax of \LaTeX. \begin{errexam} \verb@\LaTeX\ is an extension of \TeX@\underline{\tt\BS.}\verb@ Right?@ \\* \LaTeX\ is an extension of \TeX\. Right? \\* \smallskip \verb@\LaTeX\ is an extension of \TeX. Right?@ \\* \LaTeX\ is an extension of \TeX. Right? \\* \end{errexam} \end{errdesc*} \begin{errdesc*}{Comment displayed.} \chktex\ dumps all comments it finds, which in some cases is useful. I usually keep all my notes in the comments, and like to review them before I ship the final version. For commenting out parts of the document, the \Cmd{comment} environment is better suited. Setting this warning allows you to see notes you have left in comments. \end{errdesc*} \begin{errdesc}{Either ''\BS,' or '\BS,'' will look better.} This error is generated whenever you try to typeset three quotes in a row; this will not look pretty, and one of them should be separated from the rest. \begin{errexam} \underline{\tt```}\verb@Hello', I heard him said'', she remembered.@ \\* ```Hello', I heard him said'', she remembered. \\* \smallskip \verb@``\,`Hello', I heard him said'', she remembered.@ \\* ``\,`Hello', I heard him said'', she remembered. \end{errexam} \end{errdesc} \Keyword{PostLink} \begin{errdesc}{Delete this space to maintain correct pagereferences.} This message, issued when a space is found in front of a \verb@\index@, \verb@\label@ or similar command (can be set in the \rsrc\ file). Sometimes, this space may cause that the word and the index happens on separate pages, if a pagebreak happens just there. Warning~42 is similar in that it warns about spaces in front of footnotes. The difference is that the warning text makes more sense for that case. \begin{errexam} \verb@Indexing text@\underline{\tt\ }\verb@\index{text} is fun!@ \\* \smallskip \verb@Indexing text\index{text} is fun!@ \\* \end{errexam} \end{errdesc} \begin{errdesc}{You might wish to put this between a pair of `\{\}'} This warning is given whenever \chktex\ finds a \Cmd{\^{ }}' or a \Cmd{\_} followed by either two or more numeric digits or two or more alphabetic characters. In most situations, this means that you've forgotten some \{\}'s. \begin{errexam} \verb@$5\cdot10^@\underline{\tt10}\verb@$@ \\* $5\cdot10^10$ \\* \smallskip \verb@$5\cdot10^{10}$@ \\* $5\cdot10^{10}$ \end{errexam} \end{errdesc} \begin{errdesc}{You ought to remove spaces in front of punctuation.} This warning is issued if \chktex\ finds space in front of an end-of-sentence character. \begin{errexam} \verb@Do you understand@\underline{\tt\ }\verb@?@ \\* Do you understand ? \\* \smallskip \verb@Do you understand?@ \\* Do you understand? \\* \end{errexam} \end{errdesc} \begin{errdesc}{Could not execute LaTeX command.} Some \LaTeX\ commands will be interpreted by \chktex; however, some of them are sensible to errors in the \LaTeX\ source. Most notably, the \verb@\@\verb@input@ command requires that the input file exist\dots \end{errdesc} \Keyword{Italic} \Keyword{ItalCmd} \Keyword{NonItalic} \begin{errdesc}{Don't use \BS/ in front of small punctuation.} Italic correction should generally \emph{not} be used in front of small punctuation characters like `.' and `,'; as it looks better when the preceding italic character leans ``over'' the punctum or comma. \begin{errexam} \verb@It is just a {\it test@\underline{\tt\BS/}\verb@}, don't think anything else.@ \\* It is just a {\it test\/}, don't think anything else. \\* \smallskip \verb@It is just a {\it test}, don't think anything else.@ \\* It is just a {\it test}, don't think anything else. \end{errexam} \end{errdesc} \begin{errdesc}{\$\BS{}times\$ may look prettier here.} In ASCII environments, it is usual to use the `x' character as an infix operator to denote a dimension. The mathemathical symbol $\times$ provided by the \verb@$\times$@ command is better suited for this. \begin{errexam} \verb@The program opens a screen sized 640@\underline{\tt x}\verb@200 pixels.@ \\* The program opens a screen sized 640x200 pixels. \\* \smallskip \verb@The program opens a screen sized $640\times200$ pixels.@ \\* The program opens a screen sized $640\times200$ pixels. \end{errexam} \end{errdesc} \begin{errdesc*}{Multiple spaces detected in output.} This warning, intended for the novice, will remind you that even if you \emph{type} multiple spaces in your input, only a single space will come out. Some ways to come around this is listed below. \begin{errexam} \verb@White is a beautiful colour.@ \\* White is a beautiful colour. \\* \smallskip \verb@White~~~~~{ }{ }{ }\ \ \ is a beautiful colour.@ \\* White~~~~~{ }{ }{ }\ \ \ is a beautiful colour. \\ \end{errexam} \end{errdesc*} \Keyword{VerbEnvir} \begin{errdesc}{This text may be ignored.} Certain implementations of the \verb@verbatim@ environment and derivations of that, ignore all text on the same line as \verb@\end{verbatim}@. This will warn you about this. \end{errdesc} \fmted{Use ` to begin quotation, not '.}\hfill\\ \fmted{Use ' to end quotation, not `.}\hfill\\ \begin{errdesc}{Don't mix quotes.} Proper quotations should start with a \verb@`@ and end with a \verb@'@; anything else isn't very pretty. Both these warnings are relative to this; look in the example below. \begin{errexam} \verb@There are @\underline{\tt`'}% \verb@examples'' and there are ``examples@\underline{\tt``}\verb@.@ \\* There are `'examples'' and there are ``examples``. \\* \smallskip \verb@There are ``examples'' and there are ``examples''.@ \\* There are ``examples'' and there are ``examples''. \end{errexam} \end{errdesc} \Keyword{MathRoman} \begin{errdesc}{You should perhaps use `cmd' instead.} Most mathematical operators should be set as standard roman font, instead of the math italic \LaTeX\ uses for variables. For many operators, \LaTeX\ provides a pre-defined command which will typeset the operator correctly. Look below for an illustration of the point. \begin{errexam} \verb@$@\underline{\tt sin}\verb@^2 x + @\underline{\tt cos}\verb@^2 x = 1$@ \\* $sin^2 x + cos^2 x= 1$ \\* \smallskip \verb@$\sin^2 x + \cos^2 x = 1$@ \\* $\sin^2 x + \cos^2 x = 1$ \end{errexam} \end{errdesc} \fmted{You should put a space in front of/after parenthesis.}\hfill\\ \begin{errdesc}{You should avoid spaces in front of/after parenthesis.} Outside math mode, you should put a space in front of any group of opening parenthesis, and no spaces after. If you have several after each other, you should of course not put a space in between each; look in the example below. Likewise, there should not be spaces in front of closing parenthesis, but there should be at least one after. \begin{errexam} \verb@This@\underline{\tt( }\verb@an example@\underline{\tt( }% \verb@Nuff said@\underline{\tt\ }\verb@)), illustrates@\underline{\tt( }% \verb@``my''@\underline{\tt\ )}\verb@point.@\\ This( an example( Nuff said )), illustrates( ``my'' )point. \\ \smallskip \verb@This (an example (Nuff said)), illustrates (``my'') point.@\\ This (an example (Nuff said)), illustrates (``my'') point.\\ \end{errexam} \end{errdesc} \Keyword{QuoteStyle} \begin{errdesc}{You should not use punctuation in front of/after quotes.} % For best looking documents, you should decide on how you wish to put quotes relative to punctuation. \chktex\ recognizes two styles; you may specify which you use in the \rsrc\ file. A description on each style follows: \begin{description} \item[Traditional:] This style is the most visually pleasing. It always puts the punctuation \emph{in front of} the quotes, which gives a continuous bottom line. However, it may in certain cases be ambigious. Consider the following example from a fictious \Cmd{vi(1)} tutorial (quote taken from the Jargon file): \begin{center} \verb@Then delete a line from the file by typing ``dd.''@ \\* Then delete a line from the file by typing ``dd.'' \end{center} That would be very bad --- because the reader would be prone to type the string d-d-dot, and it happens that in \Cmd{vi(1)} dot repeats the last command accepted. The net result would be to delete \emph{two} lines! This problem is avoided using logical style, described below. \pagebreak[3] \item[Logical:] This style uses quotes as balanced delimiters like parentheses. While this is not the most visual pleasing, it is can't be misunderstood. The above sentence would then become: \nopagebreak \begin{center} \verb@Then delete a line from the file by typing ``dd''.@ \\* Then delete a line from the file by typing ``dd''. \end{center} \nopagebreak \end{description} \end{errdesc} \begin{errdesc}{Double space found.} This warning is triggered whenever \chktex\ finds a space in front of a hard space, or vice versa. This will be rendered as two spaces (which you usually don't wish). \begin{errexam} \verb@For output codes, see table@\underline{\tt\ }% \verb@~@\underline{\tt\ }\verb@\ref{foo}.@ \\* For output codes, see table ~ 1.1.\\* \smallskip \verb@For output codes, see table~\ref{foo}.@ \\* For output codes, see table~1.1. \end{errexam} \end{errdesc} \Keyword{MathEnvir} \begin{errdesc}{You should put punctuation outside inner/inside display math mode.} As recommended in the \TeX{}book, you should try to put punctuation outside inner math mode, as it is formatted better. Similarily, you should let any final punctuation in display math mode end up within it. Look at the following example, which was taken from the \TeX{}book: \begin{errexam} \verb@for $x = a@\underline{\tt,}\verb@b$, or $c$.@\\* for $x = a,b$, or $c$. \\* \smallskip \verb@for $x = a$, $b$, or $c$.@\\* for $x = a$, $b$, or $c$.\\* \end{errexam} \end{errdesc} \Keyword{Primitives} \begin{errdesc*}{You ought to not use primitive TeX in LaTeX code.} This warning is triggered whenever you use a raw \TeX\ command which has been replaced by a \LaTeX\ equivalent. If you consider yourself a purist (or want to be sure your code works under \LaTeX3), you should use the \LaTeX\ equivalent. \end{errdesc*} \Keyword{NotPreSpaced} \begin{errdesc}{You should remove spaces in front of `\%s'} Some commands should not be prepended by a space character, for cosmetical reasons. This notes you of this whenever this has happened. \begin{errexam} \verb@This is a footnote@\underline{\tt\ }\verb@\footnotemark[1] mark.@\\* This is a footnote ${}^1$ mark. \\* \smallskip \verb@This is a footnote\footnotemark[1] mark.@\\* This is a footnote${}^1$ mark. \\* \end{errexam} \end{errdesc} \Keyword{NoCharNext} \begin{errdesc}{`\%s' is normally not followed by `\%c'.} \LaTeX' error message when calling \verb@\left \{@ instead of \verb@left \{@ is unfortunately rather poor. This warning detects this and similar errors. \end{errdesc} \Keyword{UserWarnRegex} \begin{errdesc}{User Regex:\ \%s.} A pattern you've specified using \texttt{UserWarnRegex} in the \rsrc\ file, has been found. See also warning~20 which allows specification of simple string matching. Depending on how \chktex\ was configured, you can use either PCRE regular expressions, POSIX extended regular expressions, or none at all. A warning will be issued if \chktex\ was built without regular expression support, but you try to use one. By default the matching portion of the line is printed to help distinguish between user specified regular expressions. However, if the regular expression begins with a PCRE comment (which has a syntax of \verb+(?#+~\dots~\verb+)+), then that comment will be printed instead. This can be used to remind yourself why you were searching for the problem or how to fix it. This applies even if POSIX regular expressions are used since \chktex\ itself parses a single initial PCRE-style comment. \emph{Note:} If a regular expression (not a comment) starts with \texttt{PCRE:} or \texttt{POSIX:} it will be used only if support for that regular expression engine has been compiled in. It is primarily meant to make testing easier but, can be used to allow better regular expressions if PCRE is available. If you want a regular expression that starts with \texttt{PCRE:} or \texttt{POSIX:} then you can enclose one of the characters in brackets like \texttt{[P]CRE:}. An example, included in the \rsrc\ file, is given below. Remember that you have to escape (with~\verb+!+) spaces and \verb+#+ as well as a few other characters. One should always use \verb+\nmid+ instead of \verb+\not\mid+ because the results are much better. \begin{errexam} \verb+\\not! *(\||\\mid)+\\* \verb+User Regex: \not\mid.+\\* \end{errexam} or with an initial comment \begin{errexam} \verb+(?!#Always! use! \nmid)\\not! *(\||\\mid)+\\* \verb+User Regex: Always use \nmid.+ \end{errexam} You can use \verb+% chktex 44+ to suppress user regular expression warnings on a given line, but this is often undesirable since all such warnings are suppressed this way. For this reason you can ``name'' user regular expression warnings with negative numbers. For example \verb+% chktex 4+ will suppress the system warning number 4, but \verb+% chktex -4+ will suppress the user regular expression warning number 4. Since one might wish to add, remove, or rearrange user warnings in the \rsrc\ file, you must explicitly name particular warnings rather than relying on position in that file. In order to name one, include an initial PCRE-style comment with the first characters being a number (positive or negative---the absolute value will be used). The numbers are limited by the number of bits in a \texttt{long}, usually giving 1--63 as possible names. You can give more than one regular expression the same name, and suppressing that name will suppress all regular expressions with that name. Using the example from before, all of the following will be suppressed with \verb+% chktex -4+. Note that the name \emph{will} be printed as written so that you know which number to suppress. \begin{errexam} \verb+(?!#4:Always! use! \nmid)\\not! *(\||\\mid)+\\* \verb+(?!#-4Always! use! \nmid)\\not! *(\||\\mid)+\\* \verb+(?!#-4! Always! use! \nmid)\\not! *(\||\\mid)+\\* \end{errexam} \end{errdesc} \begin{errdesc}{Use \textbackslash[ ... \textbackslash] instead of \$\$ ... \$\$.} In \LaTeX\ documents, using \verb+\[...\]+ is strongly preferred over \verb+$$...$$+. This is because using \verb+$$+ will change the vertical spacing in the equations making them inconsistent. \end{errdesc} \begin{errdesc*}{Use \textbackslash( ... \textbackslash) instead of \$ ... \$.} In \LaTeX\ documents using \verb+\(...\)+ is slightly preferred over \verb+$...$+. Some error messages might be clearer with \verb+\(...\)+. \end{errdesc*} \fmted{`\%s' expected, found `\%s' (ConTeXt).} \begin{errdesc}{Solo `\%s' found (ConTeXt).} % \begin{errdesc}{`\%s' expected, found `\%s' (ConTeXt).} Similar to warnings~9 and 10, these tracks environments, but Con\TeX{}t{} environments rather than \LaTeX. They are tracked as separate messages to allow being turned on and off independently thereby allowing people to use macros that start with \verb+\start+. \end{errdesc} \begin{errdesc}{Expected math mode to be \%s here.} Similar to warning~16, this warns when \chktex{} got confused about math mode. In theory, for a well formed \LaTeX{} document this should never happen, but the following (invalid) documents will cause the warning. This is because the \verb+$+ will exit math mode (which \verb+\ensuremath+ entered), and then exiting \verb+\ensuremath+ finds that we are in text mode which shouldn't happen. \begin{errexam} \verb+\ensuremath{ \frac{x}{3} $ y\times 7}+\\* \end{errexam} \end{errdesc} \section{Future plans} In a somewhat prioritized sequence, this is what I'd like to put into the program --- if I have the time. \begin{itemize} \item De-linearize the checker. Currently, it works on a line-by-line basis, in most respects, at least. I hope to be able to remove this barrier; as this will reduce the amount of false warnings somewhat. \item Probably some more warnings/errors; just have to think them out first. Suggestions are appreciated --- I've ``stolen'' most that similar programs provides, and am running out of ideas, really. It would also be nice to investigate the field of ``globally'' oriented warnings; i.e.\ warnings regarding the document as a whole. Currently, \chktex\ operates mainly on a local/``greedy'' basis. If you have suggestions/ideas on this topic, they're certainly welcome, including references to literature. \item Fix a few more bugs. \end{itemize} \section{Notes} \subsection{Wish to help?} As most other living creatures, I have only a limited amount of time. If you like \chktex\ and would like to help improving it, here's a few things I would like to receive. The following ideas are given: \begin{itemize} \item Does anyone have a $\mbox{\LaTeX}\rightarrow \mbox{\texttt{troff}}$ conversion program? It would be really nice if I could extract the relevant sections from this manual, and present them as a man page. I will not, however, convert this manual to \TeX{}info in order to be able to do this; IMHO \TeX{}info documents have far too limited typographic possibilities. This doesn't mean that I'm not willing to restructure the document at all. This manual already uses some kind of preprocessing in order to achieve HTML output via \LaTeX2\texttt{html}, I'm willing to do the same in order to produce \texttt{troff} output. \item Help me port the program! This is a prioritized one. It's no fun writing ANSI C when people haven't got a C compiler. Of course, I'll provide whatever help necessary to modify the sources to fit to the new platform. Take contact if you're interested. I will include your compiled binary in the distribution, and give you credit where appropiate. Just one request: If you have to modify the sources in order to make \chktex\ compile \& work on the new platform, \emph{please} enclose your changes in something like \Cmd{\#ifdef \_\_PLATFORM\_\_\dots code\dots\#endif}! It makes life so much easier later, when we try to merge the two source trees. \item Reports on problems configuring and compiling \chktex\ on supported (and unsupported) systems are welcomed. \item Filters for other file formats. I do believe that there are several formats using \LaTeX\ for its formatting purposes, combining that with something else. If you can write a program or script which filters everything away but the \LaTeX\ code, it will surely be appreciated (and included). Look at the \verb@deweb@ script to see what I mean. \item Interfaces for other editors are also welcomed. \item If you update the \rsrc\ file in anyway that is not strictly local, I would appreciate to receive your updated version. \item Suggestions for new warnings are always welcomed. Both formal (i.e.\ regexps or similar) and non-formal (plain English) descriptions are welcomed. \end{itemize} Of course, people doing any of this will be mentioned in this document, and thus receive eternal glory and appreciation. \subsection{Caps and stuff} Where trademarks have been used, the author is aware of that they belong to someone, and has tried to stick to the original caps. \section{About the author} A quick summary of who I am and what I do: I'm 21 years old, and live in Oslo, the capital of Norway. I'm currently studying maths and computer science at the University~of~Oslo; planning to get a degree within mathematical modeling, with a dash of physics and emphazing the computer part of the study. More precisely, in autumn'96 my studies consist of mathematical analysis, statistics \& probability calculations plus studying the relationship between society and computers. At home I now possess 4 computers, of which 1 is regular use: A vanilla Amiga 1200, expanded only by a HD\@. The others are a \texttt{80286} PC and an Amiga 500, both semi-out-of-order. The last one is a Commodore VIC-20, which for some peculiar reason never seems to be used. Plans are to get a Linux-capable PC, though. Most of the time in front of these computers (including SGI Indy's and SPARC stations at our university) is spent on C and shell programming, plus some text-processing. % I am also involved in writing the document % for {\sc Isaac} --- Interactive Simulation as an Alternative to % Advanced Calculations. This is planned to help newcomers to physics, % by providing a computer program which enables one to simulate most % experiments relating to classical mechanics. % C and shell programming are not my only knowledge areas regarding computers, however. I write the following languages more or less: Perl, Motorola \texttt{68000} assembly code, ARexx, Simula, C++, \LaTeX, HTML, AmigaGuide, Amos Basic and Installer LISP\@. Once I also mastered Commodore Basic V2, the ``language'' included with my VIC-20. However, I also try to not to end up as a computer nerd. Thus, in addition to the compulsory (?) interest for computers, I am a scout. Still running into the woods, climbing the trees, falling down and climbing up once more, in other words. To be more specific, I am a now a troop leader for `Ulven' scout-group; Norwegian Scouts Association. I am also a active rover in `V{\aa}lerenga' scout-group. Certainly a lot more to tell (I play the piano and like cross-country skiing, for instance); but I'll stop here before you fall asleep\dots \section{Thanks} The author wishes to thank the following people (in alphabetical order): \def\Name#1#2{% \item[] \setbox0=\hbox{ \begin{tabular}{l} \textbf{#1} \\ \texttt{#2} \\ \end{tabular} } \usebox0\\ } \begin{description} \Name{Russ Bubley}{russ@scs.leeds.ac.uk} He has been the main external beta-tester for this program, sending me loads and loads of understandable and reproducible bug reports. If you somehow think that \chktex\ is well-behaved and free from bugs, send warm thoughts to Russ. He has also provided ideas for enhanced checks and so forth. In addition, he sent me a huge list of 238 common English abbreviations, for inclusion in the \rsrc\ file! Together with the enhanced abbreviation recognizer, I do now believe most abbreviations should be caught\dots Finally, he has also given me valuable hints for improving the program's outputting routine, and given me lots of suggestions for filtering unnecessary/false warnings away. \Name{Gerd B\"ohm}{Gerd.Boehm@physik.uni-regensburg.de} Improved and bug-fixed the MS-DOS port of \chktex\ v1.4, sending me ready-to-yank code patches. The original port didn't respect all the peculiarities of the MS-DOS file-system, unfortunately. \Name{Antonio DiCesare}{dicesare@vodafone.it} He provided many feature requests and bug reports for the 1.7.1 version making it a much better release than it would have otherwise been. He also helped expand several keywords in the \rsrc\ file. \Name{Mojca Miklavec}{mojca.miklavec.lists@gmail.com} Found and helped debug a problem (fixed in 1.7.2) occurring only on some platforms, 32 bit Macs for one. \Name{Baruch Even}{chktex@ev-en.org} Maintainer of \chktex\ for about a decade. \Name{Lars Frellesen}{frelle@math-tech.dk} Sent a few bug reports regarding the filtering of messages. He has also helped me to expand the \Cmd{SILENT} keyword in the \rsrc\ file. \Name{Wolfgang Fritsch}{fritsch@hmi.de} Author of the OS/2 port, which he did using the emx compiler. Please direct questions regarding strictly to that port to him (I would like to receive a carbon copy, though). \Name{Stefan Gerberding}{stefan@inferenzsysteme.informatik.th-darmstadt.de} First one to report the Enforcer hit in v1.2 when using \chktex\ as a pipe. Also came with suggestions to make \chktex\ more easily compile on early gcc compilers. He has also kept on beta-testing later versions of \chktex, giving me bug-reports and enhancements requests. \Name{Kasper B. Graversen}{kbg2001@internet.dk} Lots of creative suggestions and improvements. Several of the warnings implemented were based on his ideas. In addition, he has given advice for improving the existing warnings. Has also provided some OS-oriented code. \Name{Frank Luithle}{f\_luithle@outside.sb.sub.de} Wrote a translation for v1.0. Unfortunately, he remained unreachable after that\dots:-/ \Name{Nat}{nat@nataa.frmug.fr.net} Reported the same bug as Gerberding. In addition, he taught me a few tricks regarding the use of gcc + made me understand that the ANSI standard isn't unambigious; at least the \verb@getenv()@ call seem to be open for interpretations. Many possible incompatibilities have been removed due to these lessons. \Name{Michael Sanders}{sanders@umich.edu} Has found some of the bugs in this beast; both obscure and long-lived. Has also provided motivation to clarify this document. \Name{Bj\o rn Ove Thue}{bjort@ifi.uio.no} Author of the MSDOS port; please direct questions regarding strictly to that port to him (I would like to receive a carbon copy, though). \Name{Martin Ward}{Martin.Ward@durham.ac.uk} Sent a few bug-reports; also gave me information upon where to find regexp code. He also provided a Perl script for checking ordinary text, which ideas I was able to implement in \chktex. In addition, he sent me the source code for \verb@lacheck@; which also inspired some of the warnings. \end{description} %endlatex \section{Contacting the author} If you wish to contact me for any reason or would like to participate in the development of \chktex, please write to: %latex \begin{samepage} %endlatex \begin{quote} Jens Berger \\ Spektrumvn. 4 \\ N-0666 Oslo \\ Norway \\ E-mail: \texttt{} \end{quote} %latex \end{samepage} %endlatex Any signs of intelligent life are welcomed; that should exclude piracy. Since the original author is unreachable, the maintainer these days is: %latex \begin{samepage} %endlatex \begin{quote} Ivan Andrus \\ E-mail: \texttt{} \end{quote} %latex \end{samepage} %endlatex \medskip\noindent Have fun. \end{document} % The "Make" target is my own. % Local Variables: % TeX-command-default: "Make" % TeX-master: "ChkTeX.tex" % End: chktex-1.7.9/MakeHTML.pl000644 000767 000024 00000000376 14613043276 015543 0ustar00iandrusstaff000000 000000 # Remove parts of code enclosed in %latex/%endlatex tags $latexonly = 0; while(<>) { $latexonly = 1 if /^%latex/i; $latexonly = 0 if /^%endlatex/i; if($latexonly) { if(/^%!(.*)/) { print $1; } } else { print; } } chktex-1.7.9/README000644 000767 000024 00000001775 14613043276 014530 0ustar00iandrusstaff000000 000000 ChkTeX ====== ChkTeX is a tool to check for common errors in LaTeX files. It also supports checking CWEB files (uses a perl5 script). It is highly customizable allowing you turn off any warnings you don't like, as well as add your own warnings. It works easily with Emacs and AUCTeX, but should also be easy to interface with other editors. If you have interfaced ChkTeX with another editor, please contribute how you did it. It is important to remember that ChkTeX is only intended as a *guide* to fixing faults. It is by no means always correct. This means that correct LaTeX code may produce errors in ChkTeX, and vice versa: incorrect LaTeX code may pass silently through. If you have ideas for new warnings or ways in which current warnings could be improved, please report them on the [bug tracker](https://savannah.nongnu.org/bugs/?group=chktex). For complete documentation see [the manual](http://www.nongnu.org/chktex/ChkTeX.pdf). ChkTeX is released under the GNU Public License version 2 or greater. chktex-1.7.9/Test.nore.out000644 000767 000024 00000070537 14613043276 016264 0ustar00iandrusstaff000000 000000 Message 30 in Test.tex: Multiple spaces detected in input. o To test the program upon it ^^^ Message 30 in Test.tex: Multiple spaces detected in input. o To show off some of the features ^^^ Message 22 in Test.tex: Comment displayed. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ^ Message 22 in Test.tex: Comment displayed. % Warning 1 ^ Message 1 in Test.tex: Command terminated with space. \foo This is an error. ^ Message 1 in Test.tex: Command terminated with space. So is this \foo ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. \smallskip This is a not. $\foo Neither$ is this. ^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 2 ^ Message 2 in Test.tex: Non-breaking space (`~') should have been used. This is a faulty reference to \ref{foo} ^ Message 22 in Test.tex: Comment displayed. % Warning 3 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $[(ab)^{-1}]^{-2}$ is not beautiful ^^^^^^^^^^^^^^^^^^ Message 3 in Test.tex: You should enclose the previous parenthesis with `{}'. $[(ab)^{-1}]^{-2}$ is not beautiful ^ Message 3 in Test.tex: You should enclose the previous parenthesis with `{}'. $[(ab)^{-1}]^{-2}$ is not beautiful ^ Message 30 in Test.tex: Multiple spaces detected in input. $[(ab)^{-1}]^{-2}$ is not beautiful ^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. ${{[{(ab)}^{-1}]}}^{-2}$ is beautiful ^^^^^^^^^^^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 4-6, 28 ^ Message 6 in Test.tex: No italic correction (`\/') found. Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^ Message 42 in Test.tex: You should remove spaces in front of `\/' Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^^ Message 28 in Test.tex: Don't use \/ in front of small punctuation. Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^^ Message 42 in Test.tex: You should remove spaces in front of `\/' Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^ Message 5 in Test.tex: Italic correction (`\/') found more than once. Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^^ Message 22 in Test.tex: Comment displayed. % LaTeX2e ^ Message 42 in Test.tex: You should remove spaces in front of `\/' Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^^ Message 42 in Test.tex: You should remove spaces in front of `\/' Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing \textem{italic\/} in this \textit{sentence}, as \textem{you see}. ^^ Message 22 in Test.tex: Comment displayed. % Warning 7 ^ Message 7 in Test.tex: Accent command `\'' needs use of `\i'. This \'is a test of $\hat{j}$ accents. ^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. This \'is a test of $\hat{j}$ accents. ^^^^^^^^^ Message 7 in Test.tex: Accent command `\hat' needs use of `\jmath'. This \'is a test of $\hat{j}$ accents. ^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. This \'{\i}s a test of $\hat{\jmath}$ accents. ^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 8 ^ Message 8 in Test.tex: Wrong length of dash may have been used. It wasn't anything - just a 2---3 star--shots. ^ Message 8 in Test.tex: Wrong length of dash may have been used. It wasn't anything - just a 2---3 star--shots. ^^^ Message 8 in Test.tex: Wrong length of dash may have been used. It wasn't anything - just a 2---3 star--shots. ^^ Message 22 in Test.tex: Comment displayed. % From Knuths TeXbook Chapter 14 ^ Message 22 in Test.tex: Comment displayed. % "How TeX Breaks Paragraphs into Lines", fourth paragraph: ^ Message 22 in Test.tex: Comment displayed. % Using DashExcpt ^ Message 8 in Test.tex: Wrong length of dash may have been used. The Birch--Swinnerton--Dyer conjecture is not correct. ^^ Message 8 in Test.tex: Wrong length of dash may have been used. The Birch--Swinnerton--Dyer conjecture is not correct. ^^ Message 8 in Test.tex: Wrong length of dash may have been used. The Birch-Swinnerton-Dyer conjecture is not correct (is now caught). ^ Message 22 in Test.tex: Comment displayed. % Warning 9-10 ^ Message 22 in Test.tex: Comment displayed. % Brackets: ^ Message 37 in Test.tex: You should avoid spaces in front of parenthesis. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `)' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `}' found. )}{[])} }}}]]]))) ^ Message 9 in Test.tex: `}' expected, found `)'. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `}' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `}' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `}' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `}' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `]' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `]' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `]' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `)' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `)' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `)' found. )}{[])} }}}]]]))) ^ Message 22 in Test.tex: Comment displayed. % Envs: ^ Message 9 in Test.tex: `baz' expected, found `quux'. \begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo} ^^^^ Message 9 in Test.tex: `quux' expected, found `baz'. \begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo} ^^^^ Message 10 in Test.tex: Solo `asoi' found. \begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo} ^^^^ Message 22 in Test.tex: Comment displayed. % Warning 47 -- ConTeXt environment mismatch -- split from 9 ^ Message 1 in Test.tex: Command terminated with space. \stoptext ^ Message 47 in Test.tex: `section' expected, found `text' (ConTeXt). \stoptext ^^^^ Message 1 in Test.tex: Command terminated with space. \starttext ^ Message 22 in Test.tex: Comment displayed. % (Un)fortunately, this is not an error ^ Message 1 in Test.tex: Command terminated with space. \startbar ^ Message 1 in Test.tex: Command terminated with space. \stopbar ^ Message 22 in Test.tex: Comment displayed. % Warning 11 ^ Message 11 in Test.tex: You should use \ldots to achieve an ellipsis. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^^^^ Message 11 in Test.tex: You should use \ldots to achieve an ellipsis. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^^^^ Message 11 in Test.tex: You should use \cdots to achieve an ellipsis. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^^^^^^^ Message 11 in Test.tex: You should use \ldots to achieve an ellipsis. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^^^^^^^^^^^^^^^ Message 11 in Test.tex: You should use \cdots to achieve an ellipsis. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$. ^^^^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$. ^^^^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$. ^^^^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$. ^^^^^^^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 12 ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 22 in Test.tex: Comment displayed. % Bug 54751 ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. Mr. ``X'' and Mrs. \(Y\) ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. Mr. ``X'' and Mrs. \(Y\) ^ Message 22 in Test.tex: Comment displayed. % ignore commands by default ^ Message 22 in Test.tex: Comment displayed. % Bug 65500 ^ Message 22 in Test.tex: Comment displayed. % Warning 13 ^ Message 13 in Test.tex: Intersentence spacing (`\@') should perhaps be used. Look at THIS! It's an error. ^ Message 22 in Test.tex: Comment displayed. % after frenchspacing it's not an error ^ Message 22 in Test.tex: Comment displayed. % warning again ^ Message 13 in Test.tex: Intersentence spacing (`\@') should perhaps be used. Look at THIS! It's an error. ^ Message 22 in Test.tex: Comment displayed. % ignore commands by default ^ Message 21 in Test.tex: This command might not be intended. Look at \THIS\@! It's not an error. D. E. Knuth. ^^ Message 22 in Test.tex: Comment displayed. % Warning 14 ^ Message 1 in Test.tex: Command terminated with space. \hat ^ Message 14 in Test.tex: Could not find argument for command. \hat ^^^^ Message 22 in Test.tex: Comment displayed. % Warning 18,19 ^ Message 18 in Test.tex: Use either `` or '' as an alternative to `"'. Is this an "example", or is it an ŽexampleŽ. ^ Message 18 in Test.tex: Use either `` or '' as an alternative to `"'. Is this an "example", or is it an ŽexampleŽ. ^ Message 19 in Test.tex: Use "'" (ASCII 39) instead of "Ž" (ASCII 180). Is this an "example", or is it an ŽexampleŽ. ^ Message 19 in Test.tex: Use "'" (ASCII 39) instead of "Ž" (ASCII 180). Is this an "example", or is it an ŽexampleŽ. ^ Message 22 in Test.tex: Comment displayed. % Warning 20 ^ Message 20 in Test.tex: User-specified pattern found: \unknown. That bug is \unknown\ to me. ^^^^^^^^ Message 22 in Test.tex: Comment displayed. % That bug is \unknown\ to me. ^ Message 22 in Test.tex: Comment displayed. % Warning 21 ^ Message 21 in Test.tex: This command might not be intended. \LaTeX\ is an extension of \TeX\. Right? ^^ Message 22 in Test.tex: Comment displayed. % Warning 23 ^ Message 23 in Test.tex: Either `\,`` or ``\,` will look better. ```Hello', I heard him said'', she remembered. ^^^ Message 22 in Test.tex: Comment displayed. % Warning 24 ^ Message 24 in Test.tex: Delete this space to maintain correct pagereferences. Indexing text \index{text} is fun! ^ Message 22 in Test.tex: Comment displayed. Indexing text% ^ Message 30 in Test.tex: Multiple spaces detected in input. \index{text} is fun! ^^^^ Message 24 in Test.tex: Delete this space to maintain correct pagereferences. \index{text} is fun! ^ Message 22 in Test.tex: Comment displayed. % Warning 25 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $5\cdot10^10$ ^^^^^^^^^^^^^ Message 25 in Test.tex: You might wish to put this between a pair of `{}' $5\cdot10^10$ ^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $5\cdot10^{10}$ ^^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 26 ^ Message 26 in Test.tex: You ought to remove spaces in front of punctuation. Do you understand ? ^ Message 22 in Test.tex: Comment displayed. % Warning 27 ^ Message 1 in input.tex: Command terminated with space. \this is a test of whether the file is actually inputted... ^ Message 11 in input.tex: You should use \ldots to achieve an ellipsis. \this is a test of whether the file is actually inputted... ^^^ Message 1 in input.tex: Command terminated with space. \this is a test of whether the file is actually inputted... ^ Message 11 in input.tex: You should use \ldots to achieve an ellipsis. \this is a test of whether the file is actually inputted... ^^^ Message 22 in input/file: Comment displayed. % -*- TeX -*- ^ Message 22 in input/file: Comment displayed. % chktex-file 22 ^ Message 22 in Test.tex: Comment displayed. % Warning 29 ^ Message 29 in Test.tex: $\times$ may look prettier here. The program opens a screen sized 640x200 pixels ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. The program opens a screen sized $640\times200$ pixels ^^^^^^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Approximately $\frac{2x}{1+x}$ $x$s shouldn't be errors. ^^^^^^^^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Approximately $\frac{2x}{1+x}$ $x$s shouldn't be errors. ^^^ Message 22 in Test.tex: Comment displayed. % Warning 30 ^ Message 30 in Test.tex: Multiple spaces detected in input. White is a beautiful colour. ^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 31 ^ Message 31 in Test.tex: This text may be ignored. \end{verbatim} foo bar ^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 32-34 ^ Message 32 in Test.tex: Use ` to begin quotation, not '. This is either an 'example`, an ''example`` or an `"`example'`'. ^ Message 33 in Test.tex: Use ' to end quotation, not `. This is either an 'example`, an ''example`` or an `"`example'`'. ^ Message 32 in Test.tex: Use ` to begin quotation, not '. This is either an 'example`, an ''example`` or an `"`example'`'. ^^ Message 33 in Test.tex: Use ' to end quotation, not `. This is either an 'example`, an ''example`` or an `"`example'`'. ^^ Message 34 in Test.tex: Don't mix quotes. This is either an 'example`, an ''example`` or an `"`example'`'. ^^^ Message 34 in Test.tex: Don't mix quotes. This is either an 'example`, an ''example`` or an `"`example'`'. ^^^ Message 22 in Test.tex: Comment displayed. % Warning 35 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $sin^2 + cos^2 = 1$ ^^^^^^^^^^^^^^^^^^^ Message 35 in Test.tex: You should perhaps use `\sin' instead. $sin^2 + cos^2 = 1$ ^^^ Message 35 in Test.tex: You should perhaps use `\cos' instead. $sin^2 + cos^2 = 1$ ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $\sin^2 + \cos^2 = 1$ ^^^^^^^^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 36-37 ^ Message 36 in Test.tex: You should put a space in front of parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 37 in Test.tex: You should avoid spaces after parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 36 in Test.tex: You should put a space in front of parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 37 in Test.tex: You should avoid spaces after parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 37 in Test.tex: You should avoid spaces in front of parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 36 in Test.tex: You should put a space in front of parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 37 in Test.tex: You should avoid spaces after parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 37 in Test.tex: You should avoid spaces in front of parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 36 in Test.tex: You should put a space after parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 22 in Test.tex: Comment displayed. % Warning 38 ^ Message 38 in Test.tex: You should not use punctuation in front of quotes. ``An example,'' he said, ``would be great.'' ^ Message 38 in Test.tex: You should not use punctuation in front of quotes. ``An example,'' he said, ``would be great.'' ^ Message 22 in Test.tex: Comment displayed. % Warning 39 ^ Message 39 in Test.tex: Double space found. For output codes, see table ~\ref{tab:fmtout}. ^ Message 22 in Test.tex: Comment displayed. % Warning 40 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $\this,$ and $$this$$. ^^^^^^^^ Message 40 in Test.tex: You should put punctuation outside inner math mode. $\this,$ and $$this$$. ^ Message 45 in Test.tex: Use \[ ... \] instead of $$ ... $$. $\this,$ and $$this$$. ^^^^^^^^ Message 40 in Test.tex: You should put punctuation inside display math mode. $\this,$ and $$this$$. ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $\this$, and $$this.$$ ^^^^^^^ Message 45 in Test.tex: Use \[ ... \] instead of $$ ... $$. $\this$, and $$this.$$ ^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 41 ^ Message 1 in Test.tex: Command terminated with space. foo \above qux ^ Message 41 in Test.tex: You ought to not use primitive TeX in LaTeX code. foo \above qux ^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 42 ^ Message 42 in Test.tex: You should remove spaces in front of `\footnote' This is a footnote \footnote{foo}. ^ Message 22 in Test.tex: Comment displayed. This is a footnote% ^ Message 22 in Test.tex: Comment displayed. % Warning 43 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Here is a mistake $\left{x\right}$. ^^^^^^^^^^^^^^^^ Message 43 in Test.tex: `\left' is normally not followed by `{'. Here is a mistake $\left{x\right}$. ^^^^^ Message 43 in Test.tex: `\right' is normally not followed by `}'. Here is a mistake $\left{x\right}$. ^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. This one triggers warning 22 $\left\{x\right\}$. ^^^^^^^^^^^^^^^^^^ Message 21 in Test.tex: This command might not be intended. This one triggers warning 22 $\left\{x\right\}$. ^^ Message 21 in Test.tex: This command might not be intended. This one triggers warning 22 $\left\{x\right\}$. ^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Here \chktex\ doesn't complain $\left\lbrace x\right\rbrace$. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 44 -- user regex -- default message ^ Message 22 in Test.tex: Comment displayed. % Warning 44 -- user regex -- user message ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. For every $p\not|n$ you have an ugly prime which doesn't divide $n$. ^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. For every $p\not|n$ you have an ugly prime which doesn't divide $n$. ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. For every $p\nmid n$ you have a cute prime which doesn't divide $n$. ^^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. For every $p\nmid n$ you have a cute prime which doesn't divide $n$. ^^^ Message 22 in Test.tex: Comment displayed. % Warning about optional arguments inside optional arguments ^ Message 22 in Test.tex: Comment displayed. % Shouldn't warn ^ Message 22 in Test.tex: Comment displayed. % Math mode check ^ Message 35 in Test.tex: You should perhaps use `\sin' instead. \ensuremath{sin x\text{is not the same as sin x, but is the same as $sin x$}} ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. \ensuremath{sin x\text{is not the same as sin x, but is the same as $sin x$}} ^^^^^^^ Message 35 in Test.tex: You should perhaps use `\sin' instead. \ensuremath{sin x\text{is not the same as sin x, but is the same as $sin x$}} ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Also, $x(3)\text{ is not x(3) but it is $x(3)$}$ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Message 36 in Test.tex: You should put a space in front of parenthesis. Also, $x(3)\text{ is not x(3) but it is $x(3)$}$ ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Also, $x(3)\text{ is not x(3) but it is $x(3)$}$ ^^^^^^ Message 22 in Test.tex: Comment displayed. % breqn mode check ^ Message 35 in Test.tex: You should perhaps use `\sin' instead. sin x ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. is not the same as sin x, but is the same as $sin x$ ^^^^^^^ Message 35 in Test.tex: You should perhaps use `\sin' instead. is not the same as sin x, but is the same as $sin x$ ^^^ Message 22 in Test.tex: Comment displayed. This is\\% a comment. Nothing here should be checked(right)? ^ Message 36 in Test.tex: You should put a space in front of parenthesis. But this is not a \% comment, so we should find this error(right)? ^ Message 22 in Test.tex: Comment displayed. Here(on this line only)is a warning $sin(x)$ suppressed. % chktex 36 chktex 35 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Here(on this line only)is a warning $sin(x)$ suppressed. % chktex 36 chktex 35 ^^^^^^^^ Message 22 in Test.tex: Comment displayed. Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36 ^ Message 36 in Test.tex: You should put a space in front of parenthesis. Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36 ^ Message 36 in Test.tex: You should put a space after parenthesis. Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36 ^^^^^^^^ Message 22 in Test.tex: Comment displayed. In section~\ref{sec:4} it is suppressed. % chktex -1 ^ Message 22 in Test.tex: Comment displayed. % In section~\ref{sec:5} we don't have a warning. ^ Message 22 in Test.tex: Comment displayed. % Verb check ^ Message 14 in Test.tex: Could not find argument for command. \verb# ^^^^^ Message 31 in Test.tex: This text may be ignored. \end{verbatim} FOO ^^^ Message 22 in Test.tex: Comment displayed. % WipeArg ^ Message 22 in Test.tex: Comment displayed. % Bug 60197 -- "double math mode" should be handled okay ^ Message 22 in Test.tex: Comment displayed. % Warning 49 ^ Message 49 in Test.tex: Expected math mode to be on here. \] ^ Message 22 in Test.tex: Comment displayed. % Warning 16,15 ^ Message 45 in Test.tex: Use \[ ... \] instead of $$ ... $$. $$( ^^^^^^^ Message 22 in Test.tex: Comment displayed. % Local Variables: ^ Message 22 in Test.tex: Comment displayed. % require-final-newline: nil ^ Message 22 in Test.tex: Comment displayed. % End: ^ Message 22 in Test.tex: Comment displayed. % There should be no newline at the end of this file to test bug #46539 ^ Message 48 in Test.tex: No match found for `text' (ConTeXt). \starttext ^^^^ Message 16 in Test.tex: Mathmode still on at end of LaTeX file. Message 17 in Test.tex: Number of `(' doesn't match the number of `)'! Message 17 in Test.tex: Number of `[' doesn't match the number of `]'! Message 17 in Test.tex: Number of `{' doesn't match the number of `}'! chktex-1.7.9/OpSys.h000644 000767 000024 00000015571 14613043276 015075 0ustar00iandrusstaff000000 000000 /* * ChkTeX, operating system specific code for ChkTeX. * Copyright (C) 1995-96 Jens T. Berger Thielemann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * Contact the author at: * Jens Berger * Spektrumvn. 4 * N-0666 Oslo * Norway * E-mail: * * */ #ifndef OPSYS_H #define OPSYS_H #include "ChkTeX.h" #include "Utility.h" /********************************************************************/ /**************** START OF USER SETTABLE PREFERENCES ****************/ /* * Note: This file contains most defines you'll wish to change if you * wish to adopt ChkTeX to a new system. It is, as you might notice, * heavily documented. If you wish to get into the internals of ChkTeX, * the interesting stuff is at the bottom of this file, and in the .c * files. However, you should also take a look at the "config.h.in" file * in this directory if you haven't got a shell able to run the "configure" * script. * * This program relies heavily on that the system which * automagically free()'s all malloc()'ed memory, works. The program * itself does not call free() very much. This is because we're doing * lots of tiny allocations, and a properly designed pooling system will * hopefully do a quicker job than we'll be able to do. So there. * * To keep things simple, we trust that the fclose()'ing of fopen()'ed * also happens automagically. * * Please use the getopt included, as we will modify optarg during * command processing. * * You may wish to modify the SetupVars() (OpSys.c) to better suit your * preferences. In any case, it should put the filename (and full path) * of the `.chktexrc' file into the ConfigFile array. The array is sized * BUFFER_SIZE bytes. * * The program does also assume that __unix__ is defined if the source is * compiled on a UNIX machine. * */ /* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ /* * Here you should define what codes which should be returned to the * shell upon success/failure. * */ #ifndef EXIT_FAILURE # define EXIT_FAILURE 1 #endif #ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 #endif #define EXIT_WARNINGS 2 #define EXIT_ERRORS 3 /* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ /* * SLASH should be defined to the character your computer uses to * separate files/directories. Most systems use '/', messydos uses * '\'. * * DIRCHARS should be defined to the characters a directory entry * may end on. On Amigas, this is ":/" (either "FOO:BAR/" or "FOO:"), * Unix uses only "/", while messydos uses ":\\". * * This data will be used to automatically concatenate a directory * path and a filename. * * Adjust both to suit your needs. */ #ifdef TEX_LIVE #if defined(__MSDOS__) || defined(WIN32) # define SLASH '\\' # define DIRCHARS ":\\" #else # define SLASH '/' # define DIRCHARS "/" #endif #else /* TEX_LIVE */ #if defined(__unix__) # define SLASH '/' #elif defined(__MSDOS__) # define SLASH '\\' #endif #if defined(__unix__) # define DIRCHARS "/" #elif defined(__MSDOS__) # define DIRCHARS ":\\" #endif #endif /* TEX_LIVE */ /* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ /* * Here, define what key-combination which is used to abort stdin * keyboard input. It should be a string, as we we'll type it out as * information to the user. */ #if defined(__unix__) # define STDIN_BREAK "Ctrl-D" #elif defined(__MSDOS__) # define STDIN_BREAK "Ctrl-Z + Enter" #else # define STDIN_BREAK "stdin break combination" #endif /* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ /* * For fancy printing of commands, we'll use these strings to turn * on/off the error indication. The codes listed here are ANSI * compatible; if you don't have that type of terminal, you may wish * to adjust this. Use "chktex -v2 Test.tex" to check the effects of * these macros. Note: These strings will be printf()'ed, so watch your * %'s. * * Under UNIX, we'll ignore these values and use termcap instead, where * that is installed. * * If these strings can't be specified statically, you'll have to add * code in the SetupTerm() function. * * PRE_ERROR_STR is of course printed in front of each location we * wish to show as an error, and POST_ERROR_STR after each location. * * The codes #defined here, will switch back- and foreground colours. * We're using '\033[' as escape character, some terminals may like * '\233' better. * */ # define PRE_ERROR_STR "\033[7m" # define POST_ERROR_STR "\033[0m" /* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ /* * This macro should contain the appendix for backup files, which * will be appended onto the original filename. It should contain * a leading dot. */ #ifdef __MSDOS__ # define BAKAPPENDIX ".$cl" #else # define BAKAPPENDIX ".bak" #endif /* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ /* * This defines the buffer size used in many places. The biggest * limitation imposed by a small buffer is the size of a line which * can be accurately processed by chktex. On the other hand, a large * buffer size will waste memory. However, memory is quite cheap * these days, especially considering the amount needed by ChkTeX. * * ChkTeX used to use BUFSIZ which was 1024 (fairly reasonable) on * many UNIX-like systems, but was much smaller on Windows. So, * instead we create our own buffer size and hope that no-one has * lines longer than 4k. * */ #define BUFFER_SIZE 4096 /***************** END OF USER SETTABLE PREFERENCES *****************/ /********************************************************************/ #ifndef WORDLIST_DEFINED struct WordList; #endif /* Sorry; there are now cyclic dependencies in the * source tree. :-/ */ extern const char *ReverseOn; extern const char *ReverseOff; extern char ConfigFile[BUFFER_SIZE]; extern struct WordList ConfigFiles; int SetupVars(void); void SetupTerm(void); void AddAppendix(char *Name, const char *App); void tackon(char *, const char *); int LocateFile(const char *Filename, char *Dest, const char *App, struct WordList *wl); void AddDirectoryFromRelativeFile(const char * Filename, struct WordList *TeXInputs); int IsRegFile(const char *Filename); #endif /* OPSYS_H */ chktex-1.7.9/COPYING000644 000767 000024 00000044703 14613043276 014701 0ustar00iandrusstaff000000 000000 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. The GNU General Public License version 2 is included below for your reference. ------------------------------------------------------------------------ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 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. chktex-1.7.9/chkweb.1000644 000767 000024 00000005530 14613043276 015166 0ustar00iandrusstaff000000 000000 .TH chkweb 1 "March 30, 2001" .AT 3 .SH NAME chkweb \- runs the LaTeX parts of a CWEB file through chktex .SH SYNOPSIS .B chkweb .I [-hiqrW] [-l ] [-[wemn] <[1-42]|all>] .I [-d[0-...]] [-o ] [-[btxgI][0|1]] .B file1 file2 ... .SH DESCRIPTION .I chkweb runs the .I LaTeX parts of a CWEB file through chktex. .SH OPTIONS .PP Miscellaneous options: .TP .B "-h --help" Print a help screen. .TP .B "-i --license" Show distribution information. .TP .B "-l --localrc" Read local .chktexrc formatted file. .TP .B "-d --debug" Debug information. Give it a number. .TP .B "-r --reset" Reset settings to default. .PP Muting warning messages: .TP .B "-w --warnon" Makes msg # given a warning and turns it on. .TP .B "-e --erroron" Makes msg # given an error and turns it on. .TP .B "-m --msgon" Makes msg # given a message and turns it on. .TP .B "-n --nowarn" Mutes msg # given. .PP Output control flags: .TP .B "-V --pipeverb" How errors are displayed when stdout != tty. Defaults to the same as -v. .TP .B "-s --splitchar" String used to split fields when doing -v0 .TP .B "-o --output" Redirect error report to a file. .TP .B "-q --quiet" Shuts up about version information. .TP .B "-f --format" Format to use for output .PP Boolean switches (1 -> enables / 0 -> disables): .TP .B "-b --backup" Backup output file. .TP .B "-x --wipeverb" Ignore contents of `\\verb' commands. .TP .B "-g --globalrc" Read global .chktexrc file. .TP .B "-I --inputfiles" Execute \\input statements. .TP .B "-H --headererr" Show errors found in front of \\begin{document} .PP Miscellaneous switches: .TP .B "-W --version" Version information .PP If no LaTeX files are specified on the command line, we will read from stdin. For explanation of warning/error messages, please consult the main document /usr/share/doc/chktex/ChkTeX.dvi.gz. .SH DISTRIBUTION Copyright (C) 1996 Jens T. Berger Thielemann .PP This program is free software; you can redistribute it and/or modify it under the terms of the .I GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. .PP This program is distributed in the hope that it will be useful, but .B WITHOUT ANY WARRANTY; without even the implied warranty of .B MERCHANTABILITY or .B FITNESS FOR A PARTICULAR PURPOSE. See the .I GNU General Public License for more details. .PP You should have received a copy of the .B GNU General Public License along with this program; if not, write to the .I Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA .SH ENVIRONMENT No environment variables are used. .SH FILES None. .SH AUTHOR Jens T. Berger Thielemann, .I .PP This manual page was cobbled together by Clint Adams , based on the output of "chktex --help" and deweb(1). .SH "SEE ALSO" .B deweb(1), chktex(1) chktex-1.7.9/NEWS000644 000767 000024 00000025367 14613043276 014352 0ustar00iandrusstaff000000 000000 Development of ChkTeX is now in a maintainance mode. All versions 1.6.x are essentially bug fixes. Version 1.7 added some new features. 1.7.9 (2024-04-26), released by Ivan Andrus * Spell check chktexrc.in * Check SeenSpace instead of the previous character #65570 * Treat silent macros as space for the purposes of interword spacing #65500 * Mark a regex as being PCRE only #65033 * Fix typo in rule message #64810 1.7.8 (2022-10-17), released by Ivan Andrus * Fix some packaging issues for CTAN 1.7.7 (2022-10-17), released by Ivan Andrus * Fix false positives * Fix overzealous warning of x between numbers #60184 * Handle nested mathmode e.g. \ensuremath #60197 * Add many citation commands from biblatex #56608 * Add support for breqn package #62631 * WipeArg on \graphicspath #47593 * WipeArg on LuaTeX macros which contain lua code #53146 * Add \itshape to Silent section https://tex.stackexchange.com/questions/627808/why-does-chktex-complain-when-there-is-a-space-after-itshape-but-not-when-bfse * Make QuoteStyle warnings work with end of sentence punctuation #53494 * When checking for inter-word spacing, ignore certain punctuation #54751, #53347 * Allow \frenchspacing to turn off warning 13 (intersentence spacing) * Don't warn about space before a parenthesis at the beginning of the line if the previous line ended with a comment (and no space) #109479 * Make exit status 2 or 3 (not 1) when warnings or errors are found. Some callers expected a return value of 1 to mean an internal error. #53129 * Fix many bugs * Make ChkTeX process longer lines, especially on Windows. This doesn't fix the problem entirely, but it should amerliorate it to a large extent. * Make file suppressions only apply to the file they are in. This allows putting all the "badness" into one file. #57809 * Add check to make sure input is a regular file and not a directory #56520 * Add support for relative paths in sub directories #53494 * Manage ConTeXt environments separately from LaTeX environments #51179 * Change argument order to avoid undefined behavior in va_start() * New warnings and features * Add regex for unescaped optional arguments inside optional arguments #56657 * Support RC settings on the command line #56486 * Warn about phrases that match DashExcpt _except_ for the hyphens #58886 * Add CmdSpaceStyle option to Ignore spacing problems after commands #60809, #60380 * Add support for finding chktexrc files in XDG locations #61405 * Add new warning when ChkTeX gets confused about mathmode * Improved documentation * Make chktexrc somewhat literate and creating ChkTeXRC.tex as well. * Make "keywords" link to the appropriate chktexrc variable documentation * Add note about chktexrc and link to documentation in the help message #50004 #61179 * Indicate that debug is a bit field instead of a level 1.7.6 (2016-09-09), released by Ivan Andrus * Properly copy and free strings. This caused incorrect file reporting in some cases #49000 * Add "verbatim" commands and environments from tipa #46734 * Avoid infinite loop when a regex matches an empty string * Fix crash on invalid regular expression * Add warnings for $$...$$ and $...$ #47044 * Update the banner to reflect current bug reporting contacts 1.7.5 (2015-12-07), released by Ivan Andrus * Track whether the previous line ended in a comment #45980 * Add a few source code environments to VerbEnvir * Don't show long line warning if the last line doesn't have a newline #46539 * Fix deweb's handling of file names #46043,#46042 * Use the exit status to indicate warnings were found #45979 * Consider OS X a UNIX 1.7.4 (2015-04-11), released by Ivan Andrus * Fixed undefined behavior (patch from TeXLive) 1.7.3 (2015-04-09), released by Ivan Andrus * Fixed memory leaks and a crashing bug #42813 * Added ConTeXt \start... \stop... tracking #44517 * Added DashExcpt list for exceptions to dash rules #42237 * Support \cite with two optional arguments (biblatex) #44413 * Removed warning about using \dots instead of .. #40731 This incorrectly warns about relative paths * Removed check for intro since it's common in file names #43013 * Turn off warning 19 by default #44226 Warning 19 is about Latin-1 quotes, but gives false positives for some utf-8 characters. 1.7.2 (2013-04-17), released by Ivan Andrus * Fixed display bug on platforms where sizeof(int) != sizeof(regoff_t) * Warn that .. should be \dots like lacheck does * Fixed warnings under clang * Incorporated several build related patches from TeX Live 1.7.1 (2012-08-22), released by Ivan Andrus * Improvements for TeX Live and CTAN * Fixed bug when checking for interword spacing * Added warning when a file has lines that are too long which can cause problems * Added ability to suppress user regular expression warnings by "naming" them * Added ability to suppress warnings for the rest of the file * Allow using PCRE or POSIX ERE or neither (at configure time). Regular expressions can be marked as PCRE or POSIX only. * Allow () to specify an optional argument in WipeArg to support \cmidrule[](){} * Allow regular expressions for Silent keyword, specified in [] for "case insensitive" * Added warning about \hline and vertical rules in tabular environments * I changed user warnings to be post WipeArg (like they were pre 1.7.0). I had changed them in 1.7.0 to be pre WipeArg so that I could match things like \label{...}, but this caused many false positives by matching in comments, etc. 1.7.0 (2012-05-28), released by Ivan Andrus * Added support for user defined regular expression based warnings * Added support for macros like \ensuremath and \text * Added support for suppressing messages on a single line 1.6.6 (2012-04-07), released by Ivan Andrus * Fixed some memory issues * Do not increase line number when the line was very long * Some fixes for TexLive 1.6.5 (??), released by Jean-Marc Lasgouttes * Fix bug where ChkTeX generates a warning about missing space before parenthesis when the parenthesis is at start of line. * Update ChkTeX.tex.in to use proper LaTeX2e markup. * Update the build machinery a bit. 1.6.4 (2007-10-20), released by Baruch Even * For some reason 1.6.3 did not include all the changes it was supposed to have, this release should fix it. One such issue is the MacOS X compilation. * Include some updates to the default chktexrc from Jean-Marc Lasgouttes. 1.6.3, released by Baruch Even * Support DESTDIR for installation to help distributions. * Apply old standing patch from Jean-Marc Lasgouttes to compile outside the directory. * Enable compilation on MacOS X. * Fix various coding issues. Original versions from Jens T. Berger Thielemann: ================================================= Modifications and additions since v1.6: * Improved the build system * Better fixes for memory access errors Modifications and additions since v1.5: * Fixed a crash when running from emacs * Fixed a crash when checking our own manual * Added \verb* support Modifications and additions since v1.4: ** New warnings * No space or similar in front/after parenthesis. * Demands a consistent quote style. * Double spaces in input which will not be rendered as one. * Punctuation malplaced regarding to math mode. * Warns about TeX primitives. * Space in front of footnotes. * Bogus \left and \right commands. ** Program * The abbreviation recognizer has (for the last time?) been redesigned. We now produce far less false warnings, catch more cases and do all this faster than before. Seems like a win. Done much of the same with the italic correction detection part, too. * Some bugs have been silently fixed. Hot spots in the program have been optimized; in certain cases this in fact doubles the speed! * Along with this goes more code elegance and utilization of macro processing and the C language. Take a look at Resource.[ch]. * It's possible to specify separate output-formats depending on whether you are sending the output to a file/pipe or to a terminal. * Column positions are finally correct; we now expand tabs correctly. * ChkTeX will now recursively search for \input'ed files, both in the document and on the commandline. See the chktexrc file for more info. * The debug switch is now more intelligent; if you wish to hack a bit on ChkTeX for yourself, it is possible to produce selective debugging output. The feature can also be disabled altogether. * MS-DOS and OS/2 version of the program is now more flexible and well-behaved, thanks to Gerd Boehm. * You may now say -wall to make all messages warnings, and turn them on. * Uses termcap on UNIX boxes; this should ensure that -v2 (or more precisely: %i and %I works regardless to what terminal you are using. ** Resource file * You may now specify both case-sensitive and case-insensitive user patterns in the chktexrc file. In addition; it is now possible to reset/clear lists. * You can now specify how many optional or required arguments WIPEARG should wipe; it also behaves somewhat more intelligently when the arguments stretch over multiple lines. * Global files will be read in addition to local ones. The searching order has also been reversed in order to make this more intelligent. ** Other * The documentation has been polished and should now be easier to use in practical situations. * check target in Makefile, so you can check that the installation succeeded. In fact, the Makefile has been enhanced in several other ways too, amongst other it is now GNU conforming. * deweb is now documented; you may say "man deweb" to get a few words of advice. The support script (chkweb) does now behave as the remaining package (accepting stdin input and flags). * I've written an Emacs hack which magically adds ChkTeX to the list of AUC-TeX commands; thus making the use of the program even more trivial. For those of you who don't wish to mess with Emacs, I've included a trivial lacheck <-> ChkTeX interface. This means that you now can use ChkTeX just as easily as lacheck when you're running AUC-TeX. * Added an ARexx script which lets ChkTeX talk to VBrowse, the message browser of Volker Barthelmann's freely distributable ANSI C compiler. The browser itself is available on Aminet as dev/c/vbcc.lha. chktex-1.7.9/input.tex000644 000767 000024 00000000074 14613043276 015520 0ustar00iandrusstaff000000 000000 \this is a test of whether the file is actually inputted... chktex-1.7.9/Test.posix-ere.out000644 000767 000024 00000071115 14613043276 017225 0ustar00iandrusstaff000000 000000 Message 30 in Test.tex: Multiple spaces detected in input. o To test the program upon it ^^^ Message 30 in Test.tex: Multiple spaces detected in input. o To show off some of the features ^^^ Message 22 in Test.tex: Comment displayed. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ^ Message 22 in Test.tex: Comment displayed. % Warning 1 ^ Message 1 in Test.tex: Command terminated with space. \foo This is an error. ^ Message 1 in Test.tex: Command terminated with space. So is this \foo ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. \smallskip This is a not. $\foo Neither$ is this. ^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 2 ^ Message 2 in Test.tex: Non-breaking space (`~') should have been used. This is a faulty reference to \ref{foo} ^ Message 22 in Test.tex: Comment displayed. % Warning 3 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $[(ab)^{-1}]^{-2}$ is not beautiful ^^^^^^^^^^^^^^^^^^ Message 3 in Test.tex: You should enclose the previous parenthesis with `{}'. $[(ab)^{-1}]^{-2}$ is not beautiful ^ Message 3 in Test.tex: You should enclose the previous parenthesis with `{}'. $[(ab)^{-1}]^{-2}$ is not beautiful ^ Message 30 in Test.tex: Multiple spaces detected in input. $[(ab)^{-1}]^{-2}$ is not beautiful ^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. ${{[{(ab)}^{-1}]}}^{-2}$ is beautiful ^^^^^^^^^^^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 4-6, 28 ^ Message 6 in Test.tex: No italic correction (`\/') found. Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^ Message 42 in Test.tex: You should remove spaces in front of `\/' Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^^ Message 28 in Test.tex: Don't use \/ in front of small punctuation. Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^^ Message 42 in Test.tex: You should remove spaces in front of `\/' Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^ Message 5 in Test.tex: Italic correction (`\/') found more than once. Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^^ Message 22 in Test.tex: Comment displayed. % LaTeX2e ^ Message 42 in Test.tex: You should remove spaces in front of `\/' Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^^ Message 42 in Test.tex: You should remove spaces in front of `\/' Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing \textem{italic\/} in this \textit{sentence}, as \textem{you see}. ^^ Message 22 in Test.tex: Comment displayed. % Warning 7 ^ Message 7 in Test.tex: Accent command `\'' needs use of `\i'. This \'is a test of $\hat{j}$ accents. ^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. This \'is a test of $\hat{j}$ accents. ^^^^^^^^^ Message 7 in Test.tex: Accent command `\hat' needs use of `\jmath'. This \'is a test of $\hat{j}$ accents. ^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. This \'{\i}s a test of $\hat{\jmath}$ accents. ^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 8 ^ Message 8 in Test.tex: Wrong length of dash may have been used. It wasn't anything - just a 2---3 star--shots. ^ Message 8 in Test.tex: Wrong length of dash may have been used. It wasn't anything - just a 2---3 star--shots. ^^^ Message 8 in Test.tex: Wrong length of dash may have been used. It wasn't anything - just a 2---3 star--shots. ^^ Message 22 in Test.tex: Comment displayed. % From Knuths TeXbook Chapter 14 ^ Message 22 in Test.tex: Comment displayed. % "How TeX Breaks Paragraphs into Lines", fourth paragraph: ^ Message 22 in Test.tex: Comment displayed. % Using DashExcpt ^ Message 8 in Test.tex: Wrong length of dash may have been used. The Birch--Swinnerton--Dyer conjecture is not correct. ^^ Message 8 in Test.tex: Wrong length of dash may have been used. The Birch--Swinnerton--Dyer conjecture is not correct. ^^ Message 8 in Test.tex: Wrong length of dash may have been used. The Birch-Swinnerton-Dyer conjecture is not correct (is now caught). ^ Message 22 in Test.tex: Comment displayed. % Warning 9-10 ^ Message 22 in Test.tex: Comment displayed. % Brackets: ^ Message 37 in Test.tex: You should avoid spaces in front of parenthesis. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `)' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `}' found. )}{[])} }}}]]]))) ^ Message 9 in Test.tex: `}' expected, found `)'. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `}' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `}' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `}' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `}' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `]' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `]' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `]' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `)' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `)' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `)' found. )}{[])} }}}]]]))) ^ Message 22 in Test.tex: Comment displayed. % Envs: ^ Message 9 in Test.tex: `baz' expected, found `quux'. \begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo} ^^^^ Message 9 in Test.tex: `quux' expected, found `baz'. \begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo} ^^^^ Message 10 in Test.tex: Solo `asoi' found. \begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo} ^^^^ Message 22 in Test.tex: Comment displayed. % Warning 47 -- ConTeXt environment mismatch -- split from 9 ^ Message 47 in Test.tex: `section' expected, found `text' (ConTeXt). \stoptext ^^^^ Message 22 in Test.tex: Comment displayed. % (Un)fortunately, this is not an error ^ Message 22 in Test.tex: Comment displayed. % Warning 11 ^ Message 11 in Test.tex: You should use \ldots to achieve an ellipsis. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^^^^ Message 11 in Test.tex: You should use \ldots to achieve an ellipsis. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^^^^ Message 11 in Test.tex: You should use \cdots to achieve an ellipsis. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^^^^^^^ Message 11 in Test.tex: You should use \ldots to achieve an ellipsis. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^^^^^^^^^^^^^^^ Message 11 in Test.tex: You should use \cdots to achieve an ellipsis. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$. ^^^^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$. ^^^^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$. ^^^^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$. ^^^^^^^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 12 ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 22 in Test.tex: Comment displayed. % Bug 54751 ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. Mr. ``X'' and Mrs. \(Y\) ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. Mr. ``X'' and Mrs. \(Y\) ^ Message 22 in Test.tex: Comment displayed. % ignore commands by default ^ Message 22 in Test.tex: Comment displayed. % Bug 65500 ^ Message 22 in Test.tex: Comment displayed. % Warning 13 ^ Message 13 in Test.tex: Intersentence spacing (`\@') should perhaps be used. Look at THIS! It's an error. ^ Message 22 in Test.tex: Comment displayed. % after frenchspacing it's not an error ^ Message 22 in Test.tex: Comment displayed. % warning again ^ Message 13 in Test.tex: Intersentence spacing (`\@') should perhaps be used. Look at THIS! It's an error. ^ Message 22 in Test.tex: Comment displayed. % ignore commands by default ^ Message 21 in Test.tex: This command might not be intended. Look at \THIS\@! It's not an error. D. E. Knuth. ^^ Message 22 in Test.tex: Comment displayed. % Warning 14 ^ Message 1 in Test.tex: Command terminated with space. \hat ^ Message 14 in Test.tex: Could not find argument for command. \hat ^^^^ Message 22 in Test.tex: Comment displayed. % Warning 18,19 ^ Message 18 in Test.tex: Use either `` or '' as an alternative to `"'. Is this an "example", or is it an ŽexampleŽ. ^ Message 18 in Test.tex: Use either `` or '' as an alternative to `"'. Is this an "example", or is it an ŽexampleŽ. ^ Message 19 in Test.tex: Use "'" (ASCII 39) instead of "Ž" (ASCII 180). Is this an "example", or is it an ŽexampleŽ. ^ Message 19 in Test.tex: Use "'" (ASCII 39) instead of "Ž" (ASCII 180). Is this an "example", or is it an ŽexampleŽ. ^ Message 22 in Test.tex: Comment displayed. % Warning 20 ^ Message 20 in Test.tex: User-specified pattern found: \unknown. That bug is \unknown\ to me. ^^^^^^^^ Message 22 in Test.tex: Comment displayed. % That bug is \unknown\ to me. ^ Message 22 in Test.tex: Comment displayed. % Warning 21 ^ Message 21 in Test.tex: This command might not be intended. \LaTeX\ is an extension of \TeX\. Right? ^^ Message 22 in Test.tex: Comment displayed. % Warning 23 ^ Message 23 in Test.tex: Either `\,`` or ``\,` will look better. ```Hello', I heard him said'', she remembered. ^^^ Message 22 in Test.tex: Comment displayed. % Warning 24 ^ Message 24 in Test.tex: Delete this space to maintain correct pagereferences. Indexing text \index{text} is fun! ^ Message 22 in Test.tex: Comment displayed. Indexing text% ^ Message 30 in Test.tex: Multiple spaces detected in input. \index{text} is fun! ^^^^ Message 24 in Test.tex: Delete this space to maintain correct pagereferences. \index{text} is fun! ^ Message 22 in Test.tex: Comment displayed. % Warning 25 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $5\cdot10^10$ ^^^^^^^^^^^^^ Message 25 in Test.tex: You might wish to put this between a pair of `{}' $5\cdot10^10$ ^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $5\cdot10^{10}$ ^^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 26 ^ Message 26 in Test.tex: You ought to remove spaces in front of punctuation. Do you understand ? ^ Message 22 in Test.tex: Comment displayed. % Warning 27 ^ Message 1 in input.tex: Command terminated with space. \this is a test of whether the file is actually inputted... ^ Message 11 in input.tex: You should use \ldots to achieve an ellipsis. \this is a test of whether the file is actually inputted... ^^^ Message 1 in input.tex: Command terminated with space. \this is a test of whether the file is actually inputted... ^ Message 11 in input.tex: You should use \ldots to achieve an ellipsis. \this is a test of whether the file is actually inputted... ^^^ Message 22 in input/file: Comment displayed. % -*- TeX -*- ^ Message 22 in input/file: Comment displayed. % chktex-file 22 ^ Message 22 in Test.tex: Comment displayed. % Warning 29 ^ Message 29 in Test.tex: $\times$ may look prettier here. The program opens a screen sized 640x200 pixels ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. The program opens a screen sized $640\times200$ pixels ^^^^^^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Approximately $\frac{2x}{1+x}$ $x$s shouldn't be errors. ^^^^^^^^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Approximately $\frac{2x}{1+x}$ $x$s shouldn't be errors. ^^^ Message 22 in Test.tex: Comment displayed. % Warning 30 ^ Message 30 in Test.tex: Multiple spaces detected in input. White is a beautiful colour. ^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 31 ^ Message 31 in Test.tex: This text may be ignored. \end{verbatim} foo bar ^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 32-34 ^ Message 32 in Test.tex: Use ` to begin quotation, not '. This is either an 'example`, an ''example`` or an `"`example'`'. ^ Message 33 in Test.tex: Use ' to end quotation, not `. This is either an 'example`, an ''example`` or an `"`example'`'. ^ Message 32 in Test.tex: Use ` to begin quotation, not '. This is either an 'example`, an ''example`` or an `"`example'`'. ^^ Message 33 in Test.tex: Use ' to end quotation, not `. This is either an 'example`, an ''example`` or an `"`example'`'. ^^ Message 34 in Test.tex: Don't mix quotes. This is either an 'example`, an ''example`` or an `"`example'`'. ^^^ Message 34 in Test.tex: Don't mix quotes. This is either an 'example`, an ''example`` or an `"`example'`'. ^^^ Message 22 in Test.tex: Comment displayed. % Warning 35 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $sin^2 + cos^2 = 1$ ^^^^^^^^^^^^^^^^^^^ Message 35 in Test.tex: You should perhaps use `\sin' instead. $sin^2 + cos^2 = 1$ ^^^ Message 35 in Test.tex: You should perhaps use `\cos' instead. $sin^2 + cos^2 = 1$ ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $\sin^2 + \cos^2 = 1$ ^^^^^^^^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 36-37 ^ Message 36 in Test.tex: You should put a space in front of parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 37 in Test.tex: You should avoid spaces after parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 36 in Test.tex: You should put a space in front of parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 37 in Test.tex: You should avoid spaces after parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 37 in Test.tex: You should avoid spaces in front of parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 36 in Test.tex: You should put a space in front of parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 37 in Test.tex: You should avoid spaces after parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 37 in Test.tex: You should avoid spaces in front of parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 36 in Test.tex: You should put a space after parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 22 in Test.tex: Comment displayed. % Warning 38 ^ Message 38 in Test.tex: You should not use punctuation in front of quotes. ``An example,'' he said, ``would be great.'' ^ Message 38 in Test.tex: You should not use punctuation in front of quotes. ``An example,'' he said, ``would be great.'' ^ Message 22 in Test.tex: Comment displayed. % Warning 39 ^ Message 39 in Test.tex: Double space found. For output codes, see table ~\ref{tab:fmtout}. ^ Message 22 in Test.tex: Comment displayed. % Warning 40 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $\this,$ and $$this$$. ^^^^^^^^ Message 40 in Test.tex: You should put punctuation outside inner math mode. $\this,$ and $$this$$. ^ Message 45 in Test.tex: Use \[ ... \] instead of $$ ... $$. $\this,$ and $$this$$. ^^^^^^^^ Message 40 in Test.tex: You should put punctuation inside display math mode. $\this,$ and $$this$$. ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $\this$, and $$this.$$ ^^^^^^^ Message 45 in Test.tex: Use \[ ... \] instead of $$ ... $$. $\this$, and $$this.$$ ^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 41 ^ Message 1 in Test.tex: Command terminated with space. foo \above qux ^ Message 41 in Test.tex: You ought to not use primitive TeX in LaTeX code. foo \above qux ^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 42 ^ Message 42 in Test.tex: You should remove spaces in front of `\footnote' This is a footnote \footnote{foo}. ^ Message 22 in Test.tex: Comment displayed. This is a footnote% ^ Message 22 in Test.tex: Comment displayed. % Warning 43 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Here is a mistake $\left{x\right}$. ^^^^^^^^^^^^^^^^ Message 43 in Test.tex: `\left' is normally not followed by `{'. Here is a mistake $\left{x\right}$. ^^^^^ Message 43 in Test.tex: `\right' is normally not followed by `}'. Here is a mistake $\left{x\right}$. ^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. This one triggers warning 22 $\left\{x\right\}$. ^^^^^^^^^^^^^^^^^^ Message 21 in Test.tex: This command might not be intended. This one triggers warning 22 $\left\{x\right\}$. ^^ Message 21 in Test.tex: This command might not be intended. This one triggers warning 22 $\left\{x\right\}$. ^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Here \chktex\ doesn't complain $\left\lbrace x\right\rbrace$. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 44 -- user regex -- default message ^ Message 22 in Test.tex: Comment displayed. % Warning 44 -- user regex -- user message ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. For every $p\not|n$ you have an ugly prime which doesn't divide $n$. ^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. For every $p\not|n$ you have an ugly prime which doesn't divide $n$. ^^^ Message 44 in Test.tex: User Regex: Always use \nmid. For every $p\not|n$ you have an ugly prime which doesn't divide $n$. ^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. For every $p\nmid n$ you have a cute prime which doesn't divide $n$. ^^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. For every $p\nmid n$ you have a cute prime which doesn't divide $n$. ^^^ Message 22 in Test.tex: Comment displayed. % Warning about optional arguments inside optional arguments ^ Message 22 in Test.tex: Comment displayed. % Shouldn't warn ^ Message 22 in Test.tex: Comment displayed. % Math mode check ^ Message 35 in Test.tex: You should perhaps use `\sin' instead. \ensuremath{sin x\text{is not the same as sin x, but is the same as $sin x$}} ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. \ensuremath{sin x\text{is not the same as sin x, but is the same as $sin x$}} ^^^^^^^ Message 35 in Test.tex: You should perhaps use `\sin' instead. \ensuremath{sin x\text{is not the same as sin x, but is the same as $sin x$}} ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Also, $x(3)\text{ is not x(3) but it is $x(3)$}$ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Message 36 in Test.tex: You should put a space in front of parenthesis. Also, $x(3)\text{ is not x(3) but it is $x(3)$}$ ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Also, $x(3)\text{ is not x(3) but it is $x(3)$}$ ^^^^^^ Message 22 in Test.tex: Comment displayed. % breqn mode check ^ Message 35 in Test.tex: You should perhaps use `\sin' instead. sin x ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. is not the same as sin x, but is the same as $sin x$ ^^^^^^^ Message 35 in Test.tex: You should perhaps use `\sin' instead. is not the same as sin x, but is the same as $sin x$ ^^^ Message 22 in Test.tex: Comment displayed. This is\\% a comment. Nothing here should be checked(right)? ^ Message 36 in Test.tex: You should put a space in front of parenthesis. But this is not a \% comment, so we should find this error(right)? ^ Message 22 in Test.tex: Comment displayed. Here(on this line only)is a warning $sin(x)$ suppressed. % chktex 36 chktex 35 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Here(on this line only)is a warning $sin(x)$ suppressed. % chktex 36 chktex 35 ^^^^^^^^ Message 22 in Test.tex: Comment displayed. Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36 ^ Message 36 in Test.tex: You should put a space in front of parenthesis. Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36 ^ Message 36 in Test.tex: You should put a space after parenthesis. Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36 ^^^^^^^^ Message 44 in Test.tex: User Regex: 1:Capitalize before references. In section~\ref{sec:3} we have a warning. ^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. In section~\ref{sec:4} it is suppressed. % chktex -1 ^ Message 22 in Test.tex: Comment displayed. % In section~\ref{sec:5} we don't have a warning. ^ Message 44 in Test.tex: User Regex: -2:Vertical rules in tables are ugly. \begin{tabular*}{1.0\linewidth}[h]{|c|cc|} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Message 44 in Test.tex: User Regex: -2:Use \toprule, \midrule, or \bottomrule from booktabs. \hline ^^^^^^ Message 22 in Test.tex: Comment displayed. % Verb check ^ Message 14 in Test.tex: Could not find argument for command. \verb# ^^^^^ Message 31 in Test.tex: This text may be ignored. \end{verbatim} FOO ^^^ Message 22 in Test.tex: Comment displayed. % WipeArg ^ Message 22 in Test.tex: Comment displayed. % Bug 60197 -- "double math mode" should be handled okay ^ Message 22 in Test.tex: Comment displayed. % Warning 49 ^ Message 49 in Test.tex: Expected math mode to be on here. \] ^ Message 22 in Test.tex: Comment displayed. % Warning 16,15 ^ Message 45 in Test.tex: Use \[ ... \] instead of $$ ... $$. $$( ^^^^^^^ Message 22 in Test.tex: Comment displayed. % Local Variables: ^ Message 22 in Test.tex: Comment displayed. % require-final-newline: nil ^ Message 22 in Test.tex: Comment displayed. % End: ^ Message 22 in Test.tex: Comment displayed. % There should be no newline at the end of this file to test bug #46539 ^ Message 48 in Test.tex: No match found for `text' (ConTeXt). \starttext ^^^^ Message 16 in Test.tex: Mathmode still on at end of LaTeX file. Message 17 in Test.tex: Number of `(' doesn't match the number of `)'! Message 17 in Test.tex: Number of `[' doesn't match the number of `]'! Message 17 in Test.tex: Number of `{' doesn't match the number of `}'! chktex-1.7.9/.clang-format000644 000767 000024 00000021237 14613043276 016216 0ustar00iandrusstaff000000 000000 # Total edit distance (lower is better) # Default values are marked with an asterisk # UseTab: Never # Never* 26657, AlignWithSpaces 34627, ForContinuationAndIndentation 34956, Always 35005, ForIndentation 35013 IndentWidth: 4 # 4 11389, 3 18970, 2* 26517, 1 34346, 8 60712 # BasedOnStyle: LLVM # LLVM* 11389, WebKit 12144, Google 17584, Chromium 17626, Mozilla 20156 # ColumnLimit: 80 # AllowAllArgumentsOnNextLine: true # false 2474, true* 2474 # AllowAllConstructorInitializersOnNextLine: true # false 2474, true* 2474 # AllowAllParametersOfDeclarationOnNextLine: true # false 2474, true* 2474 # AllowShortBlocksOnASingleLine: Never # Never* 2474, Empty 2474, Always 2474 # AllowShortCaseLabelsOnASingleLine: false # false* 2474, true 2600 AllowShortEnumsOnASingleLine: false # false 2431, true* 2474 # AllowShortFunctionsOnASingleLine: ??? # None 2425, Empty 2425, InlineOnly 2429, Inline 2429, All* 2431 # AllowShortIfStatementsOnASingleLine: Never # Never* 2425, WithoutElse 2496, Always 2518 # AllowShortLambdasOnASingleLine: All # None 2425, Empty 2425, Inline 2425, All* 2425 # AllowShortLoopsOnASingleLine: false # false* 2425, true 2427 # AlwaysBreakAfterReturnType: None # None* 2425, AllDefinitions 2512, TopLevelDefinitions 2512, All 2580, TopLevel 2580 # AlwaysBreakBeforeMultilineStrings: false # false* 2425, true 2428 # AlwaysBreakTemplateDeclarations: MultiLine # No 2425, MultiLine* 2425, Yes 2425 # BinPackArguments: true # true* 2425, false 2647 # BinPackParameters: true # true* 2425, false 2441 # BitFieldColonSpacing: Both # Both* 2425, None 2425, Before 2425, After 2425 # BraceWrapping is an advanced setting and is omitted # BreakAfterJavaFieldAnnotations does not apply to C/C++ code # BreakBeforeBinaryOperators: None # None* 2425, NonAssignment 2460, All 2477 # BreakBeforeConceptDeclarations: true # false 2425, true* 2425 # BreakBeforeTernaryOperators: true # false 2425, true* 2425 # BreakConstructorInitializers: BeforeColon # BeforeColon* 2425, BeforeComma 2425, AfterColon 2425 # BreakInheritanceList: BeforeColon # BeforeColon* 2425, BeforeComma 2425, AfterColon 2425 BreakStringLiterals: false # false 2405, true* 2425 # CommentPragmas: ??? # (auto detection is not supported; please manually set) # CompactNamespaces: false # false* 2405, true 2405 # ConstructorInitializerAllOnOneLineOrOnePerLine: false # false* 2405, true 2405 # Cpp11BracedListStyle: true # true* 2405, false 2486 # UseCRLF: ??? # (auto detection is not supported; please manually set) # DeriveLineEnding: ??? # (auto detection is not supported; please manually set) # DisableFormat does not apply to C/C++ code # EmptyLineBeforeAccessModifier: LogicalBlock # Never 2405, Leave 2405, LogicalBlock* 2405, Always 2405 # ExperimentalAutoDetectBinPacking: false # false* 2405, true 2406 # ForEachMacros: ??? # (auto detection is not supported; please manually set) # FixNamespaceComments: true # false 2405, true* 2405 # IncludeCategories: ??? # (auto detection is not supported; please manually set) # IncludeIsMainRegex: ??? # (auto detection is not supported; please manually set) # IncludeStyle is an advanced setting and is omitted # InsertTrailingCommas: None # None* 2405, Wrapped 2405 # JavaImportGroups does not apply to C/C++ code # JavaScriptQuotes does not apply to C/C++ code # JavaScriptWrapImports does not apply to C/C++ code # KeepEmptyLinesAtTheStartOfBlocks: true # true* 2405, false 2410 # Language does not apply to C/C++ code # MacroBlockBegin: ??? # (auto detection is not supported; please manually set) # MacroBlockEnd: ??? # (auto detection is not supported; please manually set) MaxEmptyLinesToKeep: 1000 # 1000 2321, 4 2323, 3 2325, 2 2335, 1* 2405, 0 3274 # NamespaceMacros: ??? # (auto detection is not supported; please manually set) # ObjCBinPackProtocolList does not apply to C/C++ code # ObjCBlockIndentWidth does not apply to C/C++ code # ObjCBreakBeforeNestedBlockParam does not apply to C/C++ code # ObjCSpaceAfterProperty does not apply to C/C++ code # ObjCSpaceBeforeProtocolList does not apply to C/C++ code # PenaltyBreakAssignment is an advanced setting and is omitted # PenaltyBreakBeforeFirstCallParameter is an advanced setting and is omitted # PenaltyBreakComment is an advanced setting and is omitted # PenaltyBreakFirstLessLess is an advanced setting and is omitted # PenaltyBreakString is an advanced setting and is omitted # PenaltyBreakTemplateDeclaration is an advanced setting and is omitted # PenaltyExcessCharacter is an advanced setting and is omitted # PenaltyIndentedWhitespace is an advanced setting and is omitted # PenaltyReturnTypeOnItsOwnLine is an advanced setting and is omitted # PointerAlignment: Right # Right* 10856, Middle 11194, Left 11609 # DerivePointerAlignment: false # false* 10856, true 10856 # RawStringFormat is an advanced setting and is omitted # RawStringFormats is an advanced setting and is omitted ReflowComments: false # false 2293, true* 2321 # SortIncludes: true # false 2293, true* 2293 # SortJavaStaticImport does not apply to C/C++ code # SortUsingDeclarations: true # false 2293, true* 2293 # SpaceAfterCStyleCast: false # false* 2293, true 2338 # SpaceAfterLogicalNot: false # false* 2293, true 2390 # SpaceAfterTemplateKeyword: true # false 2293, true* 2293 # SpaceAroundPointerQualifiers: Default # Default* 2293, Before 2293, After 2293, Both 2293 # SpaceBeforeAssignmentOperators: true # true* 2293, false 3013 # SpaceBeforeCaseColon: false # false* 2293, true 2528 SpaceBeforeCpp11BracedList: true # true 2290, false* 2293 # SpaceBeforeCtorInitializerColon: true # false 2290, true* 2290 # SpaceBeforeInheritanceColon: true # false 2290, true* 2290 # SpaceBeforeParens: ControlStatements # ControlStatements* 2290, Never 2744, Always 3490 # SpaceBeforeRangeBasedForLoopColon: true # false 2290, true* 2290 # SpaceBeforeSquareBrackets: false # false* 2290, true 2461 # SpaceInEmptyBlock: false # false* 2290, true 2290 # SpaceInEmptyParentheses: false # false* 2290, true 2304 # SpacesBeforeTrailingComments: 1 # 0 2290, 1* 2290, 2 2290, 3 2290, 4 2290, 5 2290, 6 2290, 7 2290, 8 2290 # SpacesInAngles: false # false* 2290, true 2290 # SpacesInConditionalStatement: false # false* 2290, true 3135 # SpacesInContainerLiterals: true # false 2290, true* 2290 # SpacesInCStyleCastParentheses: false # false* 2290, true 2494 # SpacesInParentheses: false # false* 2290, true 6488 # SpacesInSquareBrackets: false # false* 2290, true 2616 # Standard: Latest # c++03 2290, c++11 2290, Latest* 2290, Auto 2290 # StatementMacros: ??? # (auto detection is not supported; please manually set) # StatementAttributeLikeMacros: ??? # (auto detection is not supported; please manually set) # TypenameMacros: ??? # (auto detection is not supported; please manually set) # WhitespaceSensitiveMacros: ??? # (auto detection is not supported; please manually set) # TabWidth: 8 # 1 10683, 2 10683, 3 10683, 4 10683, 8* 10683 # ContinuationIndentWidth: 4 # 4* 10683, 3 10753, 2 10817, 1 10938, 8 11373 # AccessModifierOffset: -2 # -8 10683, -4 10683, -2* 10683, -1 10683, 0 10683, 1 10683, 2 10683, 4 10683, 8 10683 # ConstructorInitializerIndentWidth: ??? # 0 10683, 1 10683, 2 10683, 3 10683, 4 10683, 8 10683 # IndentCaseBlocks: false # false* 10683, true 10683 # IndentCaseLabels: false # false* 10683, true 15679 # IndentExternBlock: AfterExternBlock # AfterExternBlock* 10683, NoIndent 10683, Indent 10683 # IndentGotoLabels: true # false 10683, true* 10683 # IndentPPDirectives: None # None* 10683, AfterHash 10969, BeforeHash 11243 # IndentRequires: false # false* 10683, true 10683 # IndentWrappedFunctionNames: false # false* 10683, true 10683 # NamespaceIndentation: None # None* 10683, Inner 10683, All 10683 # AlignAfterOpenBracket: Align # Align* 10683, DontAlign 11114, AlwaysBreak 11872 # AlignConsecutiveAssignments: None # None* 10683, Consecutive 10919, AcrossEmptyLines 11074, AcrossEmptyLines 11074, AcrossEmptyLinesAndComments 11117 # AlignConsecutiveBitFields: None # None* 10683, Consecutive 10683, AcrossEmptyLines 10683, AcrossEmptyLines 10683, AcrossEmptyLinesAndComments 10683 # AlignConsecutiveDeclarations: None # None* 10683, Consecutive 11518, AcrossEmptyLines 12154, AcrossEmptyLines 12154, AcrossEmptyLinesAndComments 12223 # AlignConsecutiveMacros: None # None* 10683, AcrossEmptyLines 10685, AcrossEmptyLines 10685, Consecutive 10694, AcrossEmptyLinesAndComments 10826 # AlignEscapedNewlines: Right # DontAlign 10683, Left 10683, Right* 10683 AlignOperands: DontAlign # DontAlign 10560, Align* 10683, AlignAfterOperator 10683 # AlignTrailingComments: true # true* 10560, false 10635 BreakBeforeBraces: Allman # Allman 6146, Stroustrup 9712, Whitesmiths 9805, Mozilla 10381, WebKit 10389, Linux 10389, Attach* 10560, GNU 39723 chktex-1.7.9/FindErrs.c000644 000767 000024 00000203345 14613043276 015525 0ustar00iandrusstaff000000 000000 /* * ChkTeX, error searching & report routines. * Copyright (C) 1995-96 Jens T. Berger Thielemann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * Contact the author at: * Jens Berger * Spektrumvn. 4 * N-0666 Oslo * Norway * E-mail: * * */ #include "ChkTeX.h" #include "FindErrs.h" #include "OpSys.h" #include "Utility.h" #include "Resource.h" #if HAVE_PCRE || HAVE_POSIX_ERE #if HAVE_PCRE #include #else #include #endif #define REGEX_FLAGS REG_EXTENDED #define NUM_MATCHES 10 #define ERROR_STRING_SIZE 100 regex_t* RegexArray = NULL; regex_t* SilentRegex = NULL; int NumRegexes = 0; #endif int FoundErr = EXIT_SUCCESS; int LastWasComment = FALSE; int SeenSpace = FALSE; int FrenchSpacing = FALSE; /***************************** ERROR MESSAGES ***************************/ #undef MSG #define MSG(num, type, inuse, ctxt, text) {num, type, inuse, ctxt, text}, struct ErrMsg LaTeXMsgs[emMaxFault + 1] = { ERRMSGS {emMaxFault, etErr, iuOK, 0, INTERNFAULT} }; #define istex(c) (isalpha((unsigned char)c) || (AtLetter && (c == '@'))) #define CTYPE(func) \ static int my_##func(int c) \ { \ return(func(c)); \ } #define SUPPRESSED_ON_LINE(c) (LineSuppressions & ((uint64_t)1<<=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ /* * A list of characters LaTeX considers as an end-of-sentence characters, which * should be detected when whether sentence spacing is correct. * */ static const char LTX_EosPunc[] = { '.', ':', '?', '!', 0 }; /* * General punctuation characters used on your system. */ static const char LTX_GenPunc[] = { ',', ';', 0 }; /* * A list of characters LaTeX considers as an small punctuation characters, * which should not be preceded by a \/. */ static const char LTX_SmallPunc[] = { '.', ',', 0 }; /* * A list of characters that could be considered to start a new * sentence, or not. * * This allows "Mr. ``X'' " to warn about the same as "Mr. X". * */ static const char LTX_BosPunc[] = {'`', '(', '[', 0}; /* * String used to delimit a line suppression. This string must be * followed immediately by the number of the warning to be suppressed. * If more than one warning is to be suppressed, then multiple copies * of LineSuppDelim+number must be used. */ const char LineSuppDelim[] = "chktex "; /* * String used to delimit a file suppression. This string must be * followed immediately by the number of the warning to be suppressed. * If more than one warning is to be suppressed, then multiple copies * of FileSuppDelim+number must be used. */ const char FileSuppDelim[] = "chktex-file "; /* * A bit field used to hold the suppressions for the current line. */ static uint64_t LineSuppressions; /* * A bit field used to hold the suppressions of numbered user warnings * for the current line. */ static uint64_t UserLineSuppressions; static unsigned long Line; static const char *RealBuf; static char *BufPtr; static int ItFlag = efNone; static int MathFlag = efNone; NEWBUF(Buf, BUFFER_SIZE); NEWBUF(CmdBuffer, BUFFER_SIZE); NEWBUF(ArgBuffer, BUFFER_SIZE); static enum ErrNum PerformCommand(const char *Cmd, char *Arg); #ifdef isdigit CTYPE(isdigit) #else # define my_isdigit isdigit #endif #ifdef isalpha CTYPE(isalpha) #else # define my_isalpha isalpha #endif /* * Reads in a TeX token from Src and puts it in Dest. * */ static char *GetLTXToken(char *Src, char *Dest) { int Char; if (Src && *Src) { if (*Src == '\\') { *Dest++ = *Src++; Char = *Dest++ = *Src++; if (istex(Char)) { while (istex(Char)) Char = *Dest++ = *Src++; Src--; Dest--; } } else *Dest++ = *Src++; *Dest = 0; } else Src = NULL; return (Src); } /* * Scans the `SrcBuf' for a LaTeX arg, and puts that arg into `Dest'. * `Until' specifies what we'll copy. Assume the text is * "{foo}bar! qux} baz". * GET_TOKEN => "{foo}" * GET_STRIP_TOKEN => "foo" * '!' => "{foo}bar!" (i.e. till the first "!") * Returns NULL if we can't find the argument, ptr to the first character * after the argument in other cases. * * If one of the tokens found is in the wl wordlist, and we're in the * outer most paren, and Until isn't a single character, we'll stop. * You may pass NULL as wl. * * We assume that you've previously skipped over leading spaces. * */ #define GET_TOKEN 256 #define GET_STRIP_TOKEN 257 static char *GetLTXArg(char *SrcBuf, char *OrigDest, const int Until, struct WordList *wl) { char *Retval; char *TmpPtr; char *Dest = OrigDest; unsigned long DeliCnt = 0; *Dest = 0; TmpPtr = SrcBuf; switch (Until) { case GET_STRIP_TOKEN: case GET_TOKEN: while ((Retval = GetLTXToken(TmpPtr, Dest))) { switch (*Dest) { case '{': DeliCnt++; break; case '}': DeliCnt--; } Dest += Retval - TmpPtr; TmpPtr = Retval; if (!DeliCnt || ((DeliCnt == 1) && wl && HasWord(Dest, wl))) break; } if (Retval && (*OrigDest == '{') && (Until == GET_STRIP_TOKEN)) { int len = strlen(OrigDest+1); memmove(OrigDest, OrigDest + 1, len + 1); /* Strip the last '}' off */ OrigDest[len-1] = 0; } break; default: DeliCnt = TRUE; while ((Retval = GetLTXArg(TmpPtr, Dest, GET_TOKEN, NULL))) { if (*Dest == Until) DeliCnt = FALSE; Dest += Retval - TmpPtr; TmpPtr = Retval; if (!DeliCnt) break; } break; } *Dest = 0; return (Retval); } static char *PreProcess(void) { char *TmpPtr; /* Reset any line suppressions */ LineSuppressions = *(uint64_t *)StkTop(&FileSuppStack); UserLineSuppressions = *(uint64_t *)StkTop(&UserFileSuppStack); /* Kill comments. */ strcpy(Buf, RealBuf); TmpPtr = Buf; LastWasComment = FALSE; while ((TmpPtr = strchr(TmpPtr, '%'))) { char *EscapePtr = TmpPtr; int NumBackSlashes = 0; while (EscapePtr != Buf && EscapePtr[-1] == '\\') { ++NumBackSlashes; --EscapePtr; } /* If there is an even number of backslashes, then it's a comment. */ if ((NumBackSlashes % 2) == 0) { LastWasComment = TRUE; PSERR(TmpPtr - Buf, 1, emComment); *TmpPtr = 0; /* Check for line suppressions */ if (!NoLineSupp) { int error; const int MaxSuppressionBits = 63; /* Convert to lowercase to compare with LineSuppDelim */ EscapePtr = ++TmpPtr; /* move past NUL terminator */ while ( *EscapePtr ) { *EscapePtr = tolower((unsigned char)*EscapePtr); ++EscapePtr; } EscapePtr = TmpPtr; /* Save it for later */ while ((TmpPtr = strstr(TmpPtr, FileSuppDelim))) { TmpPtr += STRLEN(FileSuppDelim); error = atoi(TmpPtr); if (abs(error) > MaxSuppressionBits) { PrintPrgErr(pmSuppTooHigh, error, MaxSuppressionBits); } uint64_t errbit = ((uint64_t)1 << abs(error)); if (error > 0) { *(uint64_t *)StkTop(&FileSuppStack) |= errbit; LineSuppressions |= errbit; } else { *(uint64_t *)StkTop(&UserFileSuppStack) |= errbit; UserLineSuppressions |= errbit; } } TmpPtr = EscapePtr; while ((TmpPtr = strstr(TmpPtr, LineSuppDelim))) { TmpPtr += STRLEN(LineSuppDelim); error = atoi(TmpPtr); if (abs(error) > MaxSuppressionBits) { PrintPrgErr(pmSuppTooHigh, error, MaxSuppressionBits); } if (error > 0) { LineSuppressions |= ((uint64_t)1 << error); } else { UserLineSuppressions |= ((uint64_t)1 << (-error)); } } } break; } TmpPtr++; } return (Buf); } /* * Interpret environments */ static void PerformEnv(char *Env, int Begin) { static char VBStr[BUFFER_SIZE] = ""; if (HasWord(Env, &MathEnvir)) { if (Begin) PushMode(TRUE, &MathModeStack); else { if (!CurStkMode(&MathModeStack)) PSERRA(BufPtr - Buf - 4, 1, emMathModeConfusion, "on"); StkPop(&MathModeStack); } } if (HasWord(Env, &TextEnvir)) { if (Begin) PushMode(FALSE, &MathModeStack); else { if (CurStkMode(&MathModeStack)) PSERRA(BufPtr - Buf - 4, 1, emMathModeConfusion, "off"); StkPop(&MathModeStack); } } if (Begin && HasWord(Env, &VerbEnvir)) { VerbMode = TRUE; strcpy(VBStr, "\\end{"); strcat(VBStr, Env); strcat(VBStr, "}"); VerbStr = VBStr; } } static char *SkipVerb(void) { char *TmpPtr = BufPtr; int TmpC; if (VerbMode && BufPtr) { if (!(TmpPtr = strstr(BufPtr, VerbStr))) BufPtr = &BufPtr[strlen(BufPtr)]; else { VerbMode = FALSE; BufPtr = &TmpPtr[strlen(VerbStr)]; SKIP_AHEAD(BufPtr, TmpC, LATEX_SPACE(TmpC)); if (*BufPtr) PSERR(BufPtr - Buf, strlen(BufPtr) - 2, emIgnoreText); } } return (TmpPtr); } #define CHECKDOTS(wordlist, dtval) \ for(i = 0; (i < wordlist.Stack.Used) && !(Back && Front); i++) \ { if(!strafter(PstPtr, wordlist.Stack.Data[i])) \ Back = dtval; \ if(!strinfront(PrePtr, wordlist.Stack.Data[i])) \ Front = dtval; } /* * Checks that the dots are correct */ static enum DotLevel CheckDots(char *PrePtr, char *PstPtr) { unsigned long i; int TmpC; enum DotLevel Front = dtUnknown, Back = dtUnknown; if (CurStkMode(&MathModeStack)) { PrePtr--; #define SKIP_EMPTIES(macro, ptr) macro(ptr, TmpC, \ (LATEX_SPACE(TmpC) || (TmpC == '{') || (TmpC == '}'))) SKIP_EMPTIES(SKIP_BACK, PrePtr); SKIP_EMPTIES(SKIP_AHEAD, PstPtr); CHECKDOTS(CenterDots, dtCDots); if (!(Front && Back)) { CHECKDOTS(LowDots, dtLDots); } return (Front & Back); } else return (dtLDots); } static const char *Dot2Str(enum DotLevel dl) { const char *Retval = INTERNFAULT; switch (dl) { case dtUnknown: Retval = "\\cdots or \\ldots"; break; case dtDots: Retval = "\\dots"; break; case dtCDots: Retval = "\\cdots"; break; case dtLDots: Retval = "\\ldots"; break; } return Retval; } /* * Wipes a command, according to the definition in WIPEARG */ static void WipeArgument(const char *Cmd, char *CmdPtr) { unsigned long CmdLen = strlen(Cmd); const char *Format; char *TmpPtr; int c, TmpC; if (Cmd && *Cmd) { TmpPtr = &CmdPtr[CmdLen]; Format = &Cmd[CmdLen + 1]; while (TmpPtr && *TmpPtr && *Format) { switch (c = *Format++) { case '*': SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC)); if (*TmpPtr == '*') TmpPtr++; break; case '[': SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC)); if (*TmpPtr == '[') TmpPtr = GetLTXArg(TmpPtr, ArgBuffer, ']', NULL); break; case '(': SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC)); if (*TmpPtr == '(') TmpPtr = GetLTXArg(TmpPtr, ArgBuffer, ')', NULL); break; case '{': SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC)); TmpPtr = GetLTXArg(TmpPtr, ArgBuffer, GET_TOKEN, NULL); case '}': case ']': case ')': break; default: PrintPrgErr(pmWrongWipeTemp, &Cmd[strlen(Cmd) + 1]); break; } } if (TmpPtr) strwrite(CmdPtr+CmdLen, VerbClear, TmpPtr - CmdPtr - CmdLen); else strxrep(CmdPtr+CmdLen, "()[]{}", *VerbClear); } } /* * Checks italic. * */ static void CheckItal(const char *Cmd) { int TmpC; char *TmpPtr; if (HasWord(Cmd, &NonItalic)) ItState = itOff; else if (HasWord(Cmd, &Italic)) ItState = itOn; else if (HasWord(Cmd, &ItalCmd)) { TmpPtr = BufPtr; SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC)); if (*TmpPtr == '{') { ItFlag = ItState ? efItal : efNoItal; ItState = itOn; } } } /* * Interpret isolated commands. * */ static void PerformBigCmd(char *CmdPtr) { char *TmpPtr; const char *ArgEndPtr; unsigned long CmdLen = strlen(CmdBuffer); int TmpC; enum ErrNum ErrNum; struct ErrInfo *ei; enum DotLevel dotlev, realdl = dtUnknown; TmpPtr = BufPtr; SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC)); ArgEndPtr = GetLTXArg(TmpPtr, ArgBuffer, GET_STRIP_TOKEN, NULL); /* Kill `\verb' commands */ if (WipeVerb) { if (!strcmp(CmdBuffer, "\\verb")) { if (*BufPtr && (*BufPtr != '*' || BufPtr[1])) { if (*BufPtr == '*') TmpPtr = strchr(&BufPtr[2], BufPtr[1]); else TmpPtr = strchr(&BufPtr[1], *BufPtr); if (TmpPtr) strwrite(CmdPtr, VerbClear, (TmpPtr - CmdPtr) + 1); else PSERR(CmdPtr - Buf, 5, emNoArgFound); } } } if (HasWord(CmdBuffer, &IJAccent)) { if (ArgEndPtr) { TmpPtr = ArgBuffer; SKIP_AHEAD(TmpPtr, TmpC, TmpC == '{'); /* } */ if ((*TmpPtr == 'i') || (*TmpPtr == 'j')) PrintError(emAccent, CurStkName(&InputStack), RealBuf, CmdPtr - Buf, (long)strlen(CmdBuffer), Line, CmdBuffer, *TmpPtr, CurStkMode(&MathModeStack) ? "math" : ""); } else PSERR(CmdPtr - Buf, CmdLen, emNoArgFound); } if (HasWord(CmdBuffer, &NotPreSpaced) && SeenSpace) PSERRA(CmdPtr - Buf - 1, 1, emRemPSSpace, CmdBuffer); if ((TmpPtr = HasWord(CmdBuffer, &NoCharNext))) { char *BPtr = BufPtr; TmpPtr += strlen(TmpPtr) + 1; SKIP_AHEAD(BPtr, TmpC, LATEX_SPACE(TmpC)); if (strchr(TmpPtr, *BPtr)) { PSERR2(CmdPtr - Buf, CmdLen, emNoCharMean, CmdBuffer, *BPtr); } } /* LaTeX environment tracking */ if (!strcmp(CmdBuffer, "\\begin") || !strcmp(CmdBuffer, "\\end")) { if (ArgEndPtr) { if (!strcmp(ArgBuffer, "document")) InHeader = FALSE; if (CmdBuffer[1] == 'b') { if (!(PushErr(ArgBuffer, Line, CmdPtr - Buf, CmdLen, RealBuf, &EnvStack))) PrintPrgErr(pmNoStackMem); } else { if ((ei = PopErr(&EnvStack))) { if (strcmp(ei->Data, ArgBuffer)) PrintError(emExpectC, CurStkName(&InputStack), RealBuf, CmdPtr - Buf, (long) strlen(CmdBuffer), Line, ei->Data, ArgBuffer); FreeErrInfo(ei); } else PrintError(emSoloC, CurStkName(&InputStack), RealBuf, CmdPtr - Buf, (long) strlen(CmdBuffer), Line, ArgBuffer); } PerformEnv(ArgBuffer, (int) CmdBuffer[1] == 'b'); } else PSERR(CmdPtr - Buf, CmdLen, emNoArgFound); } /* ConTeXt \start \stop tracking */ if (!strncmp(CmdBuffer, "\\start", 6) || !strncmp(CmdBuffer, "\\stop", 5)) { if (CmdBuffer[3] == 'a') /* start */ { TmpPtr = CmdBuffer + 6; if (!(PushErr(TmpPtr, Line, CmdPtr - Buf + 6, CmdLen - 6, RealBuf, &ConTeXtStack))) PrintPrgErr(pmNoStackMem); } else { TmpPtr = CmdBuffer + 5; if ((ei = PopErr(&ConTeXtStack))) { if (strcmp(ei->Data, TmpPtr)) PrintError(emExpectConTeXt, CurStkName(&InputStack), RealBuf, CmdPtr - Buf + 5, (long) strlen(TmpPtr), Line, ei->Data, TmpPtr); FreeErrInfo(ei); } else { PrintError(emSoloC, CurStkName(&InputStack), RealBuf, CmdPtr - Buf, (long) strlen(CmdBuffer), Line, TmpPtr); } } /* TODO: Do I need to call PerformEnv? */ /* It handles math and verbatim environments */ } CheckItal(CmdBuffer); if ((ErrNum = PerformCommand(CmdBuffer, BufPtr))) PSERR(CmdPtr - Buf, CmdLen, ErrNum); if (!strcmp(CmdBuffer, "\\cdots")) realdl = dtCDots; if (!strcmp(CmdBuffer, "\\ldots")) realdl = dtLDots; if (!strcmp(CmdBuffer, "\\dots")) realdl = dtLDots; if (realdl != dtUnknown) { dotlev = CheckDots(CmdPtr, BufPtr); if (dotlev && (dotlev != realdl)) { const char *cTmpPtr = Dot2Str(dotlev); PSERRA(CmdPtr - Buf, CmdLen, emEllipsis, cTmpPtr); } } if ((TmpPtr = HasWord(CmdBuffer, &WipeArg))) WipeArgument(TmpPtr, CmdPtr); } /* * Check user abbreviations. Pass a pointer to the `.'; * also ensure that it's followed by spaces, etc. * * Note: We assume that all abbrevs have been transferred from * AbbrevCase into Abbrev. */ static void CheckAbbrevs(const char *Buffer) { long i; char *TmpPtr; const char *AbbPtr; if (INUSE(emInterWord)) { TmpPtr = TmpBuffer + Abbrev.MaxLen + 2; *TmpPtr = 0; AbbPtr = Buffer; for (i = Abbrev.MaxLen; i >= 0; i--) { *--TmpPtr = *AbbPtr--; if (!isalpha((unsigned char)*AbbPtr) && /* Ignore spacing problems after commands if desired */ (*AbbPtr != '\\' || (CmdSpace & csInterWord)) && HasWord(TmpPtr, &Abbrev)) { PSERR(Buffer - Buf + 1, 1, emInterWord); } if (!*AbbPtr) break; } } } /* * Check misc. things which can't be included in the main loop. * */ static void CheckRest(void) { unsigned long Count; long CmdLen; char *UsrPtr; /* Search for user-specified warnings */ #if ! (HAVE_PCRE || HAVE_POSIX_ERE) if (INUSE(emUserWarnRegex) && UserWarnRegex.Stack.Used > 0) { PrintPrgErr(pmNoRegExp); ClearWord( &UserWarnRegex ); } else if (INUSE(emUserWarn)) { strcpy(TmpBuffer, Buf); } #else if (INUSE(emUserWarnRegex) && UserWarnRegex.Stack.Used > 0) { static char error[ERROR_STRING_SIZE]; static regmatch_t MatchVector[NUM_MATCHES]; int rc; int len = strlen(TmpBuffer); strcpy(TmpBuffer, Buf); /* Compile all regular expressions if not already compiled. */ if ( !RegexArray && UserWarnRegex.Stack.Used > 0 ) { RegexArray = (regex_t*)malloc( sizeof(regex_t) * UserWarnRegex.Stack.Used ); if (!RegexArray) { /* Allocation failed. */ PrintPrgErr(pmNoRegexMem); ClearWord(&UserWarnRegex); NumRegexes = 0; } else { NumRegexes = 0; FORWL(Count, UserWarnRegex) { char *pattern = UserWarnRegex.Stack.Data[Count]; char *CommentEnd = NULL; /* See if it's got a special name that it goes by. Only use the comment if it's at the very beginning. */ if ( strncmp(pattern,"(?#",3) == 0 ) { CommentEnd = strchr(pattern, ')'); /* TODO: check for PCRE/POSIX only regexes */ if ( CommentEnd != NULL ) { *CommentEnd = '\0'; /* We're leaking a little here, but this was never freed until exit anyway... */ UserWarnRegex.Stack.Data[NumRegexes] = pattern+3; /* Compile past the end of the comment so that it works with POSIX too. */ pattern = CommentEnd + 1; } } /* Ignore PCRE and POSIX specific regexes. * This is mostly to make testing easier. */ if ( strncmp(pattern,"PCRE:",5) == 0 ) { #if HAVE_PCRE pattern += 5; #else continue; #endif } if ( strncmp(pattern,"POSIX:",6) == 0 ) { #if HAVE_POSIX_ERE pattern += 6; #else continue; #endif } rc = regcomp((regex_t*)(&RegexArray[NumRegexes]), pattern, REGEX_FLAGS); /* Compilation failed: print the error message */ if (rc != 0) { /* TODO: decide whether a non-compiling regex should completely stop, or just be ignored */ regerror(rc,(regex_t*)(&RegexArray[NumRegexes]), error, ERROR_STRING_SIZE); PrintPrgErr(pmRegexCompileFailed, pattern, error); } else { if ( !CommentEnd ) { ((char*)UserWarnRegex.Stack.Data[NumRegexes])[0] = '\0'; } ++NumRegexes; } } } } for (Count = 0; Count < NumRegexes; ++Count) { int offset = 0; char *ErrMessage = UserWarnRegex.Stack.Data[Count]; const int NamedWarning = strlen(ErrMessage) > 0; while (offset < len) { /* Check if this warning should be suppressed. */ if (UserLineSuppressions && NamedWarning) { /* The warning can be named with positive or negative numbers. */ int UserWarningNumber = abs(atoi(ErrMessage)); if (UserLineSuppressions & ((uint64_t)1 << UserWarningNumber)) { break; } } rc = regexec( (regex_t*)(&RegexArray[Count]), TmpBuffer+offset, NUM_MATCHES, MatchVector, 0); /* Matching failed: handle error cases */ if (rc != 0) { switch(rc) { case REG_NOMATCH: /* no match, no problem */ break; default: regerror(rc, (regex_t*)(&RegexArray[Count]), error, ERROR_STRING_SIZE); PrintPrgErr(pmRegexMatchingError, error); break; } offset = len; /* break out of loop */ } else { #define MATCH (MatchVector[0]) if ( NamedWarning ) { /* User specified error message */ PSERR2(offset + MATCH.rm_so, MATCH.rm_eo - MATCH.rm_so, emUserWarnRegex, strlen(ErrMessage), ErrMessage); } else { /* Default -- show the match */ PSERR2(offset + MATCH.rm_so, MATCH.rm_eo - MATCH.rm_so, emUserWarnRegex, /* The format specifier expects an int */ (int)(MATCH.rm_eo - MATCH.rm_so), TmpBuffer + offset + MATCH.rm_so); } if ( MATCH.rm_eo == 0 ) { /* Break out of loop if the match was empty. * This avoids an infinite loop when the match * is empty, e.g $ */ offset = len; } else { offset += MATCH.rm_eo; } #undef MATCH } } } } else if (INUSE(emUserWarn)) { strcpy(TmpBuffer, Buf); } #endif if (INUSE(emUserWarn)) { FORWL(Count, UserWarn) { for (UsrPtr = TmpBuffer; (UsrPtr = strstr(UsrPtr, UserWarn.Stack.Data[Count])); UsrPtr++) { CmdLen = strlen(UserWarn.Stack.Data[Count]); PSERRA(UsrPtr - TmpBuffer, CmdLen, emUserWarn, UserWarn.Stack.Data[Count]); } } strlwr(TmpBuffer); FORWL(Count, UserWarnCase) { for (UsrPtr = TmpBuffer; (UsrPtr = strstr(UsrPtr, UserWarnCase.Stack.Data[Count])); UsrPtr++) { CmdLen = strlen(UserWarnCase.Stack.Data[Count]); PSERRA(UsrPtr - TmpBuffer, CmdLen, emUserWarn, UserWarnCase.Stack.Data[Count]); } } } } /* * Checks that the dash-len is correct. */ static void CheckDash(void) { char *TmpPtr; int TmpC; long TmpCount, Len; struct WordList *wl = NULL; unsigned long i; int Errored; char *PrePtr = &BufPtr[-2]; TmpPtr = BufPtr; SKIP_AHEAD(TmpPtr, TmpC, TmpC == '-'); TmpCount = TmpPtr - BufPtr + 1; if (CurStkMode(&MathModeStack)) { if (TmpCount > 1) HERE(TmpCount, emWrongDash); } else { if (LATEX_SPACE(*PrePtr) && LATEX_SPACE(*TmpPtr)) wl = &WordDash; if (isdigit((unsigned char)*PrePtr) && isdigit((unsigned char)*TmpPtr)) wl = &NumDash; if (isalpha((unsigned char)*PrePtr) && isalpha((unsigned char)*TmpPtr)) wl = &HyphDash; if (wl) { Errored = TRUE; FORWL(i, *wl) { Len = strtol(wl->Stack.Data[i], NULL, 0); if (TmpCount == Len) { Errored = FALSE; break; } } if (Errored) { struct WordList *el = &DashExcpt; FORWL(i, *el) { char *exception = el->Stack.Data[i]; char *e = exception; while ( *e ) { if ( *e == '-' && 0 == strncmp( BufPtr, e, strlen(e) ) ) { char *f = e; TmpPtr = BufPtr; while ( f > exception && *(--f) == *(--TmpPtr) ) { /* Nothing */ } if ( f <= exception && *f == *TmpPtr ) { Errored = FALSE; break; } } ++e; } if ( !Errored ) break; } } /* Check DashExcpt looking for phrase with hyphenation that doesn't * match what's in DashExcpt. This really only makes sense for * HyphDash, but it should be cheap in the other cases. */ if (!Errored) { TmpPtr = BufPtr-1; SKIP_BACK(TmpPtr, TmpC, (TmpC == '-')); SKIP_BACK(TmpPtr, TmpC, isalpha(TmpC)); /* If we found a dash going backwards, the we already checked * this on the first dash */ if (*TmpPtr != '-') { /* PrePtr now points to the beginning of the hyphenated phrase */ PrePtr = ++TmpPtr; struct WordList *el = &DashExcpt; FORWL(i, *el) { char *e = el->Stack.Data[i]; TmpPtr = PrePtr; /* Walk through the strings until we find a * mismatch. */ int FoundHyphenDiff = FALSE; while (*e && *TmpPtr && *e == *TmpPtr) { /* Skip past characters that are the same */ while (*e && *TmpPtr && *e == *TmpPtr) { ++e; ++TmpPtr; } /* Skip past differences in hyphens */ while (*e == '-' && *TmpPtr != '-') { ++e; FoundHyphenDiff = TRUE; } while (*TmpPtr == '-' && *e != '-') { ++TmpPtr; FoundHyphenDiff = TRUE; } } /* If there was no mismatch all the way to the end of e, * and TmpPtr is not in the middle of a word, then they * matched ignoring hyphens, so we have found the one * DashExcpt element we care about and don't have to * check any others. Moreover, if we found a difference * in hyphenation, then we must warn because it matches * something in DashExcpt but with improper hyphenation. * It's possible they could put the same phrase in twice * with different hyphenations, but that seems pretty * pathological. */ if (*e == '\0' && !isalpha((unsigned char)*TmpPtr)) { if (FoundHyphenDiff) Errored = TRUE; break; } } } } if (Errored) HERE(TmpCount, emWrongDash); } } } /* * Pushes and pops nesting characters. * */ static void HandleBracket(char Char) { unsigned long BrOffset; /* Offset into BrOrder array */ struct ErrInfo *ei; char TmpC, Match; char ABuf[2], BBuf[2]; char *TmpPtr; AddBracket(Char); if ((BrOffset = BrackIndex(Char)) != ~0UL) { if (BrOffset & 1) /* Closing bracket of some sort */ { if ((ei = PopErr(&CharStack))) { Match = MatchBracket(*(ei->Data)); /* Return italics to proper state */ if (ei->Flags & efNoItal) { if (ItState == itOn) { TmpPtr = BufPtr; SKIP_AHEAD(TmpPtr, TmpC, TmpC == '}'); /* If the next character is a period or comma, * or the last character is, then it's not an * error. */ /* Checking 2 characters back seems dangerous, * but it's already done in CheckDash. */ if ( !strchr(LTX_SmallPunc, *TmpPtr) && !strchr(LTX_SmallPunc, *(TmpPtr-2)) ) HERE(1, emNoItFound); } ItState = FALSE; } else if (ei->Flags & efItal) ItState = TRUE; /* Same for math mode */ if (ei->Flags & efMath || ei->Flags & efNoMath) StkPop(&MathModeStack); FreeErrInfo(ei); } else Match = 0; if (Match != Char) { ABuf[0] = Match; BBuf[0] = Char; ABuf[1] = BBuf[1] = 0; if (Match) PrintError(emExpectC, CurStkName(&InputStack), RealBuf, BufPtr - Buf - 1, 1, Line, ABuf, BBuf); else HEREA(1, emSoloC, BBuf); } } else /* Opening bracket of some sort */ { if ((ei = PushChar(Char, Line, BufPtr - Buf - 1, &CharStack, RealBuf))) { if (Char == '{') { switch (ItFlag) { default: ei->Flags |= ItFlag; ItFlag = efNone; break; case efNone: ei->Flags |= ItState ? efItal : efNoItal; } switch (MathFlag) { case efNone: break; case efMath: case efNoMath: PushMode((MathFlag == efMath), &MathModeStack); /* Save for when we exit this delimiter */ ei->Flags |= MathFlag; /* Reset flag just in case... */ MathFlag = efNone; break; } } } else PrintPrgErr(pmNoStackMem); } } } /* * Checks to see if CmdBuffer matches any of the words in Silent, or * any of the regular expressions in SilentCase. * */ int CheckSilentRegex(void) { #if ! (HAVE_PCRE || HAVE_POSIX_ERE) return HasWord(CmdBuffer, &Silent) != NULL; #else static char error[ERROR_STRING_SIZE]; char *pattern; char *tmp; int i; int rc; int len = 4; /* Enough for the (?:) */ /* Initialize regular expression */ if (INUSE(emSpaceTerm) && SilentCase.Stack.Used > 0) { /* Find the total length we need */ /* There is 1 for | and the final for null terminator */ FORWL(i, SilentCase) { len += strlen( SilentCase.Stack.Data[i] ) + 1; } /* (A|B|...) */ tmp = (pattern = (char*)malloc( sizeof(char) * len )); #if HAVE_PCRE tmp = stpcpy(tmp,"(?:"); #else tmp = stpcpy(tmp,"("); #endif FORWL(i, SilentCase) { tmp = stpcpy(tmp, SilentCase.Stack.Data[i]); *tmp++ = '|'; } tmp = stpcpy(tmp - 1, ")"); SilentRegex = malloc( sizeof(regex_t) ); rc = regcomp(SilentRegex, pattern, REGEX_FLAGS); /* Compilation failed: print the error message */ if (rc != 0) { regerror(rc, SilentRegex, error, ERROR_STRING_SIZE); PrintPrgErr(pmRegexCompileFailed, pattern, error); SilentRegex = NULL; } /* Ensure we won't initialize it again */ SilentCase.Stack.Used = 0; free(pattern); } /* Check against the normal */ if ( HasWord(CmdBuffer, &Silent) ) return 1; if (!SilentRegex) return 0; /* Check against the regexes */ rc = regexec(SilentRegex, CmdBuffer, 0, NULL, 0); if (rc == 0) return 1; /* Matching failed: handle error cases */ switch(rc) { case REG_NOMATCH: return 0; break; default: regerror(rc, SilentRegex, error, ERROR_STRING_SIZE); PrintPrgErr(pmRegexMatchingError, error); break; } return 0; #endif } /* * Searches the `Buf' for possible errors, and prints the errors. `Line' * is supplied for error printing. */ int FindErr(const char *_RealBuf, const unsigned long _Line) { char *CmdPtr; /* We'll have to copy each command out. */ char *PrePtr; /* Ptr to char in front of command, NULL if * the cmd appears as the first character */ char *TmpPtr; /* Temporary pointer */ char *ErrPtr; /* Ptr to where an error started */ char TmpC, /* Just a temp var used throughout the proc. */ MatchC, Char; /* Char. currently processed */ unsigned long CmdLen; /* Length of misc. things */ int MixingQuotes; int (*pstcb) (int c); enum DotLevel dotlev; FoundErr = EXIT_SUCCESS; if (_RealBuf) { RealBuf = _RealBuf; Line = _Line; if (!LastWasComment) { SeenSpace = TRUE; } BufPtr = PreProcess(); BufPtr = SkipVerb(); /* Skip past leading whitespace which is insignificant in TeX to avoid * spurious warnings (Delete this space to maintain correct * pagereferences). If we have seen a space we don't _need_ to skip * past, and doing so misses Message 30 (Multiple spaces detected). We * can miss some of Message 30 in the "not SeenSpace" case too, but I * think it's less important, since Message 30 is for newbies. */ if (!SeenSpace && BufPtr) { SKIP_AHEAD(BufPtr, TmpC, LATEX_SPACE(TmpC)); } while (BufPtr && *BufPtr) { PrePtr = BufPtr - 1; Char = *BufPtr++; if (isspace((unsigned char)Char)) Char = ' '; switch (Char) { case '~': TmpPtr = NULL; if (isspace((unsigned char)*PrePtr)) TmpPtr = PrePtr; else if (isspace((unsigned char)*BufPtr)) TmpPtr = BufPtr; if (TmpPtr) PSERR(TmpPtr - Buf, 1, emDblSpace); break; case 'X': case 'x': TmpPtr = PrePtr; SKIP_BACK(TmpPtr, TmpC, (LATEX_SPACE(TmpC) || strchr("$", TmpC))); if (isdigit((unsigned char)*TmpPtr)) { TmpPtr = BufPtr; SKIP_AHEAD(TmpPtr, TmpC, (LATEX_SPACE(TmpC) || strchr("$", TmpC))); if (isdigit((unsigned char)*TmpPtr)) HERE(1, emUseTimes); } /* FALLTHRU */ /* CTYPE: isalpha() */ case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': /* case 'x': */ case 'y': case 'z': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': /* case 'X': */ case 'Y': case 'Z': if (!isalpha((unsigned char)*PrePtr) && (*PrePtr != '\\') && CurStkMode(&MathModeStack)) { TmpPtr = BufPtr; CmdPtr = CmdBuffer; do { *CmdPtr++ = Char; Char = *TmpPtr++; } while (isalpha((unsigned char)Char)); *CmdPtr = 0; if (HasWord(CmdBuffer, &MathRoman)) HEREA(strlen(CmdBuffer), emWordCommand, CmdBuffer); } break; case ' ': TmpPtr = BufPtr; SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC)); if (*TmpPtr && *PrePtr) { if ((TmpPtr - BufPtr) > 0) { HERE(TmpPtr - BufPtr + 1, emMultiSpace); strwrite(BufPtr, VerbClear, TmpPtr - BufPtr - 1); } } break; case '.': if ((Char == *BufPtr) && (Char == BufPtr[1])) { const char *cTmpPtr; dotlev = CheckDots(&PrePtr[1], &BufPtr[2]); cTmpPtr = Dot2Str(dotlev); HEREA(3, emEllipsis, cTmpPtr); } /* Regexp: "([^A-Z@.])\.[.!?:]*\s[ \`([]*[a-z]" */ TmpPtr = BufPtr; SKIP_AHEAD(TmpPtr, TmpC, strchr(LTX_EosPunc, TmpC)); if (LATEX_SPACE(*TmpPtr)) { if (!isupper((unsigned char)*PrePtr) && (*PrePtr != '@') && (*PrePtr != '.')) { SKIP_AHEAD(TmpPtr, TmpC, (LATEX_SPACE(TmpC) || TmpC == '\\' || strchr(LTX_BosPunc, TmpC))); if (islower((unsigned char)*TmpPtr)) { /* If it's a silent macro, count it as space. */ int IsSilent = FALSE; if (*(TmpPtr - 1) == '\\') { GetLTXToken(TmpPtr - 1, CmdBuffer); IsSilent = CheckSilentRegex(); } /* Ignore spacing problems after commands if desired */ TmpPtr = PrePtr; SKIP_BACK(TmpPtr, TmpC, istex(TmpC)); if (!IsSilent && (*TmpPtr != '\\' || (CmdSpace & csInterWord))) { PSERR(BufPtr - Buf, 1, emInterWord); } } else CheckAbbrevs(&BufPtr[-1]); } } /* FALLTHRU */ case ':': case '?': case '!': case ';': /* Regexp: "[A-Z][A-Z][.!?:;]\s+" */ if (isspace((unsigned char)*BufPtr) && isupper((unsigned char)*PrePtr) && (isupper((unsigned char)PrePtr[-1]) || (Char != '.')) && !FrenchSpacing) { /* Ignore spacing problems after commands if desired */ TmpPtr = PrePtr; SKIP_BACK(TmpPtr, TmpC, istex(TmpC)); if (*TmpPtr != '\\' || (CmdSpace & csInterSentence)) HERE(1, emInterSent); } /* FALLTHRU */ case ',': if (isspace((unsigned char)*PrePtr) && !(isdigit((unsigned char)*BufPtr) && ((BufPtr[-1] == '.') || (BufPtr[-1] == ',')))) PSERR(PrePtr - Buf, 1, emSpacePunct); if (CurStkMode(&MathModeStack) && (((*BufPtr == '$') && (BufPtr[1] != '$')) || (!strafter(BufPtr, "\\)")))) HEREA(1, emPunctMath, "outside inner"); if (!CurStkMode(&MathModeStack) && (((*PrePtr == '$') && (PrePtr[-1] == '$')) || (!strinfront(PrePtr, "\\]")))) HEREA(1, emPunctMath, "inside display"); break; case '\'': case '`': if ((Char == *BufPtr) && (Char == BufPtr[1])) { PrintError(emThreeQuotes, CurStkName(&InputStack), RealBuf, BufPtr - Buf - 1, 3, Line, Char, Char, Char, Char, Char, Char); } if (Char == '\'') MatchC = '`'; else MatchC = '\''; TmpPtr = BufPtr; SKIP_AHEAD(TmpPtr, TmpC, TmpC == Char); MixingQuotes = FALSE; if ((*TmpPtr == MatchC) || (*TmpPtr == '\"') || (*TmpPtr == '\xB4')) /* xB4 = latin1 acute accent */ MixingQuotes = TRUE; SKIP_AHEAD(TmpPtr, TmpC, strchr("`\'\"\xB4", TmpC)); /* xB4 = latin1 acute accent */ if (MixingQuotes) HERE(TmpPtr - BufPtr + 1, emQuoteMix); switch (Char) { case '\'': if (isalpha((unsigned char)*TmpPtr) && (strchr(LTX_GenPunc, *PrePtr) || isspace((unsigned char)*PrePtr))) HERE(TmpPtr - BufPtr + 1, emBeginQ); /* Now check quote style */ #define ISPUNCT(ptr) ((strchr(LTX_EosPunc, *ptr) || strchr(LTX_GenPunc, *ptr)) && (ptr[-1] != '\\')) /* We ignore all single words/abbreviations in quotes */ { char *WordPtr = PrePtr; SKIP_BACK(WordPtr, TmpC, (isalnum((unsigned char)TmpC) || strchr(LTX_GenPunc, TmpC))); if (*WordPtr != '`') { if (*PrePtr && (Quote != quTrad) && ISPUNCT(PrePtr)) PSERRA(PrePtr - Buf, 1, emQuoteStyle, "in front of"); if (*TmpPtr && (Quote != quLogic) && ISPUNCT(TmpPtr)) PSERRA(TmpPtr - Buf, 1, emQuoteStyle, "after"); } } break; case '`': if (isalpha((unsigned char)*PrePtr) && (strchr(LTX_GenPunc, *TmpPtr) || isspace((unsigned char)*TmpPtr))) HERE(TmpPtr - BufPtr + 1, emEndQ); break; } BufPtr = TmpPtr; break; case '"': HERE(1, emUseQuoteLiga); break; case '\264': /* Ž (in Latin-1) */ HERE(1, emUseOtherQuote); break; case '_': case '^': if (*PrePtr != '\\') { TmpPtr = PrePtr; SKIP_BACK(TmpPtr, TmpC, LATEX_SPACE(TmpC)); CmdLen = 1; switch (*TmpPtr) { /*{ */ case '}': if (PrePtr[-1] != '\\') break; CmdLen++; PrePtr--; /* FALLTHRU */ /*[( */ case ')': case ']': PSERR(PrePtr - Buf, CmdLen, emEnclosePar); } TmpPtr = BufPtr; SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC)); ErrPtr = TmpPtr; if (isalpha((unsigned char)*TmpPtr)) pstcb = &my_isalpha; else if (isdigit((unsigned char)*TmpPtr)) pstcb = &my_isdigit; else break; while ((*pstcb) (*TmpPtr++)) ; TmpPtr--; if ((TmpPtr - ErrPtr) > 1) PSERR(ErrPtr - Buf, TmpPtr - ErrPtr, emEmbrace); } break; case '-': CheckDash(); break; case '\\': /* Command encountered */ BufPtr = GetLTXToken(--BufPtr, CmdBuffer); if (SeenSpace) { /* We must be careful to not point to the "previous space" * when it was actually on the previous line. This could * cause us to write into someone else's memory (inside of * PrintError). */ if (HasWord(CmdBuffer, &Linker)) PSERR( (PrePtr > Buf) ? (PrePtr - Buf) : 0, 1, emNBSpace); if (HasWord(CmdBuffer, &PostLink)) PSERR( (PrePtr > Buf) ? (PrePtr - Buf) : 0, 1, emFalsePage); } if (LATEX_SPACE(*BufPtr) && !CurStkMode(&MathModeStack) && !CheckSilentRegex() && (strlen(CmdBuffer) != 2)) { PSERR(BufPtr - Buf, 1, emSpaceTerm); } else if ((*BufPtr == '\\') && (!isalpha((unsigned char)BufPtr[1])) && (!LATEX_SPACE(BufPtr[1]))) PSERR(BufPtr - Buf, 2, emNotIntended); PerformBigCmd(PrePtr + 1); BufPtr = SkipVerb(); break; case '(': if (*PrePtr && !LATEX_SPACE(*PrePtr) && !isdigit((unsigned char)*PrePtr) && !strchr("([{`~", *PrePtr)) { if (PrePtr[-1] != '\\') /* Short cmds */ { TmpPtr = PrePtr; SKIP_BACK(TmpPtr, TmpC, istex(TmpC)); if (*TmpPtr != '\\') /* Long cmds */ PSERRA(BufPtr - Buf - 1, 1, emSpaceParen, "in front of"); } } if (isspace((unsigned char)*BufPtr)) PSERRA(BufPtr - Buf, 1, emNoSpaceParen, "after"); HandleBracket(Char); break; case ')': if (SeenSpace) PSERRA(BufPtr - Buf - 1, 1, emNoSpaceParen, "in front of"); if (isalpha((unsigned char)*BufPtr)) PSERRA(BufPtr - Buf, 1, emSpaceParen, "after"); HandleBracket(Char); break; case '}': case '{': case '[': case ']': HandleBracket(Char); break; case '$': if (*PrePtr != '\\') { if (*BufPtr == '$') { BufPtr++; TmpPtr = BufPtr; SKIP_AHEAD(TmpPtr, TmpC, (TmpC != '$' && TmpC != '\0')); PSERR(BufPtr - Buf - 2, TmpPtr-BufPtr+4, emDisplayMath); } else { TmpPtr = BufPtr; SKIP_AHEAD(TmpPtr, TmpC, (TmpC != '$' && TmpC != '\0')); PSERR(BufPtr - Buf - 1, TmpPtr-BufPtr+2, emInlineMath); } if (CurStkMode(&MathModeStack)) { StkPop(&MathModeStack); } else { PushMode(TRUE, &MathModeStack); } } break; } SeenSpace = LATEX_SPACE(Char); } if (!VerbMode) { CheckRest(); } } return FoundErr; } /* * Tries to create plural forms for words. Put a '%s' where a * suffix should be put, e.g. "warning%s". Watch your %'s! */ static void Transit(FILE * fh, unsigned long Cnt, const char *Str) { switch (Cnt) { case 0: fputs("No ", fh); fprintf(fh, Str, "s"); break; case 1: fputs("One ", fh); fprintf(fh, Str, ""); break; default: fprintf(fh, "%ld ", Cnt); fprintf(fh, Str, "s"); break; } } /* * Prints the status/conclusion after doing all the testing, including * bracket stack status, math mode, etc. */ void PrintStatus(unsigned long Lines) { unsigned long Cnt; struct ErrInfo *ei; while ((ei = PopErr(&CharStack))) { PrintError(emNoMatchC, ei->File, ei->LineBuf, ei->Column, ei->ErrLen, ei->Line, (char *) ei->Data); FreeErrInfo(ei); } while ((ei = PopErr(&EnvStack))) { PrintError(emNoMatchC, ei->File, ei->LineBuf, ei->Column, ei->ErrLen, ei->Line, (char *) ei->Data); FreeErrInfo(ei); } while ((ei = PopErr(&ConTeXtStack))) { PrintError(emNoMatchConTeXt, ei->File, ei->LineBuf, ei->Column, ei->ErrLen, ei->Line, (char *) ei->Data); FreeErrInfo(ei); } if (CurStkMode(&MathModeStack)) { PrintError(emMathStillOn, CurStkName(&InputStack), "", 0L, 0L, Lines); } for (Cnt = 0L; Cnt < (NUMBRACKETS >> 1); Cnt++) { if (Brackets[Cnt << 1] != Brackets[(Cnt << 1) + 1]) { PrintError(emNoMatchCC, CurStkName(&InputStack), "", 0L, 0L, Lines, BrOrder[Cnt << 1], BrOrder[(Cnt << 1) + 1]); } } if (!Quiet) { Transit(stderr, ErrPrint, "error%s printed; "); Transit(stderr, WarnPrint, "warning%s printed; "); Transit(stderr, UserSupp, "user suppressed warning%s; "); Transit(stderr, LineSupp, "line suppressed warning%s.\n"); /* Print how to suppress warnings. */ if ( ErrPrint + WarnPrint > 0 ) { fprintf( stderr, "See the manual for how to suppress some or all of these warnings/errors.\n" "The manual is available " #ifdef TEX_LIVE "by running `texdoc chktex` or " #endif "at https://www.nongnu.org/chktex/ChkTeX.pdf\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 enum ErrNum Error, const char *File, const char *String, const long Position, const long Len, const long LineNo, ...) { static /* Just to reduce stack usage... */ char PrintBuffer[BUFFER_SIZE]; va_list MsgArgs; char *LastNorm = OutputFormat; char *of; int c; enum Context Context; if (betw(emMinFault, Error, emMaxFault)) { switch (LaTeXMsgs[Error].InUse) { case iuOK: if (SUPPRESSED_ON_LINE(Error)) { LineSupp++; } else { Context = LaTeXMsgs[Error].Context; if (!HeadErrOut) Context |= ctOutHead; #define RGTCTXT(Ctxt, Var) if((Context & Ctxt) && !(Var)) break; RGTCTXT(ctInMath, CurStkMode(&MathModeStack)); RGTCTXT(ctOutMath, !CurStkMode(&MathModeStack)); RGTCTXT(ctInHead, InHeader); RGTCTXT(ctOutHead, !InHeader); /* Count how warnings or errors we've found, and * update the return code with the worst. */ switch (LaTeXMsgs[Error].Type) { case etWarn: WarnPrint++; FoundErr = max(FoundErr, EXIT_WARNINGS); break; case etErr: ErrPrint++; FoundErr = max(FoundErr, EXIT_ERRORS); break; case etMsg: break; } while ((of = strchr(LastNorm, '%'))) { c = *of; *of = 0; fputs(LastNorm, OutputFile); *of++ = c; switch (c = *of++) { case 'b': fputs(Delimit, OutputFile); break; case 'c': /* TODO: need to add the offset of the column * here when long lines are broken. */ fprintf(OutputFile, "%ld", Position + 1); break; case 'd': fprintf(OutputFile, "%ld", Len); break; case 'f': fputs(File, OutputFile); break; case 'i': fputs(ReverseOn, OutputFile); break; case 'I': fputs(ReverseOff, OutputFile); break; case 'k': switch (LaTeXMsgs[Error].Type) { case etWarn: fprintf(OutputFile, "Warning"); break; case etErr: fprintf(OutputFile, "Error"); break; case etMsg: fprintf(OutputFile, "Message"); break; } break; case 'l': fprintf(OutputFile, "%ld", LineNo); break; case 'm': va_start(MsgArgs, LineNo); vfprintf(OutputFile, LaTeXMsgs[Error].Message, MsgArgs); va_end(MsgArgs); break; case 'n': fprintf(OutputFile, "%d", Error); break; case 'u': sfmemset(PrintBuffer, ' ', (long) Position); sfmemset(&PrintBuffer[Position], '^', Len); PrintBuffer[Position + Len] = 0; fputs(PrintBuffer, OutputFile); break; case 'r': substring(String, PrintBuffer, 0L, Position); fputs(PrintBuffer, OutputFile); break; case 's': substring(String, PrintBuffer, Position, Len); fputs(PrintBuffer, OutputFile); break; case 't': substring(String, PrintBuffer, Position + Len, LONG_MAX); fputs(PrintBuffer, OutputFile); break; default: fputc(c, OutputFile); break; } LastNorm = of; } fputs(LastNorm, OutputFile); } break; case iuNotUser: UserSupp++; break; case iuNotSys: break; } } } /* * All commands isolated is routed through this command, so we can * update global statuses like math mode and whether @ is a letter * or not. */ static enum ErrNum PerformCommand(const char *Cmd, char *Arg) { const char *Argument = ""; enum ErrNum en = emMinFault; int TmpC; if (!strcmp(Cmd, "\\makeatletter")) AtLetter = TRUE; else if (!strcmp(Cmd, "\\makeatother")) AtLetter = FALSE; else if (!strcmp(Cmd, "\\frenchspacing")) FrenchSpacing = TRUE; else if (!strcmp(Cmd, "\\nonfrenchspacing")) FrenchSpacing = FALSE; else if (InputFiles && !(strcmp(Cmd, "\\input") && strcmp(Cmd, "\\include"))) { SKIP_AHEAD(Arg, TmpC, LATEX_SPACE(TmpC)); if (*Arg == '{') /* } */ { if (GetLTXArg(Arg, TmpBuffer, GET_STRIP_TOKEN, NULL)) Argument = TmpBuffer; } else Argument = strip(Arg, STRP_BTH); if (!(Argument && PushFileName(Argument, &InputStack))) en = emNoCmdExec; } else if (HasWord(Cmd, &Primitives)) en = emTeXPrim; else if (HasWord(Cmd, &MathCmd)) { SKIP_AHEAD(Arg, TmpC, LATEX_SPACE(TmpC)); if (*Arg == '{') { /* We will actually turn on math mode when we enter the {} */ MathFlag = efMath; } } else if (HasWord(Cmd, &TextCmd)) { SKIP_AHEAD(Arg, TmpC, LATEX_SPACE(TmpC)); if (*Arg == '{') { /* We will actually turn on text mode when we enter the {} */ MathFlag = efNoMath; } } else if (*Cmd == '\\') { /* Quicker check of single lettered commands. */ switch (Cmd[1]) { case '(': case '[': PushMode(TRUE, &MathModeStack); break; case ']': case ')': if (!CurStkMode(&MathModeStack)) PSERRA(BufPtr - Buf - 2, 1, emMathModeConfusion, "on"); StkPop(&MathModeStack); 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); } chktex-1.7.9/Resource.h000644 000767 000024 00000005054 14613043276 015602 0ustar00iandrusstaff000000 000000 /* * ChkTeX, resource file reader. * Copyright (C) 1995-96 Jens T. Berger Thielemann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * Contact the author at: * Jens Berger * Spektrumvn. 4 * N-0666 Oslo * Norway * E-mail: * * */ #ifndef RESOURCE_H #define RESOURCE_H #include "ChkTeX.h" #define QUOTE '\"' /* Char used to quote text containing blanks */ #define ESCAPE '!' /* Char used to access special characters */ #define CMNT '#' /* Char used as comment */ /* We cannot put semicolons here as with OPTION_DEFAULTS, since * sometimes LIST etc. will be defined to be empty. Thus we must * never put a semicolon after RESOURCE_INFO where it's called since * such isolated semicolons can break certain compilers. This can * mess with indentation a bit, but we just have to deal with it. */ #define RESOURCE_INFO \ LCASE(Silent) LIST(Linker) LIST(IJAccent) LIST(Italic)\ LIST(ItalCmd) LIST(PostLink) LIST(WipeArg) LIST(VerbEnvir)\ LIST(MathEnvir) LIST(MathCmd) LIST(TextCmd) LIST(MathRoman)\ LIST(HyphDash) LIST(NumDash) LIST(WordDash) LIST(DashExcpt)\ LIST(CenterDots) LIST(LowDots) LIST(OutFormat)\ LIST(Primitives) LIST(NotPreSpaced) LIST(NonItalic) LIST(NoCharNext)\ LNEMPTY(CmdLine) LNEMPTY(TeXInputs)\ LCASE(Abbrev) LCASE(UserWarn) LIST(UserWarnRegex) LIST(TextEnvir)\ KEY(VerbClear, "|") KEY(QuoteStyle, "Traditional") KEY(TabSize, "8")\ KEY(CmdSpaceStyle, "Ignore") #define LIST(a) extern struct WordList a; #define LNEMPTY LIST #define LCASE(a) LIST(a) LIST(a ## Case) #define KEY(a,def) extern const char *a; RESOURCE_INFO #undef KEY #undef LCASE #undef LNEMPTY #undef LIST int ReadRC(const char *); int ReadRCFromCmdLine(const char *CmdLineArg); #endif /* RESOURCE */ chktex-1.7.9/ChkTeX.c000644 000767 000024 00000074440 14613043276 015141 0ustar00iandrusstaff000000 000000 /* * ChkTeX, finds typographic errors in (La)TeX files. * Copyright (C) 1995-96 Jens T. Berger Thielemann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * Contact the author at: * Jens Berger * Spektrumvn. 4 * N-0666 Oslo * Norway * E-mail: * * */ #include "ChkTeX.h" #ifdef KPATHSEA #include #else #include #endif #include "OpSys.h" #include "Utility.h" #include "FindErrs.h" #include "Resource.h" #include #undef MSG #define MSG(num, type, inuse, ctxt, text) {(enum ErrNum)num, type, inuse, ctxt, text}, struct ErrMsg PrgMsgs[pmMaxFault + 1] = { PRGMSGS {(enum ErrNum)pmMaxFault, etErr, TRUE, 0, INTERNFAULT} }; struct Stack CharStack = {0L}; struct Stack InputStack = {0L}; struct Stack EnvStack = {0L}; struct Stack ConTeXtStack = {0L}; struct Stack FileSuppStack = {0L}; struct Stack UserFileSuppStack = {0L}; struct Stack MathModeStack = {0L}; /************************************************************************/ const char BrOrder[NUMBRACKETS + 1] = "()[]{}"; unsigned long Brackets[NUMBRACKETS]; /************************************************************************/ /* * Have to do things this way, to ease some checking throughout the * program. */ NEWBUF(TmpBuffer, BUFFER_SIZE); NEWBUF(ReadBuffer, BUFFER_SIZE); static const char *Banner = "ChkTeX v" PACKAGE_VERSION " - Copyright 1995-96 Jens T. Berger Thielemann.\n" #ifdef __OS2__ "OS/2 port generated with emx compiler, by Wolfgang Fritsch, \n" #elif defined(__MSDOS__) "MS-DOS port by Bj\\o rn Ove Thue, \n" #endif #if HAVE_PCRE "Compiled with PCRE regex support." #else #if HAVE_POSIX_ERE "Compiled with POSIX extended regex support." #else "Compiled with no regex support." #endif #endif "\n"; static const char *BigBanner = "ChkTeX comes with ABSOLUTELY NO WARRANTY; details on this and\n" "distribution conditions in the GNU General Public License file.\n" "Type \"ChkTeX -h\" for help, \"ChkTeX -i\" for distribution info.\n" "Author: Jens Berger.\n" "Bug reports: https://savannah.nongnu.org/bugs/?group=chktex\n" " or darthandrus@gmail.com\n" "Press " STDIN_BREAK " to terminate stdin input.\n"; static const char *Distrib = "\n" "This program is free software; you can redistribute it and/or modify\n" "it under the terms of the GNU General Public License as published by\n" "the Free Software Foundation; either version 2 of the License, or\n" "(at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU General Public License for more details.\n" "\n" "You should have received a copy of the GNU General Public License\n" "along with this program; if not, write to the Free Software\n" "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n"; static const char *OnText = "On"; static const char *OffText = "Off"; static const char *HowHelp = "-h or --help gives usage information. See also ChkTeX.{ps,dvi}.\n"; static const char *HelpText = "\n" "\n" " Usage of ChkTeX v" PACKAGE_VERSION "\n" " ~~~~~~~~~~~~~~~~~~~~~~\n" "\n" " Template\n" " ~~~~~~~~\n" "chktex [-hiqrW] [-v[0-...]] [-l ] [-[wemn] <[1-42]|all>]\n" " [-d[0-...]] [-p ] [-o ] [-[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. A bit field with 5 bits.\n" " Each bit shows a different type of information.\n" " -r --reset : Reset settings to default.\n" " -S --set : Read it's argument as if from chktexrc.\n" " e.g., -S TabSize=8 will override the TabSize.\n" "\n" "Muting warning messages:\n" "~~~~~~~~~~~~~~~~~~~~~~~~\n" " -w --warnon : Makes msg # given a warning and turns it on.\n" " -e --erroron : Makes msg # given an error and turns it on.\n" " -m --msgon : Makes msg # given a message and turns it on.\n" " -n --nowarn : Mutes msg # given.\n" " -L --nolinesupp: Disables per-line and per-file suppressions.\n" "\n" "Output control flags:\n" "~~~~~~~~~~~~~~~~~~~~~\n" " -v --verbosity : How errors are displayed.\n" " Default 1, 0=Less, 2=Fancy, 3=lacheck.\n" " -V --pipeverb : How errors are displayed when stdout != tty.\n" " Defaults to the same as -v.\n" " -s --splitchar : String used to split fields when doing -v0\n" " -o --output : Redirect error report to a file.\n" " -q --quiet : Shuts up about version information.\n" " -p --pseudoname: Input file-name when reporting.\n" " -f --format : Format to use for output\n" "\n" "Boolean switches (1 -> enables / 0 -> disables):\n" "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" " -b --backup : Backup output file.\n" " -x --wipeverb : Ignore contents of `\\verb' commands.\n" " -g --globalrc : Read global .chktexrc file.\n" " -I --inputfiles: Execute \\input statements.\n" " -H --headererr : Show errors found before \\begin{document}\n" "\n" "Miscellaneous switches:\n" "~~~~~~~~~~~~~~~~~~~~~~~\n" " -W --version : Version information\n" "\n" "----------------------------------------------------------------------\n" "If no LaTeX files are specified on the command line, we will read from\n" "stdin. For explanation of warning/error messages, please consult the\n" "main documentation ChkTeX.dvi, ChkTeX.ps or ChkTeX.pdf:\n" " http://www.nongnu.org/chktex/ChkTeX.pdf\n" "\n" "Any of the above arguments can be made permanent by setting them in the\n" "chktexrc file " #if defined(__unix__) "(~/.chktexrc).\n" #else "(see documentation for location).\n" #endif ; /* * Options we will set. * */ enum Quote Quote; enum CmdSpace CmdSpace; char VerbNormal[] = "%k %n in %f line %l: %m\n" "%r%s%t\n" "%u\n"; #define DEF(type, name, value) type name = value OPTION_DEFAULTS; STATE_VARS; #undef DEF FILE *OutputFile = NULL; char *PrgName; int StdInTTY, StdOutTTY; /* * End of config params. */ static int ParseArgs(int argc, char **argv); static void ShowIntStatus(void); static int OpenOut(void); static int ShiftArg(char **Argument); /* * Duplicates all arguments, and appends an asterix to each of them. */ static void AddStars(struct WordList *wl) { unsigned long Count, CmdLen; char *Data; FORWL(Count, *wl) { Data = wl->Stack.Data[Count]; CmdLen = strlen(Data); if (Data[CmdLen - 1] != '*') { strcpy(TmpBuffer, Data); strcat(TmpBuffer, "*"); InsertWord(TmpBuffer, wl); } } } /* * Sets up all the lists. * */ static void SetupLists(void) { unsigned long i; AddStars(&VerbEnvir); AddStars(&MathEnvir); MakeLower(&UserWarnCase); ListRep(&WipeArg, ':', 0); ListRep(&NoCharNext, ':', 0); #define ThisItem ((char *) AbbrevCase.Stack.Data[i]) FORWL(i, AbbrevCase) { if (isalpha((unsigned char)ThisItem[0])) { ThisItem[0] = toupper((unsigned char)ThisItem[0]); InsertWord(ThisItem, &Abbrev); ThisItem[0] = tolower((unsigned char)ThisItem[0]); } InsertWord(ThisItem, &Abbrev); } } #define NOCOMMON(a,b) NoCommon(&a,#a,&b,#b) /* * Checks that two lists don't have any common element. */ static void NoCommon(struct WordList *a, const char *aName, struct WordList *b, const char *bName) { unsigned long i; FORWL(i, *a) { if (HasWord((char *) a->Stack.Data[i], b)) PrintPrgErr(pmNoCommon, a->Stack.Data[i], aName, bName); } } /* * Expands the tabs in a string to regular intervals sized * TSize. */ static void ExpandTabs(char *From, char *To, long TSize, long MaxDiff) { char *Next; char *Orig; unsigned long Diff; static short HasExpandedTooLong = 0; Next = From; Orig = To; while ((Next = strchr(From, '\t'))) { if ((Diff = Next - From)) { strncpy(To, From, Diff); To += Diff; Diff = TSize - ((To - Orig) % TSize); } else Diff = TSize; /* Make sure we don't expand this buffer out of the memory we * have allocated for it. */ if ( Diff > MaxDiff+1 ) { Diff = MaxDiff+1; if ( !HasExpandedTooLong ) { PrintPrgErr(pmTabExpands, BUFFER_SIZE); } HasExpandedTooLong = 1; } MaxDiff -= (Diff-1); memset(To, ' ', Diff); To += Diff; From = ++Next; } strcpy(To, From); } void ReadRcFiles(void) { unsigned long i; while (SetupVars()) { InsertWord(ConfigFile, &ConfigFiles); } FORWL(i, ConfigFiles) { ReadRC(ConfigFiles.Stack.Data[i]); } } int main(int argc, char **argv) { int retval = EXIT_FAILURE, ret, CurArg; unsigned long Count; int StdInUse = FALSE; long Tab = 8; #ifdef __LOCALIZED InitStrings(); #endif OutputFile = stdout; #ifdef KPATHSEA kpse_set_program_name(argv[0], "chktex"); PrgName = kpse_program_name; #ifdef WIN32 setmode(fileno(stdout), _O_BINARY); #endif #else PrgName = argv[0]; #endif #undef KEY #undef LCASE #undef LIST #undef LNEMPTY #define KEY(a, def) #define LCASE(a) #define LIST(a) #define LNEMPTY(a) InsertWord("", &a); RESOURCE_INFO ReadRcFiles(); if (CmdLine.Stack.Used) { ParseArgs(CmdLine.Stack.Used, (char **) CmdLine.Stack.Data); CmdLine.Stack.Used = 1L; } if ((CurArg = ParseArgs((unsigned long) argc, argv))) { retval = EXIT_SUCCESS; if (CmdLine.Stack.Used) { ParseArgs(CmdLine.Stack.Used, (char **) CmdLine.Stack.Data); CmdLine.Stack.Used = 1L; } if (!Quiet || LicenseOnly) fprintf(stderr, "%s", Banner); if (CurArg == argc) UsingStdIn = TRUE; #if defined(HAVE_FILENO) && defined(HAVE_ISATTY) StdInTTY = isatty(fileno(stdin)); StdOutTTY = isatty(fileno(stdout)); #else StdInTTY = StdOutTTY = TRUE; #endif SetupTerm(); if ((UsingStdIn && StdInTTY && !Quiet) || LicenseOnly) { fprintf(stderr, "%s", BigBanner); } if (!StdOutTTY && PipeOutputFormat) OutputFormat = PipeOutputFormat; if (LicenseOnly) { fprintf(stderr, "%s", Distrib); } else { SetupLists(); if (QuoteStyle) { if (!strcasecmp(QuoteStyle, "LOGICAL")) Quote = quLogic; else if (!strcasecmp(QuoteStyle, "TRADITIONAL")) Quote = quTrad; else { PrintPrgErr(pmQuoteStyle, QuoteStyle); Quote = quTrad; } } if (CmdSpaceStyle) { if (!strcasecmp(CmdSpaceStyle, "IGNORE")) CmdSpace = csIgnore; else if (!strcasecmp(CmdSpaceStyle, "INTERWORD")) CmdSpace = csInterWord; else if (!strcasecmp(CmdSpaceStyle, "INTERSENTENCE")) CmdSpace = csInterSentence; else if (!strcasecmp(CmdSpaceStyle, "BOTH")) CmdSpace = csBoth; else { PrintPrgErr(pmCmdSpaceStyle, CmdSpaceStyle); CmdSpace = csIgnore; } } if (DebugLevel) ShowIntStatus(); NOCOMMON(Italic, NonItalic); NOCOMMON(Italic, ItalCmd); NOCOMMON(LowDots, CenterDots); if (TabSize && isdigit((unsigned char)*TabSize)) Tab = strtol(TabSize, NULL, 10); if (OpenOut()) { for (;;) { for (Count = 0; Count < NUMBRACKETS; Count++) Brackets[Count] = 0L; #define DEF(type, name, value) name = value STATE_VARS; #undef DEF if (UsingStdIn) { if (StdInUse) break; else { StdInUse = TRUE; PushFile("stdin", stdin, &InputStack); } } else { if (CurArg <= argc) { const char *filename = NULL; if (CurArg < argc) filename = argv[CurArg++]; AddDirectoryFromRelativeFile(filename,&TeXInputs); if (!PushFileName(filename, &InputStack)) break; } } if (StkTop(&InputStack) && OutputFile) { while (!ferror(OutputFile) && StkTop(&InputStack) && !ferror(CurStkFile(&InputStack)) && FGetsStk(ReadBuffer, BUFFER_SIZE - 1, &InputStack)) { /* Make all spaces ordinary spaces */ strrep(ReadBuffer, '\n', ' '); strrep(ReadBuffer, '\r', ' '); ExpandTabs(ReadBuffer, TmpBuffer, Tab, BUFFER_SIZE - 1 - strlen(ReadBuffer)); strcpy(ReadBuffer, TmpBuffer); strcat(ReadBuffer, " "); ret = FindErr(ReadBuffer, CurStkLine(&InputStack)); if ( ret != EXIT_SUCCESS ) { retval = ret; } } PrintStatus(CurStkLine(&InputStack)); } } } } } return retval; } /* * Opens the output file handle & possibly renames */ static int OpenOut(void) { int Success = TRUE; if (*OutputName) { if (BackupOut && fexists(OutputName)) { strcpy(TmpBuffer, OutputName); AddAppendix(TmpBuffer, BAKAPPENDIX); if (fexists(TmpBuffer)) remove(TmpBuffer); if (!rename(OutputName, TmpBuffer)) PrintPrgErr(pmRename, OutputName, TmpBuffer); else { PrintPrgErr(pmRenameErr, OutputName, TmpBuffer); Success = FALSE; } } if (Success) { #ifdef KPATHSEA if (!(OutputFile = fopen(OutputName, "wb"))) #else if (!(OutputFile = fopen(OutputName, "w"))) #endif { PrintPrgErr(pmOutOpen); Success = FALSE; } } } else OutputFile = stdout; return (Success); } #ifndef STRIP_DEBUG static void ShowWL(const char *Name, const struct WordList *wl) { unsigned long i, j, percent; fprintf(stderr, "Name: %12s", Name); if (DebugLevel & FLG_DbgListInfo) { fprintf(stderr, ", MaxLen: %3ld, Entries: %3ld, ", wl->MaxLen, wl->Stack.Used); if (wl->Hash.Index && wl->Stack.Used) { for (i = j = 0; i < HASH_SIZE; i++) { if (wl->Hash.Index[i]) j++; } percent = (j * 10000) / wl->Stack.Used; fprintf(stderr, "Hash usage: %3ld.%02ld%%", percent / 100, percent % 100); } else fprintf(stderr, "No hash table."); } fputc('\n', stderr); if (DebugLevel & FLG_DbgListCont) { FORWL(i, *wl) fprintf(stderr, "\t%s\n", (char *) wl->Stack.Data[i]); } } #endif #define BOOLDISP(var) ((var)? OnText : OffText) #define SHOWSTAT(text, arg) fprintf(stderr, "\t" text ": %s\n", arg) #define BOOLSTAT(name, var) SHOWSTAT(name, BOOLDISP(var)) #define SHOWSTR(text, arg) fprintf(stderr, "%s:\n\t%s\n", text, arg); /* * Prints some of the internal flags; mainly for debugging purposes */ static void ShowIntStatus(void) { #ifndef STRIP_DEBUG unsigned long Cnt; const char *String; const char *iuStr = ""; if (DebugLevel & FLG_DbgMsgs) { fprintf(stderr, "There are %d warnings/error messages available:\n", emMaxFault - emMinFault - 1); for (Cnt = emMinFault + 1; Cnt < emMaxFault; Cnt++) { switch (LaTeXMsgs[Cnt].Type) { case etWarn: String = "Warning"; break; case etErr: String = "Error"; break; case etMsg: String = "Message"; break; default: String = ""; break; } switch (LaTeXMsgs[Cnt].InUse) { case iuOK: iuStr = "In use"; break; case iuNotUser: iuStr = "User muted"; break; case iuNotSys: iuStr = "System muted"; break; } fprintf(stderr, "Number: %2ld, Type: %s, Status: %s\n" "\tText: %s\n\n", Cnt, String, iuStr, LaTeXMsgs[Cnt].Message); } } #undef KEY #undef LCASE #undef LNEMPTY #undef LIST #define LNEMPTY LIST #define LIST(a) ShowWL(#a, &a); #define LCASE(a) LIST(a); LIST(a ## Case); #define KEY(a,def) SHOWSTR(#a, a); if (DebugLevel & (FLG_DbgListInfo | FLG_DbgListCont)) { ShowWL("ConfigFilesRead", &ConfigFiles); RESOURCE_INFO } if (DebugLevel & FLG_DbgOtherInfo) { SHOWSTR("Outputformat", OutputFormat); fprintf(stderr, "Current flags include:\n"); BOOLSTAT("Read global resource", GlobalRC); BOOLSTAT("Wipe verbose commands", WipeVerb); BOOLSTAT("Backup outfile", BackupOut); BOOLSTAT("Quiet mode", Quiet); BOOLSTAT("Show license", LicenseOnly); BOOLSTAT("Use stdin", UsingStdIn); BOOLSTAT("\\input files", InputFiles); BOOLSTAT("Output header errors", HeadErrOut); BOOLSTAT("No line suppressions", NoLineSupp); } #endif } /* * Resets all stacks. * */ #undef KEY #undef LCASE #undef LNEMPTY #undef LIST #define LNEMPTY LIST #define LIST(a) ClearWord(&a); #define LCASE(a) LIST(a); LIST(a ## Case); #define KEY(a,def) a = def; static void ResetStacks(void) { RESOURCE_INFO } /* * Resets all flags (not wordlists) to their default values. Sets * Outputfile to stdout. * */ static void ResetSettings(void) { #define DEF(type, name, value) name = value OPTION_DEFAULTS; #undef DEF if (OutputFile != stdout) { fclose(OutputFile); OutputFile = stdout; } } /* * Reads a numerical argument from the argument. Supports concatenation * of arguments (main purpose) */ static int ParseNumArg(long *Dest, /* Where to put the value */ long Default, /* Value to put in if no in argue */ char **Argument) /* optarg or similar */ { if (Argument && *Argument && isdigit((unsigned char)**Argument)) *Dest = strtol(*Argument, Argument, 10); else *Dest = Default; return (ShiftArg(Argument)); } /* * Same as above; however, will toggle the boolean if user doesn't * supply value */ static int ParseBoolArg(int *Dest, /* Boolean value */ char **Argument) /* optarg or similar */ { long D = *Dest ? 1L : 0L; int Retval; Retval = ParseNumArg(&D, *Dest ? 0L : 1L, Argument); *Dest = D ? TRUE : FALSE; return (Retval); } /* * Returns the first character in the string passed, updates the * string pointer, if the string is non-empty. * * 0 if the string is empty. */ static int ShiftArg(char **Argument) /* optarg or similar */ { if (Argument && *Argument && **Argument) return (*((char *) (*Argument)++)); else return 0; } /* * Parses an argv similar array. */ static int ParseArgs(int argc, char **argv) { /* Needed for option parsing. */ static const struct option long_options[] = { {"help", no_argument, 0L, 'h'}, {"localrc", required_argument, 0L, 'l'}, {"output", required_argument, 0L, 'o'}, {"warnon", required_argument, 0L, 'w'}, {"erroron", required_argument, 0L, 'e'}, {"msgon", required_argument, 0L, 'm'}, {"nowarn", required_argument, 0L, 'n'}, {"nolinesupp", no_argument, 0L, 'L'}, {"verbosity", optional_argument, 0L, 'v'}, {"pipeverb", optional_argument, 0L, 'V'}, {"debug", required_argument, 0L, 'd'}, {"reset", no_argument, 0L, 'r'}, {"set", required_argument, 0L, 'S'}, {"quiet", no_argument, 0L, 'q'}, {"license", no_argument, 0L, 'i'}, {"splitchar", required_argument, 0L, 's'}, {"format", required_argument, 0L, 'f'}, {"pseudoname", required_argument, 0L, 'p'}, {"inputfiles", optional_argument, 0L, 'I'}, {"backup", optional_argument, 0L, 'b'}, {"globalrc", optional_argument, 0L, 'g'}, {"wipeverb", optional_argument, 0L, 'x'}, {"tictoc", optional_argument, 0L, 't'}, {"headererr", optional_argument, 0L, 'H'}, {"version", no_argument, 0L, 'W'}, {0L, 0L, 0L, 0L} }; int option_index = 0L, c, i, nextc, ErrType; int Retval = FALSE, InUse; int Success, Foo; long Err, Verb = 1, PipeVerb = 1; enum { aeNoErr = 0, aeArg, /* missing/bad required argument */ aeOpt, /* unknown option returned */ aeHelp, /* just a call for help */ aeMem /* no memory */ } ArgErr = aeNoErr; optind = 0; while (!ArgErr && ((c = getopt_long((int) argc, argv, "b::d:e:f:g::hH::I::il:m:n:Lo:p:qrs:S:t::v::V::w:Wx::", long_options, &option_index)) != EOF)) { while (c) { nextc = 0; switch (c) { case 'S': ReadRCFromCmdLine(optarg); break; case 's': if (!(Delimit = strdup(optarg))) { PrintPrgErr(pmStrDupErr); ArgErr = aeMem; } break; case 'p': if (!(PseudoInName = strdup(optarg))) { PrintPrgErr(pmStrDupErr); ArgErr = aeMem; } break; case 'd': #ifdef STRIP_DEBUG PrintPrgErr(pmNoDebugFlag); #else nextc = ParseNumArg(&DebugLevel, 0xffff, &optarg); #endif break; case 'i': LicenseOnly = TRUE; nextc = ShiftArg(&optarg); break; case 'L': NoLineSupp = TRUE; nextc = ShiftArg(&optarg); break; case 'q': Quiet = TRUE; nextc = ShiftArg(&optarg); break; LOOP(warntype, case 'w': ErrType = etWarn; InUse = iuOK; LAST(warntype); case 'e': ErrType = etErr; InUse = iuOK; LAST(warntype); case 'm': ErrType = etMsg; InUse = iuOK; LAST(warntype); case 'n': ErrType = etMsg; InUse = iuNotUser; LAST(warntype); ) if (isdigit((unsigned char)*optarg)) { nextc = ParseNumArg(&Err, -1, &optarg); if (betw(emMinFault, Err, emMaxFault)) { LaTeXMsgs[Err].Type = ErrType; LaTeXMsgs[Err].InUse = InUse; } else { ArgErr = aeOpt; PrintPrgErr(pmWarnNumErr); } } else if (!strcasecmp(optarg, "all")) { for (i = emMinFault + 1; i < emMaxFault; i++) { LaTeXMsgs[i].Type = ErrType; LaTeXMsgs[i].InUse = InUse; } } else { ArgErr = aeOpt; PrintPrgErr(pmWarnNumErr); } break; case 'g': nextc = ParseBoolArg(&GlobalRC, &optarg); if (!GlobalRC) { ResetStacks(); } break; case 'r': ResetSettings(); nextc = ShiftArg(&optarg); break; case 'l': if (optarg) ReadRC(optarg); break; case 'f': if (!(OutputFormat = strdup(optarg))) { PrintPrgErr(pmStrDupErr); ArgErr = aeMem; } break; case 'v': nextc = ParseNumArg(&Verb, 2, &optarg); if (Verb < (long) OutFormat.Stack.Used) OutputFormat = strdup(OutFormat.Stack.Data[Verb]); else { PrintPrgErr(pmVerbLevErr); ArgErr = aeArg; } break; case 'V': nextc = ParseNumArg(&PipeVerb, 1, &optarg); if (PipeVerb < (long) OutFormat.Stack.Used) PipeOutputFormat = strdup(OutFormat.Stack.Data[PipeVerb]); else { PrintPrgErr(pmVerbLevErr); ArgErr = aeArg; } break; case 'o': if (optarg) { if (*OutputName) { PrintPrgErr(pmOutTwice); ArgErr = aeOpt; } else { if (!(OutputName = strdup(optarg))) { PrintPrgErr(pmStrDupErr); ArgErr = aeMem; } } } break; case 't': nextc = ParseBoolArg(&Foo, &optarg); break; case 'x': nextc = ParseBoolArg(&WipeVerb, &optarg); break; case 'b': nextc = ParseBoolArg(&BackupOut, &optarg); break; case 'I': nextc = ParseBoolArg(&InputFiles, &optarg); break; case 'H': nextc = ParseBoolArg(&HeadErrOut, &optarg); break; case 'W': printf("%s", Banner); exit(EXIT_SUCCESS); case '?': default: fputs(Banner, stderr); fputs(HowHelp, stderr); exit(EXIT_FAILURE); break; case 'h': ArgErr = aeHelp; break; } c = nextc; } } if ((argc > optind) && !strcmp(argv[optind], "?")) ArgErr = aeHelp; if (ArgErr) { fputs(Banner, stderr); fputs(BigBanner, stderr); fputs(HelpText, stderr); Success = FALSE; } else Success = TRUE; if (Success) Retval = optind; return (Retval); } /* * Outputs a program error. */ void PrintPrgErr(enum PrgErrNum Error, ...) { const char *Type; va_list MsgArgs; if (betw(pmMinFault, Error, pmMaxFault)) { switch (PrgMsgs[Error].Type) { case etWarn: Type = "WARNING"; break; case etMsg: Type = "NOTE"; break; default: case etErr: Type = "ERROR"; break; } fprintf(stderr, "%s: %s -- ", PrgName, Type); va_start(MsgArgs, Error); vfprintf(stderr, PrgMsgs[Error].Message, MsgArgs); va_end(MsgArgs); fputc('\n', stderr); if (PrgMsgs[Error].Type == etErr) exit(EXIT_FAILURE); } } void ErrPrintf(const char *fmt, ...) { va_list MsgArgs; va_start(MsgArgs, fmt); vfprintf(stderr, fmt, MsgArgs); va_end(MsgArgs); } chktex-1.7.9/chktexrc.in000644 000767 000024 00000075243 14613043276 016014 0ustar00iandrusstaff000000 000000 #### -*- conf -*- #### ##### TODO: Do I want a TOC? Index?... ##### TODO: Use something besides errexam? ##### TODO: Color/frame for default value ############################################################################### #### This file is input to a simple "tangle" process. The extensions of .in is #### a little misleading in that it's not managed by autotools or m4. Sorry. #### #### Two different files are created from this file by calling MakeChkTeXRC.pl #### 1. chktexrc, a self-documenting chktexrc example #### a. Lines with 3 (or more) leading #'s are discarded #### b. Other lines are kept as is #### 2. ChkTeXRC.tex, LaTeX documentation for chktexrc. #### a. Lines with 4 (or more) leading #'s are discarded #### b. Lines with 0 or 2 (exactly) leading #'s are discarded #### c. Lines with 1 or 3 (exactly) leading #'s are turned in (LaTeX-only) lines #### #### In other words #### 1. Lines with 1 or 3 leading #'s are included in the LaTeX #### documentation with the #'s stripped off #### 2. Lines with 0, 1 or 2 are included as is in the example #### chktexrc file #### # ############################################################################### ## Example resource file for ChkTeX. ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ## ## For more information visit https://www.nongnu.org/chktex/ ## ### \subsubsection{The \rsrc\ file format} ## chktexrc file format # # The chktexrc file is essentially a bunch of variable assignments. # There are two types of variables, those that take single items and # those that take lists. # # In turn, there are two types of lists, case-sensitive and case-insensitive. # Case-sensitive lists are delimited by @verb@{@endverb@ and @verb@}@endverb@ # while case-insensitive are delimited by @verb@[@endverb@ and @verb@]@endverb@. # Only some variables support case insensitive lists, since in many # cases it doesn't make sense and would be unnecessarily slow. Those # variables that @emph@do@endemph@ support case-insensitive lists will be marked as # such throughout the file. # # Variables can be set with or without an equals sign. If included, the # @verb@=@endverb@ causes the variable to be overwritten. This is the only thing # that makes sense for variables taking a single item and so we always # include it in that case. For list variables, omitting the equals # sign will cause the items in the list to be appended instead of # overwriting the entire list. # # Below are all the ways in which a variable can be set. Note that lists # can span lines, though this is not shown here for brevity. # # ### \begin{verbatim} # VariableName = item # # Overwrites # VariableName = { Item1 Item2 ... } # VariableName = [ item1 item2 ... ] # VariableName = { Item1 Item2 ... } [ item item ... ] # VariableName = [ item1 item2 ... ] { Item Item ... } # # Appends # VariableName { Item3 Item4 ... } # VariableName [ item3 item4 ... ] # VariableName { Item3 Item4 ... } [ item item ... ] # VariableName [ item3 item4 ... ] { Item Item ... } ### \end{verbatim} # # # Comments begin with @verb@#@endverb@, and continue for the end of the line. # Blank lines plus leading and trailing spaces are ignored. # Items are separated by spaces. # Newlines are considered spaces, but can't be escaped. # You can use double quotes @verb@"@endverb@ to surround an item with spaces, or you can # escape spaces as described later. # # Detection of tokens like @verb@}@endverb@ are somewhat context sensitive---they # have to be preceded by a space (or newline). This allows them to be # part of an item without escaping. Since some variables require such # characters, this generally makes life easier. # # To include characters that might otherwise interfere, escape # sequences are provided. They are similar to those in C, but use # @verb@!@endverb@ instead of @verb@\@endverb@ for obvious reasons. # The entire list is below. # ### \vspace{0.5\baselineskip} ### \begin{tabular}{p{0.2\textwidth}p{0.7\textwidth}} # @bf Sequence @&@ @bf Resulting character @\\@ # @verb@! @endverb@ @&@ Space @\\@ # @verb@!"@endverb@ @&@ @verb@"@endverb@ @\\@ # @verb@!#@endverb@ @&@ @verb@#@endverb@ @\\@ # @verb@!!@endverb@ @&@ @verb@!@endverb@ @\\@ # @verb@!{@endverb@ @&@ @verb@{@endverb@ @\\@ # @verb@!}@endverb@ @&@ @verb@}@endverb@ @\\@ # @verb@![@endverb@ @&@ @verb@[@endverb@ @\\@ # @verb@!]@endverb@ @&@ @verb@]@endverb@ @\\@ # @verb@!=@endverb@ @&@ @verb@=@endverb@ @\\@ # @verb@!b@endverb@ @&@ Backspace @\\@ # @verb@!n@endverb@ @&@ New line @\\@ # @verb@!r@endverb@ @&@ Carriage return @\\@ # @verb@!t@endverb@ @&@ Tab @\\@ # @verb@!f@endverb@ @&@ Form feed @\\@ # @verb@!xNN@endverb@ @&@ NN must be a hexadecimal number (00 - ff), # both characters must be included. @\\@ # @verb@!dNNN@endverb@ @&@ NNN must be a decimal number (000 - 255), all # three characters must be included. # Unspecified results if NNN > 377. @\\@ # @verb@!NNN@endverb@ @&@ NNN must be a octal number (000 - 377), all # three characters must be included. # Unspecified results if NNN > 377. ### \end{tabular} ### \subsubsection{Settings in the \rsrc\ file} ## Available Settings # # All available settings follow. # ## QuoteStyle ### \medskip ### \begin{chktexrcsimplevar}{QuoteStyle} # # The type of quote-style you are using. There are currently two # styles: # # Traditional: ### \begin{errexam} # "An example," he said, "would be great." ### \end{errexam} # # Logical: ### \begin{errexam} # "An example", he said, "would be great". ### \end{errexam} # ### \chktexrcdefault\begin{verbatim} QuoteStyle = Logical ### \end{verbatim} ### \end{chktexrcsimplevar} ## TabSize ### \begin{chktexrcsimplevar}{TabSize} # # The width of a tab. This is used for formatting the error message. # Only positive integers are allowed. # ### \chktexrcdefault\begin{verbatim} TabSize = 8 ### \end{verbatim} ### \end{chktexrcsimplevar} ## CmdSpaceStyle ### \medskip ### \begin{chktexrcsimplevar}{CmdSpaceStyle} # # How to treat a command is followed by punctuation. In all cases the # warnings are also governed by the main warning settings, namely # warnings 12 and 13 about interword and intersentence spacings. ### These can be found on page~\pageref{warn:interword}. # # If set to Ignore, then it won't print any warnings when punctuation # follows a command. # # # If CmdSpaceStyle is set to InterWord, then it will print warnings # when interword spacing should (potentially) be used. For example, # without a command the following will trigger warning 12 # ### \begin{errexam} # @verb@I've seen a UFOs, etc. in my life.@endverb@ ### \end{errexam} # # And if set to InterWord, so will # ### \begin{errexam} # @verb@I've seen a UFOs, \etc. in my life.@endverb@ ### \end{errexam} # # # If set to InterSentence, then it will print warnings when # intersentence spacing should (potentially) be used. For example, # without a command the following will trigger warning 13 # ### \begin{errexam} # @verb@I've seen an UFO! Right over there!@endverb@ ### \end{errexam} # # And if set to InterSentence, so will # ### \begin{errexam} # @verb@I've seen an \UFO! Right over there!@endverb@ ### \end{errexam} # # # Setting CmdSpaceStyle to Both will cause warnings to be printed in # both cases. # ### \chktexrcdefault\begin{verbatim} CmdSpaceStyle = Ignore ### \end{verbatim} ### \end{chktexrcsimplevar} ## CmdLine ### \begin{chktexrclistvar}{CmdLine} # # Default command-line options. For instance, you might like to put # @verb@-v2@endverb@ here. # ### \chktexrcdefault\begin{verbatim} CmdLine { } ### \end{verbatim} ### \end{chktexrclistvar} ## UserWarn ### \begin{chktexrclistvar*}{UserWarn} # # Arbitrary strings to warn about. You can put here to help you find # your own little foibles. See also@ref@UserWarnRegex@endref@. # # These patterns will be searched for throughout the text; regardless # of whether they appear as normal text, commands, in math mode, etc. # They are @emph@not@endemph@ found in comments. # # Suppose you define a special command like this: ### \begin{verbatim} # \def\unknown{\large\bf??} ### \end{verbatim} # which you use whenever you don't have some information at the time # of writing. Thus, it makes sense to warn on it, and this is a # convenient way to do so. # ### \chktexrcdefault\begin{verbatim} UserWarn { \unknown # One should write \chktex or Chk\TeX - never ChkTeX. ChkTeX } [ # You may put case-insensitive patterns here. ] ### \end{verbatim} ### \end{chktexrclistvar*} ## UserWarnRegex ### \begin{chktexrclistvar}{UserWarnRegex} # # A more sophisticated version of@ref@UserWarn@endref@ using regular # expressions. Use of these will be automatically disabled if @ChkTeX@ # was built without regular expression support. Because @ChkTeX@ can be # with support for either POSIX or PCRE flavors of regular expression, # some of the following will not apply in all cases. An expression # can be defined only when PCRE is enabled by prepending the # expression with @verb@PCRE:@endverb@ and similarly with @verb@POSIX:@endverb@. # # These patterns will be searched for, no matter whether they appear # as normal text, commands, or arguments. However, they will @emph@not@endemph@ # match in verbatim environments (see@ref@VerbEnvir@endref@). # # Remember that you have to escape (with a @verb@!@endverb@) the characters # @verb@"#!=@endverb@, as well as spaces and @verb@{}[]@endverb@ if they are # proceeded by a space. # # When using PCRE regular expressions, you can use @verb@(?i)@endverb@ to make # the expression case insensitive. See the man pages (man pcresyntax) # or the nicely formatted http://perldoc.perl.org/perlre.html for # documentation on the regular expression syntax. Note, however, that # some the features of perl regular expression are not available such # as running code (callouts), and replacing. # # An initial PCRE-style comment @verb@(?# ... )@endverb@ can be used # to change what is displayed, thereby reminding yourself how to fix # the problem. This works even for POSIX expressions. # ### \chktexrcdefault\begin{verbatim} UserWarnRegex { (?!#Always! use! \nmid)\\not! *(\||\\mid) # Capitalize section when saying Section 6. (?!#-1:Capitalize! before! references)PCRE:\b(chapter|(sub)?section|theorem|lemma|proposition|corollary|appendix)~\\ref (?!#1:Capitalize! before! references)POSIX:([^[:alnum:]]|^)(chapter|(sub)?section|theorem|lemma|proposition|corollary|appendix)~\\ref # Spell it introduction # PCRE:(?i)\bintro\b(?!#Spell! it! out.! This! comment! is! not! used.) # POSIX:([^[:alnum:]]|^)intro([^[:alnum:]]|$) # Pretty tables--see http://texdoc.net/texmf-dist/doc/latex/booktabs/booktabs.pdf (?!#-2:Use! \toprule,! \midrule,! or! \bottomrule! from! booktabs)\\hline # This relies on it being on a single line, and not having anything # else on that line. With PCRE we could match balanced [] and {}, # but I wonder if it's worth the complexity... (?!#-2:Vertical! rules! in! tables! are! ugly)\\begin\{(array|tabularx?\*?)\}(\[.*\])?\{.*\|.*\} (?!#-3:Optional! arguments! []! inside! optional! arguments! []! must! be! enclosed! in! {})PCRE:\[(?!![^\]\[{}]*{(?!![^\]\[{}]*}))[^\]]*\[ } ### \end{verbatim} ### \end{chktexrclistvar} ## TeXInputs ### \begin{chktexrclistvar}{TeXInputs} # # A list of paths where @ChkTeX@ should look for files it @verb@\input@endverb@s. # By default, the current directory is searched (not recursively, use # @verb@//@endverb@ for that, see below). # # A @verb@//@endverb@ postfix is supported: # if you append a double path-separator we'll recursively search that # directory's directories. MS-DOS users must append @verb@\\@endverb@ # instead, e.g. @verb@C:\EMTEX\\@endverb@. In order to search an # entire directory tree, you must use @emph@three@endemph@ slashes, # e.g. @verb@c:\\\@endverb@ or @verb@///@endverb@. # ### \chktexrcdefault\begin{verbatim} TeXInputs { } ### \end{verbatim} ### \end{chktexrclistvar} ## OutFormat ### \begin{chktexrclistvar}{OutFormat} # # Output formats which can be selected from the command-line. The # @verb@-v@endverb@ option simply indexes into this list. By default, entry number # @emph@two@endemph@ in this list is chosen (counting from 0), and @verb@-v@endverb@ # without any parameter selects entry number @emph@three@endemph@. # # For explanation of the @verb@%@endverb@ format specifiers see the # documentation of the @verb@--format@endverb@ command-line argument ### \begin{comment} # in the manual. ### \end{comment} ### on page~\pageref{clarg:format}. # # Recall that to use @verb@!@endverb@ is the escape character, not @verb@\@endverb@. # ### \chktexrcdefault\begin{verbatim} OutFormat { # -v0; silent mode %f%b%l%b%c%b%n%b%m!n # -v1; normal mode "%k %n in %f line %l: %m!n%r%s%t!n%u!n" # -v2; fancy mode "%k %n in %f line %l: %m!n%r%i%s%I%t!n!n" # -v3; lacheck mode "!"%f!", line %l: %m!n" # -v4; verbose lacheck mode "!"%f!", line %l: %m!n%r%s%t!n%u!n" # -v5; no line number, ease auto-test "%k %n in %f: %m!n%r%s%t!n%u!n" # -v6; emacs compilation mode "!"%f!", line %l.%c:(#%n) %m!n" } ### \end{verbatim} ### \end{chktexrclistvar} ## Silent ### \begin{chktexrclistvar*}{Silent} # # Commands which should not trigger a warning if terminated by a space. # This warning will not trigger in math mode. # # You can also specify regular expressions in the @verb@[]@endverb@ # section in case you have many custom macros that can be safely # terminated with a space. # ### \chktexrcdefault\begin{verbatim} Silent { \rm \em \bf \it \sl \sf \sc \tt \selectfont \rmfamily \sffamily \ttfamily \mdseries \bfseries \itshape \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 \noindent \expandafter \makeatletter \makeatother \columnseprule \textwidth \textheight \hsize \vsize \if \fi \else \csname \endcsname \z@ \p@ \@warning \typeout \dots \ldots \input \endinput \nextline \leavevmode \cdots \appendix \listfiles \and \quad \bigskip \medskip \smallskip \hskip \vfill \vfil \hfill \hfil \topmargin \oddsidemargin \frenchspacing \nonfrenchspacing \begingroup \endgroup \par \vrefwarning \upshape \headheight \headsep \hoffset \voffset \cdot \qquad \left \right \qedhere \xspace \addlinespace \cr \fill \frontmatter \toprule \midrule \bottomrule }[ # Here you can put regular expressions to match Silent macros. It # was designed for use with many custom macros sharing a common # prefix, but can of course be used for other things. # Support ConTeXt to at least some extent \\start.* \\stop.* ] ### \end{verbatim} ### \end{chktexrclistvar*} ## HyphDash ### \begin{chktexrclistvar}{HyphDash} # # The number of dashes allowed between two alphabetic characters. # Use 0 to always return an error. For example: ### \begin{errexam} # foo-bar @\\@ # Use of two--dashes is not usually allowed in English. @\\@ # like this---see? ### \end{errexam} # # For English, this will often be a single dash (hyphen). If you like # m-dashes with no spaces between them and the surrounding words, then # it should include 3 as well. There @emph@are@endemph@ cases when an n-dash # is valid between two alphabetic characters. See@ref@DashExcpt@endref@. # ### \chktexrcdefault\begin{verbatim} HyphDash { 1 3 } ### \end{verbatim} ### \end{chktexrclistvar} ## NumDash ### \begin{chktexrclistvar}{NumDash} # # The number of dashes allowed between two numeric characters. # Use 0 to always return an error. This does @emph@not@endemph@ apply in # math mode. For example: ### \begin{errexam} # 123--456 is a range @\\@ # $12-4$ \% okay because it's in math mode ### \end{errexam} # # For English, this should be 2 because an n-dash is used to indicate # a range of numbers and subtraction should be in math mode where this # does not apply. # ### \chktexrcdefault\begin{verbatim} NumDash { 2 } ### \end{verbatim} ### \end{chktexrclistvar} ## WordDash ### \begin{chktexrclistvar}{WordDash} # # The number of dashes allowed between two space characters. # Use 0 to always return an error. For example: ### \begin{errexam} # not like - this, @\\@ # or like -- this. @\\@ # like this --- see? ### \end{errexam} # ### \chktexrcdefault\begin{verbatim} WordDash { 3 } ### \end{verbatim} ### \end{chktexrclistvar} ## DashExcpt ### \begin{chktexrclistvar}{DashExcpt} # # Exceptions to the dash rules above. For example, an n-dash # @verb@--@endverb@ between words is usually wrong, but in some cases it is correct, # such as when naming a theorem. The Birch--Swinnerton-Dyer # conjecture is one example where the difference matters. You can # tell that Birch is one person and Swinnerton-Dyer is another based # on the dashes used. # # Adding line suppressions for these is possible, but can quickly # become tedious if a certain theorem is referenced often. For this # reason exceptions can be specified here. They are case-sensitive. # # Unfortunately, there are no warnings if the dashes are surrounded by differing # types of characters. For example: ### \begin{errexam} # like this ---see? (space and alphabet) @\\@ # a--123 (number and alphabet) @\\@ # a.--b. (other character, namely @verb@.@endverb@) ### \end{errexam} # Similarly, no warnings are issued if the hyphenation is correct, # according to the other rules, for example: ### \begin{errexam} # Birch-Swinnerton-Dyer ### \end{errexam} # ### \chktexrcdefault\begin{verbatim} DashExcpt { Birch--Swinnerton-Dyer } ### \end{verbatim} ### \end{chktexrclistvar} ## WipeArg ### \begin{chktexrclistvar}{WipeArg} # # Commands whose arguments aren't @LaTeX@ code, and thus should be # ignored. # # After the command, you may place arguments (separated from the # command with a colon) that should be wiped. Use @verb@[]@endverb@ for optional # arguments, @verb@{}@endverb@ for required ones, and @verb@*@endverb@ if the command supports a # star variant. Some commands (e.g.\@ @verb@\cmidrule@endverb@) use @verb@()@endverb@ to # delimit an optional argument and so this syntax is supported as well. # # For instance, if you would like to wipe the @verb@\newcommand@endverb@ command, # you would declare it as @verb@\newcommand:*[][]{}@endverb@ since it has a # star variant, two optional arguments, and one required argument. # # These commands may be ``evaluated'' before they're wiped, so you will # typically list file handling commands and similar here. # ### \chktexrcdefault\begin{verbatim} WipeArg { \label:{} \ref:{} \eqref:{} \vref:{} \pageref:{} \index:[]{} \cite:[][]{} \nocite:{} \input:{} \verbatiminput:[]{} \listinginput:[]{}{} \graphicspath:{} \verbatimtabinput:[]{} \include:{} \includeonly:{} \bibitem:[]{} \cline:{} \cmidrule:[](){} \href:{}{} # Cleveref -- there are many others that could be here as well... \cref:*{} \cpageref:*{} \crefrange:*{}{} \cpagerefrange:*{}{} \Cref:*{} \Cpageref:*{} \Crefrange:*{}{} \Cpagerefrange:*{}{} # natbib \citet:*[][]{} \citep:*[][]{} \citealt:*{} \citealp:*[]{} \citeauthor:*{} \Citet:*[][]{} \Citep:*[][]{} \Citealt:*{} \Citealp:*[]{} \Citeauthor:{} \citetext:{} \citeyear:*{} \citeyearpar:{} # biblatex - not including special commands \autocite:*[][]{} \autocites:*[][]{} \Autocite:*[][]{} \Autocites:*[][]{} \parencite:*[][]{} \parencites:*[][]{} \Parencite:*[][]{} \Parencites:*[][]{} \footcite:*{} \footcites:*[][]{} \Footcite:*[][]{} \Footcites:*[][]{} \textcite:*{} \textcites:*[][]{} \Textcite:*[][]{} \Textcites:*[][]{} \citeauthor:*{} \citeauthors:*[][]{} \Citeauthor:*[][]{} \Citeauthors:*[][]{} \citeyear:*{} \citeyears:*[][]{} \Citeyear:*[][]{} \Citeyears:*[][]{} \citetitle:*{} \citetitles:*[][]{} \Citetitle:*[][]{} \Citetitles:*[][]{} # tipa which uses " \textipa:{} # LuaTeX \directlua:{} \luaescapestring:{} } ### \end{verbatim} ### \end{chktexrclistvar} ## MathEnvir ### \begin{chktexrclistvar}{MathEnvir} # # Environments which typeset their contents as mathematics. # This turns on/off some warnings. # # A @verb@*@endverb@ variant is automatically added for each keyword. # ### \chktexrcdefault\begin{verbatim} MathEnvir { displaymath math eqnarray array equation align alignat gather flalign multline dmath dgroup darray } ### \end{verbatim} ### \end{chktexrclistvar} ## TextEnvir ### \begin{chktexrclistvar}{TextEnvir} # # Environments which typeset their contents as text, for use inside # mathematics. This turns on/off some warnings. # ### \chktexrcdefault\begin{verbatim} TextEnvir { dsuspend } ### \end{verbatim} ### \end{chktexrclistvar} ## MathCmd ### \begin{chktexrclistvar}{MathCmd} # # Commands whose argument will be typeset as mathematics. # The commands are assumed to have one mandatory argument which is in # math mode. This turns on/off some warnings. # ### \chktexrcdefault\begin{verbatim} MathCmd { \ensuremath } ### \end{verbatim} ### \end{chktexrclistvar} ## TextCmd ### \begin{chktexrclistvar}{TextCmd} # # Commands whose argument will @emph@not@endemph@ be typeset as # mathematics even if it would otherwise be in math mode. # The commands are assumed to have one mandatory argument which is in # text mode. This turns on/off some warnings. # ### \chktexrcdefault\begin{verbatim} TextCmd { \text \intertext \shortintertext \mbox \condition } ### \end{verbatim} ### \end{chktexrclistvar} ## VerbEnvir ### \begin{chktexrclistvar}{VerbEnvir} # # Environments containing non-@LaTeX@ content of some kind, and # therefore should not trigger any warnings. # # A @verb@*@endverb@ variant is automatically added for each keyword. # ### \chktexrcdefault\begin{verbatim} VerbEnvir { verbatim comment listing verbatimtab rawhtml errexam picture texdraw filecontents pgfpicture tikzpicture minted lstlisting IPA } ### \end{verbatim} ### \end{chktexrclistvar} ## Abbrev ### \begin{chktexrclistvar*}{Abbrev} # # Abbreviations not automatically handled by @ChkTeX@. # # @ChkTeX@ automagically catches 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 which is not the beginning of a new # sentence. # # The case-insensitive abbreviations are not fully case-insensitive. # Rather, only the first character is case-insensitive, while the # remaining characters are case-sensitive. # # To speed up the searching process somewhat, we require that these # end in a @verb@.@endverb@ which should not be a problem in practice. # # Much of this work (both the abbreviations below, and the regular # expressions necessary to catch the remaining automatically) have # been provided by Russ Bubley, . # ### \chktexrcdefault\begin{verbatim} 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. ] ### \end{verbatim} ### \end{chktexrclistvar*} ## IJAccent ### \begin{chktexrclistvar}{IJAccent} # # Commands which add accents above characters. This means that @verb@\i@endverb@ or @verb@\j@endverb@ # (@verb@\imath@endverb@ and @verb@\jmath@endverb@ in math mode) should be used instead of @verb@i@endverb@ and @verb@j@endverb@. # # Other accent commands such as @verb@\c@endverb@, @verb@\d@endverb@, and @verb@\b@endverb@, put their accent under # the character, and thus should be used with normal @verb@i@endverb@s and @verb@j@endverb@s. # ### \chktexrcdefault\begin{verbatim} IJAccent { \hat \check \breve \acute \grave \tilde \bar \vec \dot \ddot \' \` \^ \" \~ \= \. \u \v \H \t } ### \end{verbatim} ### \end{chktexrclistvar} ## Italic ### \begin{chktexrclistvar}{Italic} # # Commands which need italic correction when the group is terminated. # ### \chktexrcdefault\begin{verbatim} Italic { \it \em \sl \itshape \slshape } ### \end{verbatim} ### \end{chktexrclistvar} ## NonItalic ### \begin{chktexrclistvar}{NonItalic} # # Commands which makes the font non-italic. # ### \chktexrcdefault\begin{verbatim} NonItalic { \bf \rm \sf \tt \sc \upshape } ### \end{verbatim} ### \end{chktexrclistvar} ## ItalCmd ### \begin{chktexrclistvar}{ItalCmd} # # Commands which put their argument into italic (and thus possibly # needs italic correction in the end). # # This is currently empty, since @verb@\textit@endverb@, @verb@\textsl@endverb@, and @verb@\emph@endverb@ # automatically add italic correction. # ### \chktexrcdefault\begin{verbatim} ItalCmd { } ### \end{verbatim} ### \end{chktexrclistvar} ## PostLink ### \begin{chktexrclistvar}{PostLink} # # Commands in front of which a page break is highly undesirable. # Thus there should be no space in front of them. # ### \chktexrcdefault\begin{verbatim} PostLink { \index \label } ### \end{verbatim} ### \end{chktexrclistvar} ## NotPreSpaced ### \begin{chktexrclistvar}{NotPreSpaced} # # Commands that should not have a space in front of them for various # reasons. Much the same as@ref@PostLink@endref@, but produces a different warning. # ### \chktexrcdefault\begin{verbatim} NotPreSpaced { \footnote \footnotemark \/ } ### \end{verbatim} ### \end{chktexrclistvar} ## Linker ### \begin{chktexrclistvar}{Linker} # # Commands that should be prepended with a @verb@~@endverb@. For example ### \begin{errexam} # @verb@look in table~\ref{foo}@endverb@ ### \end{errexam} # to avoid the references being split across lines. # ### \chktexrcdefault\begin{verbatim} Linker { \ref \vref \pageref \eqref \cite } ### \end{verbatim} ### \end{chktexrclistvar} ## CenterDots ### \begin{chktexrclistvar}{CenterDots} # # Commands or characters which should have @verb@\cdots@endverb@ in between. # For example, $1+2+3+\cdots+n$. # ### \chktexrcdefault\begin{verbatim} CenterDots { = + - \cdot \div & \times \geq \leq < > } ### \end{verbatim} ### \end{chktexrclistvar} ## LowDots ### \begin{chktexrclistvar}{LowDots} # # Commands or characters which should have @verb@\ldots@endverb@ in between. # For example, $1,2,3,\ldots,n$. # ### \chktexrcdefault\begin{verbatim} LowDots { . , ; } ### \end{verbatim} ### \end{chktexrclistvar} ## MathRoman ### \begin{chktexrclistvar}{MathRoman} # # Words that should appear in roman (upright) in math mode. There are # certain aliases for mathematical operators (like sin or cos) that # appear in roman rather than the usual italic (slanted) font. # # These entries do not need a leading slash since the mistake is often # to @emph@not@endemph@ include the leading slash. # ### \chktexrcdefault\begin{verbatim} 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 } ### \end{verbatim} ### \end{chktexrclistvar} ## Primitives ### \begin{chktexrclistvar}{Primitives} # # Commands that are used in @TeX@ but have become unnecessary in # @LaTeX@, as there are @LaTeX@ commands which do the same. Purists # should thus avoid these in their code. # ### \chktexrcdefault\begin{verbatim} Primitives { \above \advance \catcode \chardef \closein \closeout \copy \count \countdef \cr \crcr \csname \delcode \dimendef \dimen \divide \expandafter \font \hskip \vskip \openout } ### \end{verbatim} ### \end{chktexrclistvar} ## NoCharNext ### \begin{chktexrclistvar}{NoCharNext} # # Commands and a set of characters that should @emph@not@endemph@ follow them. For # example, in math mode, @verb@\left@endverb@ should be followed by a delimiter # which is to change size. Therefore, it should not be followed by the # end of math mode @verb@$@endverb@ or a grouping character @verb@{@endverb@ or @verb@}@endverb@. # # The format is @verb@\command:characters@endverb@. # ### \chktexrcdefault\begin{verbatim} NoCharNext { \left:{}$ \right:{}$ } ### \end{verbatim} ### \end{chktexrclistvar} ## VerbClear ### \begin{chktexrcsimplevar}{VerbClear} # # The character to replace verbatim text with. # # The arguments of commands listed in@ref@WipeArg@endref@, as well as # @verb@\verb+...+@endverb@ commands, are replaced with an innocuous character # to prevent that data from inadvertently producing a warning. # # This should not contain an alphabetic character (in case the user # writes (@verb@\foo\verb+bar+@endverb@), neither should it contain be one of # @LaTeX@'s reserved characters (@verb@#$%&~_^\{}@endverb@), or any parenthesis # character (@verb@()[]{}@endverb@). If possible, don't use a punctuation # character or any spacing characters either. All of these characters # have warnings associated with them and thus could cause spurious # warnings to appear. # # The asterisk is also unsuitable, as some commands behave in another # way if they are appended with an asterisk. Which more or less # leaves us with the pipe. # # Please note that this may also be a @verb@string@endverb@, which will be # repeated until the proper length is reached. # ### \chktexrcdefault\begin{verbatim} VerbClear = "|" ### \end{verbatim} ### \end{chktexrcsimplevar} ## That's all for now - Happy @LaTeX@ing! chktex-1.7.9/m4/000755 000767 000024 00000000000 14613043276 014156 5ustar00iandrusstaff000000 000000 chktex-1.7.9/Test.pcre.out000644 000767 000024 00000073165 14613043276 016252 0ustar00iandrusstaff000000 000000 Message 30 in Test.tex: Multiple spaces detected in input. o To test the program upon it ^^^ Message 30 in Test.tex: Multiple spaces detected in input. o To show off some of the features ^^^ Message 22 in Test.tex: Comment displayed. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ^ Message 22 in Test.tex: Comment displayed. % Warning 1 ^ Message 1 in Test.tex: Command terminated with space. \foo This is an error. ^ Message 1 in Test.tex: Command terminated with space. So is this \foo ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. \smallskip This is a not. $\foo Neither$ is this. ^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 2 ^ Message 2 in Test.tex: Non-breaking space (`~') should have been used. This is a faulty reference to \ref{foo} ^ Message 22 in Test.tex: Comment displayed. % Warning 3 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $[(ab)^{-1}]^{-2}$ is not beautiful ^^^^^^^^^^^^^^^^^^ Message 3 in Test.tex: You should enclose the previous parenthesis with `{}'. $[(ab)^{-1}]^{-2}$ is not beautiful ^ Message 3 in Test.tex: You should enclose the previous parenthesis with `{}'. $[(ab)^{-1}]^{-2}$ is not beautiful ^ Message 30 in Test.tex: Multiple spaces detected in input. $[(ab)^{-1}]^{-2}$ is not beautiful ^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. ${{[{(ab)}^{-1}]}}^{-2}$ is beautiful ^^^^^^^^^^^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 4-6, 28 ^ Message 6 in Test.tex: No italic correction (`\/') found. Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^ Message 42 in Test.tex: You should remove spaces in front of `\/' Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^^ Message 28 in Test.tex: Don't use \/ in front of small punctuation. Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^^ Message 42 in Test.tex: You should remove spaces in front of `\/' Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^ Message 5 in Test.tex: Italic correction (`\/') found more than once. Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^^ Message 22 in Test.tex: Comment displayed. % LaTeX2e ^ Message 42 in Test.tex: You should remove spaces in front of `\/' Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^^ Message 42 in Test.tex: You should remove spaces in front of `\/' Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing \textem{italic\/} in this \textit{sentence}, as \textem{you see}. ^^ Message 22 in Test.tex: Comment displayed. % Warning 7 ^ Message 7 in Test.tex: Accent command `\'' needs use of `\i'. This \'is a test of $\hat{j}$ accents. ^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. This \'is a test of $\hat{j}$ accents. ^^^^^^^^^ Message 7 in Test.tex: Accent command `\hat' needs use of `\jmath'. This \'is a test of $\hat{j}$ accents. ^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. This \'{\i}s a test of $\hat{\jmath}$ accents. ^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 8 ^ Message 8 in Test.tex: Wrong length of dash may have been used. It wasn't anything - just a 2---3 star--shots. ^ Message 8 in Test.tex: Wrong length of dash may have been used. It wasn't anything - just a 2---3 star--shots. ^^^ Message 8 in Test.tex: Wrong length of dash may have been used. It wasn't anything - just a 2---3 star--shots. ^^ Message 22 in Test.tex: Comment displayed. % From Knuths TeXbook Chapter 14 ^ Message 22 in Test.tex: Comment displayed. % "How TeX Breaks Paragraphs into Lines", fourth paragraph: ^ Message 22 in Test.tex: Comment displayed. % Using DashExcpt ^ Message 8 in Test.tex: Wrong length of dash may have been used. The Birch--Swinnerton--Dyer conjecture is not correct. ^^ Message 8 in Test.tex: Wrong length of dash may have been used. The Birch--Swinnerton--Dyer conjecture is not correct. ^^ Message 8 in Test.tex: Wrong length of dash may have been used. The Birch-Swinnerton-Dyer conjecture is not correct (is now caught). ^ Message 22 in Test.tex: Comment displayed. % Warning 9-10 ^ Message 22 in Test.tex: Comment displayed. % Brackets: ^ Message 37 in Test.tex: You should avoid spaces in front of parenthesis. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `)' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `}' found. )}{[])} }}}]]]))) ^ Message 9 in Test.tex: `}' expected, found `)'. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `}' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `}' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `}' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `}' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `]' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `]' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `]' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `)' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `)' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `)' found. )}{[])} }}}]]]))) ^ Message 44 in Test.tex: User Regex: -3:Optional arguments [] inside optional arguments [] must be enclosed in {}. {[]} ((([[[{{{}}}]]]))) ^^^ Message 22 in Test.tex: Comment displayed. % Envs: ^ Message 9 in Test.tex: `baz' expected, found `quux'. \begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo} ^^^^ Message 9 in Test.tex: `quux' expected, found `baz'. \begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo} ^^^^ Message 10 in Test.tex: Solo `asoi' found. \begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo} ^^^^ Message 22 in Test.tex: Comment displayed. % Warning 47 -- ConTeXt environment mismatch -- split from 9 ^ Message 47 in Test.tex: `section' expected, found `text' (ConTeXt). \stoptext ^^^^ Message 22 in Test.tex: Comment displayed. % (Un)fortunately, this is not an error ^ Message 22 in Test.tex: Comment displayed. % Warning 11 ^ Message 11 in Test.tex: You should use \ldots to achieve an ellipsis. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^^^^ Message 11 in Test.tex: You should use \ldots to achieve an ellipsis. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^^^^ Message 11 in Test.tex: You should use \cdots to achieve an ellipsis. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^^^^^^^ Message 11 in Test.tex: You should use \ldots to achieve an ellipsis. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^^^^^^^^^^^^^^^ Message 11 in Test.tex: You should use \cdots to achieve an ellipsis. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$. ^^^^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$. ^^^^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$. ^^^^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$. ^^^^^^^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 12 ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 22 in Test.tex: Comment displayed. % Bug 54751 ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. Mr. ``X'' and Mrs. \(Y\) ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. Mr. ``X'' and Mrs. \(Y\) ^ Message 22 in Test.tex: Comment displayed. % ignore commands by default ^ Message 22 in Test.tex: Comment displayed. % Bug 65500 ^ Message 22 in Test.tex: Comment displayed. % Warning 13 ^ Message 13 in Test.tex: Intersentence spacing (`\@') should perhaps be used. Look at THIS! It's an error. ^ Message 22 in Test.tex: Comment displayed. % after frenchspacing it's not an error ^ Message 22 in Test.tex: Comment displayed. % warning again ^ Message 13 in Test.tex: Intersentence spacing (`\@') should perhaps be used. Look at THIS! It's an error. ^ Message 22 in Test.tex: Comment displayed. % ignore commands by default ^ Message 21 in Test.tex: This command might not be intended. Look at \THIS\@! It's not an error. D. E. Knuth. ^^ Message 22 in Test.tex: Comment displayed. % Warning 14 ^ Message 1 in Test.tex: Command terminated with space. \hat ^ Message 14 in Test.tex: Could not find argument for command. \hat ^^^^ Message 22 in Test.tex: Comment displayed. % Warning 18,19 ^ Message 18 in Test.tex: Use either `` or '' as an alternative to `"'. Is this an "example", or is it an ŽexampleŽ. ^ Message 18 in Test.tex: Use either `` or '' as an alternative to `"'. Is this an "example", or is it an ŽexampleŽ. ^ Message 19 in Test.tex: Use "'" (ASCII 39) instead of "Ž" (ASCII 180). Is this an "example", or is it an ŽexampleŽ. ^ Message 19 in Test.tex: Use "'" (ASCII 39) instead of "Ž" (ASCII 180). Is this an "example", or is it an ŽexampleŽ. ^ Message 22 in Test.tex: Comment displayed. % Warning 20 ^ Message 20 in Test.tex: User-specified pattern found: \unknown. That bug is \unknown\ to me. ^^^^^^^^ Message 22 in Test.tex: Comment displayed. % That bug is \unknown\ to me. ^ Message 22 in Test.tex: Comment displayed. % Warning 21 ^ Message 21 in Test.tex: This command might not be intended. \LaTeX\ is an extension of \TeX\. Right? ^^ Message 22 in Test.tex: Comment displayed. % Warning 23 ^ Message 23 in Test.tex: Either `\,`` or ``\,` will look better. ```Hello', I heard him said'', she remembered. ^^^ Message 22 in Test.tex: Comment displayed. % Warning 24 ^ Message 24 in Test.tex: Delete this space to maintain correct pagereferences. Indexing text \index{text} is fun! ^ Message 22 in Test.tex: Comment displayed. Indexing text% ^ Message 30 in Test.tex: Multiple spaces detected in input. \index{text} is fun! ^^^^ Message 24 in Test.tex: Delete this space to maintain correct pagereferences. \index{text} is fun! ^ Message 22 in Test.tex: Comment displayed. % Warning 25 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $5\cdot10^10$ ^^^^^^^^^^^^^ Message 25 in Test.tex: You might wish to put this between a pair of `{}' $5\cdot10^10$ ^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $5\cdot10^{10}$ ^^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 26 ^ Message 26 in Test.tex: You ought to remove spaces in front of punctuation. Do you understand ? ^ Message 22 in Test.tex: Comment displayed. % Warning 27 ^ Message 1 in input.tex: Command terminated with space. \this is a test of whether the file is actually inputted... ^ Message 11 in input.tex: You should use \ldots to achieve an ellipsis. \this is a test of whether the file is actually inputted... ^^^ Message 1 in input.tex: Command terminated with space. \this is a test of whether the file is actually inputted... ^ Message 11 in input.tex: You should use \ldots to achieve an ellipsis. \this is a test of whether the file is actually inputted... ^^^ Message 22 in input/file: Comment displayed. % -*- TeX -*- ^ Message 22 in input/file: Comment displayed. % chktex-file 22 ^ Message 22 in Test.tex: Comment displayed. % Warning 29 ^ Message 29 in Test.tex: $\times$ may look prettier here. The program opens a screen sized 640x200 pixels ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. The program opens a screen sized $640\times200$ pixels ^^^^^^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Approximately $\frac{2x}{1+x}$ $x$s shouldn't be errors. ^^^^^^^^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Approximately $\frac{2x}{1+x}$ $x$s shouldn't be errors. ^^^ Message 22 in Test.tex: Comment displayed. % Warning 30 ^ Message 30 in Test.tex: Multiple spaces detected in input. White is a beautiful colour. ^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 31 ^ Message 31 in Test.tex: This text may be ignored. \end{verbatim} foo bar ^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 32-34 ^ Message 32 in Test.tex: Use ` to begin quotation, not '. This is either an 'example`, an ''example`` or an `"`example'`'. ^ Message 33 in Test.tex: Use ' to end quotation, not `. This is either an 'example`, an ''example`` or an `"`example'`'. ^ Message 32 in Test.tex: Use ` to begin quotation, not '. This is either an 'example`, an ''example`` or an `"`example'`'. ^^ Message 33 in Test.tex: Use ' to end quotation, not `. This is either an 'example`, an ''example`` or an `"`example'`'. ^^ Message 34 in Test.tex: Don't mix quotes. This is either an 'example`, an ''example`` or an `"`example'`'. ^^^ Message 34 in Test.tex: Don't mix quotes. This is either an 'example`, an ''example`` or an `"`example'`'. ^^^ Message 22 in Test.tex: Comment displayed. % Warning 35 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $sin^2 + cos^2 = 1$ ^^^^^^^^^^^^^^^^^^^ Message 35 in Test.tex: You should perhaps use `\sin' instead. $sin^2 + cos^2 = 1$ ^^^ Message 35 in Test.tex: You should perhaps use `\cos' instead. $sin^2 + cos^2 = 1$ ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $\sin^2 + \cos^2 = 1$ ^^^^^^^^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 36-37 ^ Message 36 in Test.tex: You should put a space in front of parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 37 in Test.tex: You should avoid spaces after parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 36 in Test.tex: You should put a space in front of parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 37 in Test.tex: You should avoid spaces after parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 37 in Test.tex: You should avoid spaces in front of parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 36 in Test.tex: You should put a space in front of parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 37 in Test.tex: You should avoid spaces after parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 37 in Test.tex: You should avoid spaces in front of parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 36 in Test.tex: You should put a space after parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 22 in Test.tex: Comment displayed. % Warning 38 ^ Message 38 in Test.tex: You should not use punctuation in front of quotes. ``An example,'' he said, ``would be great.'' ^ Message 38 in Test.tex: You should not use punctuation in front of quotes. ``An example,'' he said, ``would be great.'' ^ Message 22 in Test.tex: Comment displayed. % Warning 39 ^ Message 39 in Test.tex: Double space found. For output codes, see table ~\ref{tab:fmtout}. ^ Message 22 in Test.tex: Comment displayed. % Warning 40 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $\this,$ and $$this$$. ^^^^^^^^ Message 40 in Test.tex: You should put punctuation outside inner math mode. $\this,$ and $$this$$. ^ Message 45 in Test.tex: Use \[ ... \] instead of $$ ... $$. $\this,$ and $$this$$. ^^^^^^^^ Message 40 in Test.tex: You should put punctuation inside display math mode. $\this,$ and $$this$$. ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $\this$, and $$this.$$ ^^^^^^^ Message 45 in Test.tex: Use \[ ... \] instead of $$ ... $$. $\this$, and $$this.$$ ^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 41 ^ Message 1 in Test.tex: Command terminated with space. foo \above qux ^ Message 41 in Test.tex: You ought to not use primitive TeX in LaTeX code. foo \above qux ^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 42 ^ Message 42 in Test.tex: You should remove spaces in front of `\footnote' This is a footnote \footnote{foo}. ^ Message 22 in Test.tex: Comment displayed. This is a footnote% ^ Message 22 in Test.tex: Comment displayed. % Warning 43 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Here is a mistake $\left{x\right}$. ^^^^^^^^^^^^^^^^ Message 43 in Test.tex: `\left' is normally not followed by `{'. Here is a mistake $\left{x\right}$. ^^^^^ Message 43 in Test.tex: `\right' is normally not followed by `}'. Here is a mistake $\left{x\right}$. ^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. This one triggers warning 22 $\left\{x\right\}$. ^^^^^^^^^^^^^^^^^^ Message 21 in Test.tex: This command might not be intended. This one triggers warning 22 $\left\{x\right\}$. ^^ Message 21 in Test.tex: This command might not be intended. This one triggers warning 22 $\left\{x\right\}$. ^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Here \chktex\ doesn't complain $\left\lbrace x\right\rbrace$. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 44 -- user regex -- default message ^ Message 22 in Test.tex: Comment displayed. % Warning 44 -- user regex -- user message ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. For every $p\not|n$ you have an ugly prime which doesn't divide $n$. ^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. For every $p\not|n$ you have an ugly prime which doesn't divide $n$. ^^^ Message 44 in Test.tex: User Regex: Always use \nmid. For every $p\not|n$ you have an ugly prime which doesn't divide $n$. ^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. For every $p\nmid n$ you have a cute prime which doesn't divide $n$. ^^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. For every $p\nmid n$ you have a cute prime which doesn't divide $n$. ^^^ Message 22 in Test.tex: Comment displayed. % Warning about optional arguments inside optional arguments ^ Message 44 in Test.tex: User Regex: -3:Optional arguments [] inside optional arguments [] must be enclosed in {}. \begin{something}[\cite2[1231]{adadsd}]\end{something} ^^^^^^^^ Message 44 in Test.tex: User Regex: -3:Optional arguments [] inside optional arguments [] must be enclosed in {}. [dasd{dasda[ ads[ dasd ]]}] ^^^^^^ Message 44 in Test.tex: User Regex: -3:Optional arguments [] inside optional arguments [] must be enclosed in {}. adssd[ {}[]] ^^^^^ Message 44 in Test.tex: User Regex: -3:Optional arguments [] inside optional arguments [] must be enclosed in {}. \begin{something}[\cite{adadsd}[1231]]\end{something} ^^^^^^^^^^^^^^^ Message 44 in Test.tex: User Regex: -3:Optional arguments [] inside optional arguments [] must be enclosed in {}. \begin{something}[ ][\cite{adadsd}[1231]]\end{something} ^^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Shouldn't warn ^ Message 22 in Test.tex: Comment displayed. % Math mode check ^ Message 35 in Test.tex: You should perhaps use `\sin' instead. \ensuremath{sin x\text{is not the same as sin x, but is the same as $sin x$}} ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. \ensuremath{sin x\text{is not the same as sin x, but is the same as $sin x$}} ^^^^^^^ Message 35 in Test.tex: You should perhaps use `\sin' instead. \ensuremath{sin x\text{is not the same as sin x, but is the same as $sin x$}} ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Also, $x(3)\text{ is not x(3) but it is $x(3)$}$ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Message 36 in Test.tex: You should put a space in front of parenthesis. Also, $x(3)\text{ is not x(3) but it is $x(3)$}$ ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Also, $x(3)\text{ is not x(3) but it is $x(3)$}$ ^^^^^^ Message 22 in Test.tex: Comment displayed. % breqn mode check ^ Message 35 in Test.tex: You should perhaps use `\sin' instead. sin x ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. is not the same as sin x, but is the same as $sin x$ ^^^^^^^ Message 35 in Test.tex: You should perhaps use `\sin' instead. is not the same as sin x, but is the same as $sin x$ ^^^ Message 22 in Test.tex: Comment displayed. This is\\% a comment. Nothing here should be checked(right)? ^ Message 36 in Test.tex: You should put a space in front of parenthesis. But this is not a \% comment, so we should find this error(right)? ^ Message 22 in Test.tex: Comment displayed. Here(on this line only)is a warning $sin(x)$ suppressed. % chktex 36 chktex 35 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Here(on this line only)is a warning $sin(x)$ suppressed. % chktex 36 chktex 35 ^^^^^^^^ Message 22 in Test.tex: Comment displayed. Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36 ^ Message 36 in Test.tex: You should put a space in front of parenthesis. Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36 ^ Message 36 in Test.tex: You should put a space after parenthesis. Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36 ^^^^^^^^ Message 44 in Test.tex: User Regex: -1:Capitalize before references. In section~\ref{sec:3} we have a warning. ^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. In section~\ref{sec:4} it is suppressed. % chktex -1 ^ Message 22 in Test.tex: Comment displayed. % In section~\ref{sec:5} we don't have a warning. ^ Message 44 in Test.tex: User Regex: -2:Vertical rules in tables are ugly. \begin{tabular*}{1.0\linewidth}[h]{|c|cc|} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Message 44 in Test.tex: User Regex: -2:Use \toprule, \midrule, or \bottomrule from booktabs. \hline ^^^^^^ Message 22 in Test.tex: Comment displayed. % Verb check ^ Message 14 in Test.tex: Could not find argument for command. \verb# ^^^^^ Message 31 in Test.tex: This text may be ignored. \end{verbatim} FOO ^^^ Message 22 in Test.tex: Comment displayed. % WipeArg ^ Message 22 in Test.tex: Comment displayed. % Bug 60197 -- "double math mode" should be handled okay ^ Message 22 in Test.tex: Comment displayed. % Warning 49 ^ Message 49 in Test.tex: Expected math mode to be on here. \] ^ Message 22 in Test.tex: Comment displayed. % Warning 16,15 ^ Message 45 in Test.tex: Use \[ ... \] instead of $$ ... $$. $$( ^^^^^^^ Message 22 in Test.tex: Comment displayed. % Local Variables: ^ Message 22 in Test.tex: Comment displayed. % require-final-newline: nil ^ Message 22 in Test.tex: Comment displayed. % End: ^ Message 22 in Test.tex: Comment displayed. % There should be no newline at the end of this file to test bug #46539 ^ Message 48 in Test.tex: No match found for `text' (ConTeXt). \starttext ^^^^ Message 16 in Test.tex: Mathmode still on at end of LaTeX file. Message 17 in Test.tex: Number of `(' doesn't match the number of `)'! Message 17 in Test.tex: Number of `[' doesn't match the number of `]'! Message 17 in Test.tex: Number of `{' doesn't match the number of `}'! chktex-1.7.9/Utility.h000644 000767 000024 00000011417 14613043276 015456 0ustar00iandrusstaff000000 000000 /* * ChkTeX, utility functions -- header file. * Copyright (C) 1995-96 Jens T. Berger Thielemann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * Contact the author at: * Jens Berger * Spektrumvn. 4 * N-0666 Oslo * Norway * E-mail: * * */ #ifndef UTILITY_H #define UTILITY_H 1 #include "ChkTeX.h" #include "OpSys.h" /* * How many indexes we'll allocate first time */ #define MINPUDDLE 256 /* * How many bytes we want in front/end of each char buffer. > 2 */ #define WALLBYTES 4 #ifndef HASH_SIZE # define HASH_SIZE 1009 /* A reasonably large prime */ #endif #define FORWL(ind, list) for(ind = 0; ind < (list).Stack.Used; ind++) enum Strip { STRP_LFT = 0x01, STRP_RGT = 0x02, STRP_BTH = 0x03 }; struct HashEntry { struct HashEntry *Next; char *Str; }; struct Hash { struct HashEntry **Index; }; struct Stack { void **Data; unsigned long Size, Used; }; struct WordList { unsigned long MaxLen; int NonEmpty; struct Stack Stack; struct Hash Hash; }; #define WORDLIST_DEFINED struct FileNode { char *Name; FILE *fh; unsigned long Line; }; /* Subtract 1 because sizeof includes the null terminator. * WARNING: To use this on a variable, the type should be char[] * rather than char*, since for some versions of gcc these give * different values. */ #define STRLEN(x) (sizeof(x)/sizeof(x[0]) - 1) int fexists(const char *Filename); void *sfmemset(void *to, int c, long n); void *saferealloc(void *old, size_t newsize); int strafter(const char *Str, const char *Cmp); void strrep(char *String, const char From, const char To); void strxrep(char *Buf, const char *Prot, const char To); char *strip(char *String, const enum Strip What); void strwrite(char *To, const char *From, unsigned long Len); int strinfront(const char *Str, const char *Cmp); char *strdupx(const char *String, int Extra); void strmove(char *a, const char *b); void ClearHash(struct Hash *h); void InsertHash(char *a, struct Hash *h); char *HasHash(const char *a, const struct Hash *h); int InsertWord(const char *Word, struct WordList *WL); char *HasWord(const char *Word, struct WordList *WL); void MakeLower(struct WordList *wl); void ListRep(struct WordList *wl, const char From, const char To); void ClearWord(struct WordList *WL); int StkPush(void *Data, struct Stack *Stack); void *StkPop(struct Stack *Stack); void *StkTop(struct Stack *Stack); FILE *CurStkFile(struct Stack *stack); const char *CurStkName(struct Stack *stack); unsigned long CurStkLine(struct Stack *stack); long CurStkMode(struct Stack *stack); long *PushMode(long mode, struct Stack *stack); char *FGetsStk(char *Dest, unsigned long len, struct Stack *stack); int PushFileName(const char *Name, struct Stack *stack); int PushFile(const char *, FILE *, struct Stack *); void FreeErrInfo(struct ErrInfo *ei); struct ErrInfo *PushChar(const char c, const unsigned long Line, const unsigned long Column, struct Stack *Stk, const char *LineCpy); struct ErrInfo *PushErr(const char *Data, const unsigned long Line, const unsigned long Column, const unsigned long ErrLen, const char *LineCpy, struct Stack *Stk); struct ErrInfo *TopChar(struct Stack *Stack); struct ErrInfo *TopErr(struct Stack *Stack); struct ErrInfo *PopErr(struct Stack *Stack); struct ErrInfo *TopMatch(struct Stack *Stack, char *String); long BrackIndex(const char c); void AddBracket(const char c); char MatchBracket(const char c); short substring(const char *source, char *dest, unsigned long pos, long len); #ifndef HAVE_STRLWR # define strlwr mystrlwr char *mystrlwr(char *String); #endif #ifndef HAVE_STRDUP # define strdup mystrdup char *mystrdup(const char *String); #endif #ifndef HAVE_STRCASECMP int strcasecmp(char *a, char *b); #endif #if !(defined HAVE_DECL_STPCPY && HAVE_DECL_STPCPY) static inline char * stpcpy(char *dest, const char *src) { return strcpy(dest, src) + strlen(src); } #endif #endif /* UTILITY_H */ chktex-1.7.9/rmeheader.in000644 000767 000024 00000001457 14613043276 016131 0ustar00iandrusstaff000000 000000 Short: v@PACKAGE_VERSION@. Finds typographic errors in LaTeX Author: (Baruch Even) Uploader: (Baruch Even) Type: text/tex Replaces: text/tex/ChkTeX.lha Version: @PACKAGE_VERSION@ URL: http://www.freesoftware.fsf.org/chktex ##### ### ### ######## ### ## ### ## ## ## ## ## # @@ @@ @@@ @@ @@ @@ ####### @@ @ @@ @@@ @@ @@ @@ @@ ## # @@ && && && &&&& && @@ & && &&& && && && && && && @@@@ & && %%%%% %%% %%% %%% %%% %% && %%% %%% v@PACKAGE_VERSION@ && & %%%%%%% chktex-1.7.9/Makefile.in000644 000767 000024 00000022232 14613043276 015704 0ustar00iandrusstaff000000 000000 # # Makefile for ChkTeX project, creates the stuff. # Copyright (C) 1996 Jens T. Berger Thielemann # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Contact the author at: # Jens Berger # Spektrumvn. 4 # N-0666 Oslo # Norway # E-mail: # prefix=@prefix@ exec_prefix=@exec_prefix@ bindir=@bindir@ datarootdir=@datarootdir@ datadir=@datadir@ sysconfdir=@sysconfdir@ srcdir=@srcdir@ mandir=@mandir@ INSTALL=@INSTALL@ INSTALL_PROGRAM=@INSTALL_PROGRAM@ INSTALL_DATA=@INSTALL_DATA@ MKDIR_P=@MKDIR_P@ CLEAN=@CLEAN@ CC=@CC@ CFLAGS=@CFLAGS@ CPPFLAGS=@CPPFLAGS@ -I$(srcdir) -I. $(DEFS) $(USRDEFS) DEFS=@DEFS@ LIBS=@LIBS@ LDFLAGS=@LDFLAGS@ LN_S=@LN_S@ LATEX=@LATEX@ PDFLATEX=@PDFLATEX@ DVIPS=@DVIPS@ PS2PDF=ps2pdf PERL5=@PERL5@ LATEX2HTML=@LATEX2HTML@ LYNX=@LYNX@ GROFF=@GROFF@ SHELL=/bin/sh BUILT_SCRIPTS=@BUILT_SCRIPTS@ SCRIPTS=@SCRIPTS@ USRDEFS=-DSYSCONFDIR=\"$(sysconfdir)\" -D__unix__ VPATH=$(srcdir) ##################################################################### EXTRA_DIST=configure.ac Makefile.in stamp-h.in config.h.in rmeheader.in \ MakeHTML.pl ChkTeX.tex.in aclocal.m4 NEWS \ chkweb deweb.in COPYING chktex.1 chkweb.1 deweb.1 \ input.tex Test.tex Test.pcre.out Test.posix-ere.out Test.nore.out configure \ install-sh lacheck chktexrc \ $(wildcard m4/*.m4) # created by configure CONFIG_DIST=ChkTeX.tex ChkTeXRC.tex chktexrc # created at make time BUILT_DIST=chktex.doc chkweb.doc deweb.doc README ChkTeX.dvi CSOURCES=ChkTeX.c FindErrs.c OpSys.c Resource.c Utility.c # The sources are the C sources and possibly the files with the same base name # but ending with .h SOURCEFILES=$(CSOURCES) $(wildcard $(CSOURCES:.c=.h)) types.h DISTFILES=$(EXTRA_DIST) $(SOURCEFILES) all: chktex chktexrc DISTDIR:=chktex-@PACKAGE_VERSION@ dist: $(DISTDIR).tar.gz $(DISTDIR).tar.gz: $(DISTFILES) $(CONFIG_DIST) $(BUILT_DIST) html rm -r $(DISTDIR) 2>/dev/null ; true $(MKDIR_P) $(DISTDIR) for f in $(DISTFILES) ; do \ cp $(srcdir)/$$f $(DISTDIR) ; \ done cp $(CONFIG_DIST) $(BUILT_DIST) $(DISTDIR) $(MKDIR_P) $(DISTDIR)/html cp HTML/ChkTeX/*.{html,css} $(DISTDIR)/html rm -f $(DISTDIR).tar.gz tar --owner=0 --group=0 -chzf $@ $(DISTDIR) rm -rf $(DISTDIR) ######################################################################## .c.o: $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ CLEAN+=$(CSOURCES:.c=.o) .%.d: %.c $(CC) -M $(CPPFLAGS) $< > $@.tmp sed 's,\($*\)\.o *:,\1.o $@ : Makefile,g' $@.tmp > $@ -rm -f $@.tmp 2>/dev/null DEPFILES=$(patsubst %.c,.%.d,$(CSOURCES)) CLEAN+=$(DEPFILES) ifeq ($(findstring clean,$(MAKECMDGOALS)),) include $(DEPFILES) endif ###################### MAIN DEPENDENCIES ################################ OBJS= ChkTeX.o FindErrs.o OpSys.o Resource.o Utility.o MAKETEST= (builddir=`pwd` ; cd $(srcdir) ; $${builddir}/chktex -mall -r -g0 -lchktexrc -v5 -q Test.tex || :) # We can't grep the output of chtex because it might not be built yet TestOutFile := $(shell sed -n 's/.*HAVE_\(.*RE\) 1.*/\1/p' config.h | tr "A-Z_" "a-z-") ifeq ($(TestOutFile),) TestOutFile := Test.nore.out else TestOutFile := Test.$(TestOutFile).out endif $(srcdir)/$(TestOutFile): $(srcdir)/Test.tex $(srcdir)/input/file -rm -f $(srcdir)/$(TestOutFile) @echo "" @echo "***Warning: creating $(TestOutFile)***" @echo "" $(MAKETEST) 1> $(srcdir)/$(TestOutFile) check: chktex $(srcdir)/$(TestOutFile) chktexrc @echo ">>> Testing that checking algorithms work correctly..." @-rm -f chktest $(MAKETEST) 1> chktest @if cmp -s chktest $(srcdir)/$(TestOutFile); then \ echo ">>> OK!"; \ rm -f chktest; \ else \ echo "***WARNING***"; \ echo "Problems when checking compilation. This may or may not"; \ echo "be a problem; anyway, I'm giving you a diff from what the"; \ echo "results were *supposed* to be..."; \ diff -u $(srcdir)/$(TestOutFile) chktest; \ fi $(srcdir)/tests/run-tests.sh `pwd` "$(srcdir)" chktex: $(OBJS) $(CC) $(LDFLAGS) -o chktex $(OBJS) $(LIBS) install: chktex ChkTeX.dvi $(MKDIR_P) $(DESTDIR)$(bindir) for program in chktex $(BUILT_SCRIPTS); do \ $(INSTALL_PROGRAM) $$program $(DESTDIR)$(bindir); \ done for program in $(SCRIPTS); do \ $(INSTALL_PROGRAM) $(srcdir)/$$program $(DESTDIR)$(bindir); \ done $(MKDIR_P) $(DESTDIR)$(sysconfdir) $(INSTALL_DATA) $(srcdir)/chktexrc $(DESTDIR)$(sysconfdir) if (eval echo "$(BUILT_SCRIPTS)") | egrep deweb >/dev/null 2>&1; then \ $(MKDIR_P) $(DESTDIR)$(mandir)/man1; \ cp $(srcdir)/deweb.1 $(DESTDIR)$(mandir)/man1; \ fi uninstall: for program in chktex $(SCRIPTS) $(BUILT_SCRIPTS); do \ rm -f $(DESTDIR)$(bindir)/$$program; \ done rm -f $(DESTDIR)$(sysconfdir)/chktexrc $(DESTDIR)$(mandir)/man1/deweb.1 test: chktex -v2 -mall $(srcdir)/Test.tex | less -r indent: indent -npsl -bli0 -npcs -nut -i4 $(SOURCEFILES) mostlyclean: clean clean: rm -rf $(CLEAN) $(BUILT_DIST) $(DISTDIR).tar.gz \ *.aux *.log *.pdf *.dvi *.ps \ chktex HTML rme chktest distclean: clean rm -rf $(CONFIG_DIST) *.cache *.status *.log *.tar.gz \ deweb Makefile autom4te.cache config.h maintainer-clean: distclean rm -rf *.rme install-sh config.guess config.sub aclocal.m4 \ configure missing rmeheader stamp-h mkinstalldirs tags dvi: ChkTeX.dvi pdf: ChkTeX.pdf ifneq ($(LATEX2HTML),) html: ChkTeX.tex MakeHTML.pl -rm -r HTML $(MKDIR_P) HTML $(PERL5) $(srcdir)/MakeHTML.pl ChkTeX.tex > HTML/ChkTeX.tex cd HTML; $(LATEX2HTML) ChkTeX.tex $(PERL5) -i -pe 's% %%gi;s%\s+([.,?!])%$$1%g;' HTML/ChkTeX/*.html README: ChkTeX.tex rmeheader MakeHTML.pl rm -rf rme $(MKDIR_P) rme $(PERL5) $(srcdir)/MakeHTML.pl ChkTeX.tex > rme/ChkTeX.tex cd rme; $(LATEX2HTML) -split 0 ChkTeX.tex $(PERL5) -i -pe 's%LA%La%g;s%TEX%TeX%g;s%(.*)%$$1%g' rme/ChkTeX/*.html $(PERL5) -i -pe 's% %%gi;s%\s+([.,?!])%$$1%g;' rme/ChkTeX/*.html $(LYNX) -dump rme/ChkTeX/ChkTeX.html > rme/ChkTeX.rme cp rmeheader README $(PERL5) -e 'undef $$/;$$_=<>;($$_)=/(.*INTRODUCTION(.|\n)*?)[ \t]+ABOUT THIS DOCUMENT/i;s/[ \t]+\n/\n/g;s/\n\n\n/\n/g;s/\[\d+\]//g;print;' rme/ChkTeX.rme >> README rm -rf rme else html README: @echo "latex2html is unavailable on this system, cant create target $@."; exit 1 endif ###################### AUTOCONF REMAKING ################################ $(srcdir)/configure: configure.ac aclocal.m4 cd $(srcdir) && autoconf #autoheader might not change config.h.in, so touch a stamp file. $(srcdir)/config.h.in: stamp-h.in $(srcdir)/stamp-h.in: configure.ac aclocal.m4 cd $(srcdir) && autoheader echo timestamp > $(srcdir)/stamp-h.in config.h: stamp-h stamp-h: config.h.in config.status ./config.status ChkTeX.tex: ChkTeX.tex.in ./config.status ChkTeX.tex Makefile: Makefile.in config.status ./config.status config.status: configure ./config.status --recheck ###################### INDIVIDUAL DEPENDENCIES ########################## %.doc: %.1 $(GROFF) $< > $@ ChkTeXRC.tex: chktexrc.in MakeChkTeXRC.pl $(PERL5) $(srcdir)/MakeChkTeXRC.pl --latex $(srcdir)/chktexrc.in > ChkTeXRC.tex chktexrc: chktexrc.in MakeChkTeXRC.pl $(PERL5) $(srcdir)/MakeChkTeXRC.pl --chktexrc $(srcdir)/chktexrc.in > chktexrc ChkTeX.dvi: ChkTeX.tex ChkTeXRC.tex ifdef LATEX $(LATEX) ChkTeX.tex else echo "No latex program found by configure" false endif ChkTeX.ps: ChkTeX.dvi $(DVIPS) -o ChkTeX.ps ChkTeX.dvi ifdef PDFLATEX ChkTeX.pdf: ChkTeX.tex ChkTeXRC.tex $(PDFLATEX) -interaction=nonstopmode ChkTeX.tex else ChkTeX.pdf: ChkTeX.ps $(PS2PDF) $< $@ endif cover: -./chktex -h -./chktex Test.tex -./chktex -v2 -t -o tmptmptmp # # # print STDERR "DeWEB v1.3 - Copyright 1996 Jens T. Berger Thielemann\n"; undef $/; my @FILES = @ARGV; FILE: while( my $file = shift @FILES ) { my $success = open my $fh, '<', "$file"; if ( ! $success ) { print STDERR "Couldn't open file '$file'\n"; next FILE; } $texmode = 1; $_ = <$fh>; while (/\@/) { &out($`); $_ = $'; if (/^@/) { $_ = $'; &out('@'); next; } if (/^([\s\n])/) { $_ = $'; print "\n" if $1 eq "\n"; $texmode = 1; next; } if (/^[cpd]/i) { $_ = $'; $texmode = 0; next; } if (/^\,/i) { $_ = $'; print '\,'; next; } if (m!^/!) { $_ = $'; print '\\\\'; next; } if (/^[h\&\|\;\#\+]/i || /^i.*/i) { $_ = $'; next; } if (/^\*[0-9\*]?((.|\n)*?\.)/) { $_ = $'; print $1; $texmode = 1; next; } if (/^[<(^.t!]((.|\n)*?)\@\>/i) { $_ = $'; print '{'.$1.'}'; $texmode = 0; next; } if (/^[=]((.|\n)*?)\@\>/) { $_ = $'; print &printnl($1); next; } if (/^[fsl](\s+\S+\s+\S+)|^\'(.|\n)*?\'|^\[((.|\n)*?)\@\]/i) { $_ = $'; print &printnl($+); next; } @line = split(/\n/, $_, 2); print STDERR "Unknown opcode, ignored. Buffer:\n$line[0]\n"; } print $_; } sub printnl { my($foo); if (defined $_[0]) { $foo = $_[0]; $foo =~ s/.//g; } else { $foo = ""; } $foo; } sub out { print $texmode? $_[0] : &printnl($_[0]); } chktex-1.7.9/autogen.sh000755 000767 000024 00000002146 14613043276 015642 0ustar00iandrusstaff000000 000000 #!/bin/sh ACLOCAL="aclocal -I m4" AUTOHEADER="autoheader" AUTOMAKE="automake --add-missing --copy --foreign" AUTOCONF="autoconf" # Delete old cache directories. # automake will stop if their contents was created by an earlier version. rm -rf autom4te.cache # Generate the Makefiles and configure files echo "Building macros..." if ( $ACLOCAL --version ) < /dev/null > /dev/null 2>&1; then $ACLOCAL else echo "aclocal not found -- aborting" exit 1 fi echo "Building config header template..." if ( $AUTOHEADER --version ) < /dev/null > /dev/null 2>&1; then $AUTOHEADER echo timestamp > stamp-h.in else echo "autoheader not found -- aborting" exit 1 fi # We do not really need automake, but want to install programs like install-sh. echo "Installing some useful programs..." if ( $AUTOMAKE --version ) < /dev/null > /dev/null 2>&1; then $AUTOMAKE 2>/dev/null else echo "automake not found -- aborting" exit 1 fi echo "Building configure..." if ( $AUTOCONF --version ) < /dev/null > /dev/null 2>&1; then $AUTOCONF else echo "autoconf not found -- aborting" exit 1 fi echo echo 'run "./configure ; make"' echo chktex-1.7.9/m4/vl_prog_cc_warnings.m4000644 000767 000024 00000007504 14613043276 020453 0ustar00iandrusstaff000000 000000 AC_DEFUN([VL_PROG_CC_WARNINGS], [ ansi=$1 if test -z "$ansi"; then msg="for C compiler warning flags" else msg="for C compiler warning and ANSI conformance flags" fi AC_CACHE_CHECK($msg, vl_cv_prog_cc_warnings, [ if test -n "$CC"; then cat > conftest.c <&1 | grep -i "WorkShop" > /dev/null 2>&1 && $CC -c -v -Xc conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="-v" else vl_cv_prog_cc_warnings="-v -Xc" fi dnl Digital Unix C compiler elif $CC -V 2>&1 | grep -i "Digital UNIX Compiler" > /dev/null 2>&1 && $CC -c -verbose -w0 -warnprotos -std1 conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="-verbose -w0 -warnprotos" else vl_cv_prog_cc_warnings="-verbose -w0 -warnprotos -std1" fi dnl C for AIX Compiler elif $CC 2>&1 | grep -i "C for AIX Compiler" > /dev/null 2>&1 && $CC -c -qlanglvl=ansi -qinfo=all conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="-qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" else vl_cv_prog_cc_warnings="-qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd -qlanglvl=ansi" fi dnl IRIX C compiler elif $CC -version 2>&1 | grep -i "MIPSpro Compilers" > /dev/null 2>&1 && $CC -c -fullwarn -ansi -ansiE conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="-fullwarn" else vl_cv_prog_cc_warnings="-fullwarn -ansi -ansiE" fi dnl HP-UX C compiler elif what $CC 2>&1 | grep -i "HP C Compiler" > /dev/null 2>&1 && $CC -c -Aa +w1 conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="+w1" else vl_cv_prog_cc_warnings="+w1 -Aa" fi dnl The NEC SX-5 (Super-UX 10) C compiler elif $CC -V 2>&1 | grep "/SX" > /dev/null 2>&1 && $CC -c -pvctl[,]fullmsg -Xc conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="-pvctl[,]fullmsg" else vl_cv_prog_cc_warnings="-pvctl[,]fullmsg -Xc" fi dnl The Cray C compiler (Unicos) elif $CC -V 2>&1 | grep -i "Cray" > /dev/null 2>&1 && $CC -c -h msglevel 2 conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="-h msglevel 2" else vl_cv_prog_cc_warnings="-h msglevel 2 -h conform" fi fi rm -f conftest.* fi if test -n "$vl_cv_prog_cc_warnings"; then CFLAGS="$CFLAGS $vl_cv_prog_cc_warnings" else vl_cv_prog_cc_warnings="unknown" fi ]) ])dnl chktex-1.7.9/m4/ax_require_defined.m4000644 000767 000024 00000002302 14613043276 020237 0ustar00iandrusstaff000000 000000 # =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_require_defined.html # =========================================================================== # # SYNOPSIS # # AX_REQUIRE_DEFINED(MACRO) # # DESCRIPTION # # AX_REQUIRE_DEFINED is a simple helper for making sure other macros have # been defined and thus are available for use. This avoids random issues # where a macro isn't expanded. Instead the configure script emits a # non-fatal: # # ./configure: line 1673: AX_CFLAGS_WARN_ALL: command not found # # It's like AC_REQUIRE except it doesn't expand the required macro. # # Here's an example: # # AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG]) # # LICENSE # # Copyright (c) 2014 Mike Frysinger # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 2 AC_DEFUN([AX_REQUIRE_DEFINED], [dnl m4_ifndef([$1], [m4_fatal([macro ]$1[ is not defined; is a m4 file missing?])]) ])dnl AX_REQUIRE_DEFINED chktex-1.7.9/m4/ax_cflags_strict_prototypes.m4000644 000767 000024 00000006756 14613043276 022265 0ustar00iandrusstaff000000 000000 # ================================================================================ # https://www.gnu.org/software/autoconf-archive/ax_cflags_strict_prototypes.html # ================================================================================ # # SYNOPSIS # # AX_CFLAGS_STRICT_PROTOTYPES [(shellvar [,default, [A/NA]] # # DESCRIPTION # # Try to find a compiler option that requires strict prototypes. # # The sanity check is done by looking at sys/signal.h which has a set of # macro-definitions SIG_DFL and SIG_IGN that are cast to the local # signal-handler type. If that signal-handler type is not fully qualified # then the system headers are not seen as strictly prototype clean. # # For the GNU CC compiler it will be -fstrict-prototypes # -Wstrict-prototypes The result is added to the shellvar being CFLAGS by # default. # # DEFAULTS: # # - $1 shell-variable-to-add-to : CFLAGS # - $2 add-value-if-not-found : nothing # - $3 action-if-found : add value to shellvariable # - $4 action-if-not-found : nothing # # NOTE: These macros depend on AX_APPEND_FLAG. # # LICENSE # # Copyright (c) 2008 Guido U. Draheim # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 18 AC_DEFUN([AX_FLAGS_STRICT_PROTOTYPES],[dnl AS_VAR_PUSHDEF([FLAGS],[_AC_LANG_PREFIX[]FLAGS])dnl AS_VAR_PUSHDEF([VAR],[ac_cv_[]_AC_LANG_ABBREV[]flags_strict_prototypes])dnl AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for strict prototypes], VAR,[VAR="no, unknown" ac_save_[]FLAGS="$[]FLAGS" for ac_arg dnl in "-pedantic -Werror % -fstrict-prototypes -Wstrict-prototypes" dnl GCC "-pedantic -Werror % -Wstrict-prototypes" dnl try to warn at least "-pedantic -Werror % -Wmissing-prototypes" dnl try to warn at least "-pedantic -Werror % -Werror-implicit-function-declaration" dnl "-pedantic -Werror % -Wimplicit-function-declaration" dnl "-pedantic % -Wstrict-prototypes %% no, unsupported" dnl oops # do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [[return 0;]])], [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break], []) done case ".$VAR" in .|.no|.no,*) ;; *) # sanity check with signal() from sys/signal.h cp config.log config.tmp AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[ if (signal (SIGINT, SIG_IGN) == SIG_DFL) return 1; if (signal (SIGINT, SIG_IGN) != SIG_DFL) return 2;]])], [dnl the original did use test -n `$CC testprogram.c` if test `diff config.log config.tmp | grep -i warning | wc -l` != 0 then if test `diff config.log config.tmp | grep -i warning | wc -l` != 1 then VAR="no, suppressed, signal.h," ; fi ; fi], [VAR="no, suppressed, signal.h"]) rm config.tmp ;; esac FLAGS="$ac_save_[]FLAGS" ]) AS_VAR_POPDEF([FLAGS])dnl AX_REQUIRE_DEFINED([AX_APPEND_FLAG]) case ".$VAR" in .ok|.ok,*) m4_ifvaln($3,$3) ;; .|.no|.no,*) m4_default($4,[m4_ifval($2,[AX_APPEND_FLAG([$2], [$1])])]) ;; *) m4_default($3,[AX_APPEND_FLAG([$VAR], [$1])]) ;; esac AS_VAR_POPDEF([VAR])dnl ])dnl AX_FLAGS_STRICT_PROTOTYPES AC_DEFUN([AX_CFLAGS_STRICT_PROTOTYPES],[dnl AC_LANG_PUSH([C]) AX_FLAGS_STRICT_PROTOTYPES([$1], [$2], [$3], [$4]) AC_LANG_POP([C]) ]) AC_DEFUN([AX_CXXFLAGS_STRICT_PROTOTYPES],[dnl AC_LANG_PUSH([C++]) AX_FLAGS_STRICT_PROTOTYPES([$1], [$2], [$3], [$4]) AC_LANG_POP([C++]) ]) chktex-1.7.9/m4/ax_append_flag.m4000644 000767 000024 00000003020 14613043276 017343 0ustar00iandrusstaff000000 000000 # =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_append_flag.html # =========================================================================== # # SYNOPSIS # # AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE]) # # DESCRIPTION # # FLAG is appended to the FLAGS-VARIABLE shell variable, with a space # added in between. # # If FLAGS-VARIABLE is not specified, the current language's flags (e.g. # CFLAGS) is used. FLAGS-VARIABLE is not changed if it already contains # FLAG. If FLAGS-VARIABLE is unset in the shell, it is set to exactly # FLAG. # # NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. # # LICENSE # # Copyright (c) 2008 Guido U. Draheim # Copyright (c) 2011 Maarten Bosmans # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 8 AC_DEFUN([AX_APPEND_FLAG], [dnl AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_SET_IF AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])]) AS_VAR_SET_IF(FLAGS,[ AS_CASE([" AS_VAR_GET(FLAGS) "], [*" $1 "*], [AC_RUN_LOG([: FLAGS already contains $1])], [ AS_VAR_APPEND(FLAGS,[" $1"]) AC_RUN_LOG([: FLAGS="$FLAGS"]) ]) ], [ AS_VAR_SET(FLAGS,[$1]) AC_RUN_LOG([: FLAGS="$FLAGS"]) ]) AS_VAR_POPDEF([FLAGS])dnl ])dnl AX_APPEND_FLAG chktex-1.7.9/tests/run-tests.sh000755 000767 000024 00000006626 14613043276 017315 0ustar00iandrusstaff000000 000000 #!/bin/dash # -- remember to change this to sh set -e usage() { echo "$0 BUILDDIR SRCDIR" } if [ "x$1" = x ] || [ "x$2" = x ]; then usage exit 1 fi builddir="$(cd $1; pwd)" srcdir="$(cd $2; pwd)" testsdir="$srcdir/tests" output="$testsdir/main.out" expected="$testsdir/main.expected" check_results() { sed -i -e 's~Message 22 in .*tests/~Message 22 in ~;' "$output" if cmp -s "$expected" "$output"; then echo ">>> OK!" rm -f "$output" return 0 else echo "***WARNING***"; echo "Unexpected test output"; diff -u "$expected" "$output"; return 1 fi } # We don't check in the test files because CTAN can't handle files # with the same names, and we need several that are named chktexrc. # Also, they don't like invisible files (start with '.') so we # generate those as well. echo ">>> Generating test files..." mkdir -p $testsdir/sub cat > $testsdir/sub/chktexrc < $testsdir/sub1/.config/chktexrc < $testsdir/sub2/.chktexrc <>> Testing that inclusion works correctly..." # absolute path rm -f "$output" ${builddir}/chktex -mall -r -g0 -l$srcdir/chktexrc -v5 -q \ $testsdir/main.tex 2>/dev/null \ 1> $testsdir/main.out check_results # relative path cd "$srcdir" ${builddir}/chktex -mall -r -g0 -l$srcdir/chktexrc -v5 -q \ tests/main.tex 2>/dev/null \ 1> tests/main.out check_results # file in the same directory cd "$testsdir" ${builddir}/chktex -mall -r -g0 -l$srcdir/chktexrc -v5 -q \ main.tex 2>/dev/null \ 1> main.out check_results echo ">>> Testing that correct chktexrc files are loaded" # XDG variables unset HOME echo '%' \ | XDG_CONFIG_HOME=${testsdir}/sub \ ${builddir}/chktex -mall -v0 -q \ | grep 'loaded chktex/tests/sub stdin' \ || (echo XDG_CONFIG_HOME/chktexrc inclusion failed; exit 1) echo '%' \ | HOME=${testsdir}/sub1 \ ${builddir}/chktex -mall -v0 -q \ | grep 'loaded chktex/tests/sub1/.config/chktexrc stdin' \ || (echo HOME/.config/chktexrc inclusion failed; exit 1) # HOME, LOGDIR echo '%' \ | HOME=${testsdir}/sub2 \ ${builddir}/chktex -mall -v0 -q \ | grep 'loaded chktex/tests/sub2/.chktexrc stdin' \ || (echo HOME/.chktexrc inclusion failed; exit 1) echo '%' \ | LOGDIR=${testsdir}/sub2 \ ${builddir}/chktex -mall -v0 -q \ | grep 'loaded chktex/tests/sub2/.chktexrc stdin' \ || (echo LOGDIR/.chktexrc inclusion failed; exit 1) # CHKTEXRC echo '%' \ | CHKTEXRC=${testsdir}/sub2 \ ${builddir}/chktex -mall -v0 -q \ | grep 'loaded chktex/tests/sub2/.chktexrc stdin' \ || (echo CHKTEXRC/.chktexrc inclusion failed; exit 1) # CWD echo '%' \ | (cd ${testsdir}/sub2; \ ${builddir}/chktex -mall -v0 -q) \ | grep 'loaded chktex/tests/sub2/.chktexrc stdin' \ || (echo PWD/.chktexrc inclusion failed; exit 1) # Not sure how to test KPSE variables... # TEXMFMAIN CHKTEX_CONFIG echo ">>> OK!" # Command line options echo "Checking command line RC settings..." (${builddir}/chktex -d 4 -STabSize=7 &1 \ | grep -A1 TabSize | grep -E '\t7$' >/dev/null) \ || (echo Setting TabSize from command line failed; exit 1) echo ">>> OK!" chktex-1.7.9/tests/sub1/000755 000767 000024 00000000000 14613043276 015652 5ustar00iandrusstaff000000 000000 chktex-1.7.9/tests/main.tex000644 000767 000024 00000000261 14613043276 016445 0ustar00iandrusstaff000000 000000 \documentclass{article} %% main.tex \begin{document} \input{sub1/file.tex} \input{sub1/subsub/subsubfile.tex} \input{sub2/file1.tex} \input{sub2/file2.tex} \end{document} chktex-1.7.9/tests/sub2/000755 000767 000024 00000000000 14613043276 015653 5ustar00iandrusstaff000000 000000 chktex-1.7.9/tests/main.expected000644 000767 000024 00000001165 14613043276 017452 0ustar00iandrusstaff000000 000000 Message 22 in main.tex: Comment displayed. %% main.tex ^ Message 22 in sub1/file.tex: Comment displayed. %% comment1 ^ Message 22 in sub1/subsub/subsubfile.tex: Comment displayed. %% subsubcomment ^ Message 22 in sub1/file.tex: Comment displayed. %% comment2 ^ Message 22 in sub1/subsub/subsubfile.tex: Comment displayed. %% subsubcomment ^ Message 22 in sub2/file1.tex: Comment displayed. %% comment 2.1 ^ Message 22 in sub2/file2.tex: Comment displayed. %% comment 2.2 ^ Message 22 in sub2/file1.tex: Comment displayed. %% comment 2.1 cont. ^ Message 22 in sub2/file2.tex: Comment displayed. %% comment 2.2 ^ chktex-1.7.9/tests/sub2/file2.tex000644 000767 000024 00000000033 14613043276 017372 0ustar00iandrusstaff000000 000000 %% comment 2.2 subfile 2.2 chktex-1.7.9/tests/sub2/file1.tex000644 000767 000024 00000000132 14613043276 017371 0ustar00iandrusstaff000000 000000 subfile 2.1 %% comment 2.1 \input{sub2/file2.tex} %% comment 2.1 cont. more subfile 2.1 chktex-1.7.9/tests/sub1/file.tex000644 000767 000024 00000000113 14613043276 017306 0ustar00iandrusstaff000000 000000 file1 %% comment1 \input{sub1/subsub/subsubfile} %% comment2 more file1 chktex-1.7.9/tests/sub1/subsub/000755 000767 000024 00000000000 14613043276 017155 5ustar00iandrusstaff000000 000000 chktex-1.7.9/tests/sub1/subsub/subsubfile.tex000644 000767 000024 00000000034 14613043276 022037 0ustar00iandrusstaff000000 000000 %% subsubcomment subsubfile chktex-1.7.9/input/file000644 000767 000024 00000000463 14613043276 015642 0ustar00iandrusstaff000000 000000 % -*- TeX -*- % chktex-file 22 % This file tests that file suppressions are only valid in the current file. % It also ensures that git will create the input/ % directory. That ensures that the \input input in Test.tex is able % to distinguish between directories and regular files. % This was bug #56520.