chktex-1.7.6/000755 000765 000024 00000000000 12764710126 013631 5ustar00iandrusstaff000000 000000 chktex-1.7.6/aclocal.m4000644 000765 000024 00000001360 12764710125 015470 0ustar00iandrusstaff000000 000000 # generated automatically by aclocal 1.15 -*- Autoconf -*- # Copyright (C) 1996-2014 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_include([m4/ax_cflags_strict_prototypes.m4]) m4_include([m4/vl_prog_cc_warnings.m4]) chktex-1.7.6/autogen.sh000755 000765 000024 00000002146 11037342600 015623 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.6/chktex.1000644 000765 000024 00000006122 11754541013 015175 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.6/ChkTeX.c000644 000765 000024 00000070755 12654037254 015143 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 }, InputStack = { 0L}, EnvStack = { 0L}; /************************************************************************/ const char BrOrder[NUMBRACKETS + 1] = "()[]{}"; unsigned long Brackets[NUMBRACKETS]; /************************************************************************/ /* * Have to do things this way, to ease some checking throughout the * program. */ NEWBUF(TmpBuffer, BUFSIZ); NEWBUF(ReadBuffer, BUFSIZ); static const char *Banner = "ChkTeX v" PACKAGE_VERSION " - Copyright 1995-96 Jens T. Berger Thielemann.\n" #ifdef __OS2__ "OS/2 port generated with emx compiler, by Wolfgang Fritsch, \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. Give it a number.\n" " -r --reset : Reset settings to default.\n" "\n" "Muting warning messages:\n" "~~~~~~~~~~~~~~~~~~~~~~~~\n" " -w --warnon : Makes msg # given a warning and turns it on.\n" " -e --erroron : Makes msg # given an error and turns it on.\n" " -m --msgon : Makes msg # given a message and turns it on.\n" " -n --nowarn : Mutes msg # given.\n" " -L --nolinesupp: Disables per-line suppressions.\n" "\n" "Output control flags:\n" "~~~~~~~~~~~~~~~~~~~~~\n" " -v --verbosity : How errors are displayed.\n" " Default 1, 0=Less, 2=Fancy, 3=lacheck.\n" " -V --pipeverb : How errors are displayed when stdout != tty.\n" " Defaults to the same as -v.\n" " -s --splitchar : String used to split fields when doing -v0\n" " -o --output : Redirect error report to a file.\n" " -q --quiet : Shuts up about version information.\n" " -p --pseudoname: Input file-name when reporting.\n" " -f --format : Format to use for output\n" "\n" "Boolean switches (1 -> enables / 0 -> disables):\n" "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" " -b --backup : Backup output file.\n" " -x --wipeverb : Ignore contents of `\\verb' commands.\n" " -g --globalrc : Read global .chktexrc file.\n" " -I --inputfiles: Execute \\input statements.\n" " -H --headererr : Show errors found in front of \\begin{document}\n" "\n" "Miscellaneous switches:\n" "~~~~~~~~~~~~~~~~~~~~~~~\n" " -W --version : Version information\n" "\n" "----------------------------------------------------------------------\n" "If no LaTeX files are specified on the command line, we will read from\n" "stdin. For explanation of warning/error messages, please consult the\n" "main documentation ChkTeX.dvi, ChkTeX.ps or ChkTeX.pdf.\n"; /* * Options we will set. * */ enum Quote Quote; char VerbNormal[] = "%k %n in %f line %l: %m\n" "%r%s%t\n" "%u\n"; #define DEF(type, name, value) type name = value OPTION_DEFAULTS; STATE_VARS; #undef DEF FILE *OutputFile = NULL; char *PrgName; int StdInTTY, StdOutTTY; /* * End of config params. */ static int ParseArgs(int argc, char **argv); static void ShowIntStatus(void); static int OpenOut(void); static int ShiftArg(char **Argument); /* * Duplicates all arguments, and appends an asterix to each of them. */ static void AddStars(struct WordList *wl) { unsigned long Count, CmdLen; char *Data; FORWL(Count, *wl) { Data = wl->Stack.Data[Count]; CmdLen = strlen(Data); if (Data[CmdLen - 1] != '*') { strcpy(TmpBuffer, Data); strcat(TmpBuffer, "*"); InsertWord(TmpBuffer, wl); } } } /* * Sets up all the lists. * */ static void SetupLists(void) { unsigned long i; AddStars(&VerbEnvir); AddStars(&MathEnvir); MakeLower(&UserWarnCase); ListRep(&WipeArg, ':', 0); ListRep(&NoCharNext, ':', 0); #define ThisItem ((char *) AbbrevCase.Stack.Data[i]) FORWL(i, AbbrevCase) { if (isalpha((unsigned char)ThisItem[0])) { ThisItem[0] = toupper((unsigned char)ThisItem[0]); InsertWord(ThisItem, &Abbrev); ThisItem[0] = tolower((unsigned char)ThisItem[0]); } InsertWord(ThisItem, &Abbrev); } } #define NOCOMMON(a,b) NoCommon(&a,#a,&b,#b) /* * Checks that two lists don't have any common element. */ static void NoCommon(struct WordList *a, const char *aName, struct WordList *b, const char *bName) { unsigned long i; FORWL(i, *a) { if (HasWord((char *) a->Stack.Data[i], b)) PrintPrgErr(pmNoCommon, a->Stack.Data[i], aName, bName); } } /* * Expands the tabs in a string to regular intervals sized * TSize. */ static void ExpandTabs(char *From, char *To, long TSize, long MaxDiff) { char *Next; char *Orig; unsigned long Diff; static short HasExpandedTooLong = 0; Next = From; Orig = To; while ((Next = strchr(From, '\t'))) { if ((Diff = Next - From)) { strncpy(To, From, Diff); To += Diff; Diff = TSize - ((To - Orig) % TSize); } else Diff = TSize; /* Make sure we don't expand this buffer out of the memory we * have allocated for it. */ if ( Diff > MaxDiff+1 ) { Diff = MaxDiff+1; if ( !HasExpandedTooLong ) { PrintPrgErr(pmTabExpands, BUFSIZ); } HasExpandedTooLong = 1; } MaxDiff -= (Diff-1); memset(To, ' ', Diff); To += Diff; From = ++Next; } strcpy(To, From); } int main(int argc, char **argv) { int retval = EXIT_FAILURE, ret, CurArg; unsigned long Count; int StdInUse = FALSE; long Tab = 8; #ifdef __LOCALIZED InitStrings(); #endif OutputFile = stdout; #ifdef KPATHSEA kpse_set_program_name(argv[0], "chktex"); PrgName = kpse_program_name; #ifdef WIN32 setmode(fileno(stdout), _O_BINARY); #endif #else PrgName = argv[0]; #endif #undef KEY #undef LCASE #undef LIST #undef LNEMPTY #define KEY(a, def) #define LCASE(a) #define LIST(a) #define LNEMPTY(a) InsertWord("", &a); RESOURCE_INFO while (SetupVars()) ReadRC(ConfigFile); if (CmdLine.Stack.Used) { ParseArgs(CmdLine.Stack.Used, (char **) CmdLine.Stack.Data); CmdLine.Stack.Used = 1L; } if ((CurArg = ParseArgs((unsigned long) argc, argv))) { retval = EXIT_SUCCESS; if (CmdLine.Stack.Used) { ParseArgs(CmdLine.Stack.Used, (char **) CmdLine.Stack.Data); CmdLine.Stack.Used = 1L; } if (!Quiet || LicenseOnly) fprintf(stderr, "%s", Banner); if (CurArg == argc) UsingStdIn = TRUE; #if defined(HAVE_FILENO) && defined(HAVE_ISATTY) StdInTTY = isatty(fileno(stdin)); StdOutTTY = isatty(fileno(stdout)); #else StdInTTY = StdOutTTY = TRUE; #endif SetupTerm(); if ((UsingStdIn && StdInTTY && !Quiet) || LicenseOnly) { fprintf(stderr, "%s", BigBanner); } if (!StdOutTTY && PipeOutputFormat) OutputFormat = PipeOutputFormat; if (LicenseOnly) { fprintf(stderr, "%s", Distrib); } else { SetupLists(); if (QuoteStyle) { if (!strcasecmp(QuoteStyle, "LOGICAL")) Quote = quLogic; else if (!strcasecmp(QuoteStyle, "TRADITIONAL")) Quote = quTrad; else { PrintPrgErr(pmQuoteStyle, QuoteStyle); Quote = quTrad; } } if (DebugLevel) ShowIntStatus(); NOCOMMON(Italic, NonItalic); NOCOMMON(Italic, ItalCmd); NOCOMMON(LowDots, CenterDots); if (TabSize && isdigit((unsigned char)*TabSize)) Tab = strtol(TabSize, NULL, 10); if (OpenOut()) { for (;;) { for (Count = 0; Count < NUMBRACKETS; Count++) Brackets[Count] = 0L; #define DEF(type, name, value) name = value STATE_VARS; #undef DEF if (UsingStdIn) { if (StdInUse) break; else { StdInUse = TRUE; PushFile("stdin", stdin, &InputStack); } } else { if (CurArg <= argc) { const char *filename = NULL; if (CurArg < argc) filename = argv[CurArg++]; if (!PushFileName(filename, &InputStack)) break; } } if (StkTop(&InputStack) && OutputFile) { while (!ferror(OutputFile) && StkTop(&InputStack) && !ferror(CurStkFile(&InputStack)) && FGetsStk(ReadBuffer, BUFSIZ - 1, &InputStack)) { /* Make all spaces ordinary spaces */ strrep(ReadBuffer, '\n', ' '); strrep(ReadBuffer, '\r', ' '); ExpandTabs(ReadBuffer, TmpBuffer, Tab, BUFSIZ - 1 - strlen(ReadBuffer) ); strcpy(ReadBuffer, TmpBuffer); strcat(ReadBuffer, " "); ret = FindErr(ReadBuffer, CurStkLine(&InputStack)); if ( ret != EXIT_SUCCESS ) { retval = ret; } } PrintStatus(CurStkLine(&InputStack)); } } } } } return retval; } /* * Opens the output file handle & possibly renames */ static int OpenOut(void) { int Success = TRUE; if (*OutputName) { if (BackupOut && fexists(OutputName)) { strcpy(TmpBuffer, OutputName); AddAppendix(TmpBuffer, BAKAPPENDIX); if (fexists(TmpBuffer)) remove(TmpBuffer); if (!rename(OutputName, TmpBuffer)) PrintPrgErr(pmRename, OutputName, TmpBuffer); else { PrintPrgErr(pmRenameErr, OutputName, TmpBuffer); Success = FALSE; } } if (Success) { #ifdef KPATHSEA if (!(OutputFile = fopen(OutputName, "wb"))) #else if (!(OutputFile = fopen(OutputName, "w"))) #endif { PrintPrgErr(pmOutOpen); Success = FALSE; } } } else OutputFile = stdout; return (Success); } #ifndef STRIP_DEBUG static void ShowWL(const char *Name, const struct WordList *wl) { unsigned long i, j, percent; fprintf(stderr, "Name: %12s", Name); if (DebugLevel & FLG_DbgListInfo) { fprintf(stderr, ", MaxLen: %3ld, Entries: %3ld, ", wl->MaxLen, wl->Stack.Used); if (wl->Hash.Index && wl->Stack.Used) { for (i = j = 0; i < HASH_SIZE; i++) { if (wl->Hash.Index[i]) j++; } percent = (j * 10000) / wl->Stack.Used; fprintf(stderr, "Hash usage: %3ld.%02ld%%", percent / 100, percent % 100); } else fprintf(stderr, "No hash table."); } fputc('\n', stderr); if (DebugLevel & FLG_DbgListCont) { FORWL(i, *wl) fprintf(stderr, "\t%s\n", (char *) wl->Stack.Data[i]); } } #endif #define BOOLDISP(var) ((var)? OnText : OffText) #define SHOWSTAT(text, arg) fprintf(stderr, "\t" text ": %s\n", arg) #define BOOLSTAT(name, var) SHOWSTAT(name, BOOLDISP(var)) #define SHOWSTR(text, arg) fprintf(stderr, "%s:\n\t%s\n", text, arg); /* * Prints some of the internal flags; mainly for debugging purposes */ static void ShowIntStatus(void) { #ifndef STRIP_DEBUG unsigned long Cnt; const char *String; const char *iuStr = ""; if (DebugLevel & FLG_DbgMsgs) { fprintf(stderr, "There are %d warnings/error messages available:\n", emMaxFault - emMinFault - 1); for (Cnt = emMinFault + 1; Cnt < emMaxFault; Cnt++) { switch (LaTeXMsgs[Cnt].Type) { case etWarn: String = "Warning"; break; case etErr: String = "Error"; break; case etMsg: String = "Message"; break; default: String = ""; break; } switch (LaTeXMsgs[Cnt].InUse) { case iuOK: iuStr = "In use"; break; case iuNotUser: iuStr = "User muted"; break; case iuNotSys: iuStr = "System muted"; break; } fprintf(stderr, "Number: %2ld, Type: %s, Status: %s\n" "\tText: %s\n\n", Cnt, String, iuStr, LaTeXMsgs[Cnt].Message); } } #undef KEY #undef LCASE #undef LNEMPTY #undef LIST #define LNEMPTY LIST #define LIST(a) ShowWL(#a, &a); #define LCASE(a) LIST(a); LIST(a ## Case); #define KEY(a,def) SHOWSTR(#a, a); if (DebugLevel & (FLG_DbgListInfo | FLG_DbgListCont)) { RESOURCE_INFO } if (DebugLevel & FLG_DbgOtherInfo) { SHOWSTR("Outputformat", OutputFormat); fprintf(stderr, "Current flags include:\n"); BOOLSTAT("Read global resource", GlobalRC); BOOLSTAT("Wipe verbose commands", WipeVerb); BOOLSTAT("Backup outfile", BackupOut); BOOLSTAT("Quiet mode", Quiet); BOOLSTAT("Show license", LicenseOnly); BOOLSTAT("Use stdin", UsingStdIn); BOOLSTAT("\\input files", InputFiles); BOOLSTAT("Output header errors", HeadErrOut); BOOLSTAT("No line suppressions", NoLineSupp); } #endif } /* * Resets all stacks. * */ #undef KEY #undef LCASE #undef LNEMPTY #undef LIST #define LNEMPTY LIST #define LIST(a) ClearWord(&a); #define LCASE(a) LIST(a); LIST(a ## Case); #define KEY(a,def) a = def; static void ResetStacks(void) { RESOURCE_INFO } /* * Resets all flags (not wordlists) to their default values. Sets * Outputfile to stdout. * */ static void ResetSettings(void) { #define DEF(type, name, value) name = value OPTION_DEFAULTS; #undef DEF if (OutputFile != stdout) { fclose(OutputFile); OutputFile = stdout; } } /* * Reads a numerical argument from the argument. Supports concatenation * of arguments (main purpose) */ static int ParseNumArg(long *Dest, /* Where to put the value */ long Default, /* Value to put in if no in argue */ char **Argument) /* optarg or similar */ { if (Argument && *Argument && isdigit((unsigned char)**Argument)) *Dest = strtol(*Argument, Argument, 10); else *Dest = Default; return (ShiftArg(Argument)); } /* * Same as above; however, will toggle the boolean if user doesn't * supply value */ static int ParseBoolArg(int *Dest, /* Boolean value */ char **Argument) /* optarg or similar */ { long D = *Dest ? 1L : 0L; int Retval; Retval = ParseNumArg(&D, *Dest ? 0L : 1L, Argument); *Dest = D ? TRUE : FALSE; return (Retval); } /* * Returns the first character in the string passed, updates the * string pointer, if the string is non-empty. * * 0 if the string is empty. */ static int ShiftArg(char **Argument) /* optarg or similar */ { if (Argument && *Argument && **Argument) return (*((char *) (*Argument)++)); else return 0; } /* * Parses an argv similar array. */ static int ParseArgs(int argc, char **argv) { /* Needed for option parsing. */ static const struct option long_options[] = { {"help", no_argument, 0L, 'h'}, {"localrc", required_argument, 0L, 'l'}, {"output", required_argument, 0L, 'o'}, {"warnon", required_argument, 0L, 'w'}, {"erroron", required_argument, 0L, 'e'}, {"msgon", required_argument, 0L, 'm'}, {"nowarn", required_argument, 0L, 'n'}, {"nolinesupp", no_argument, 0L, 'L'}, {"verbosity", optional_argument, 0L, 'v'}, {"pipeverb", optional_argument, 0L, 'V'}, {"debug", required_argument, 0L, 'd'}, {"reset", no_argument, 0L, 'r'}, {"quiet", no_argument, 0L, 'q'}, {"license", no_argument, 0L, 'i'}, {"splitchar", required_argument, 0L, 's'}, {"format", required_argument, 0L, 'f'}, {"pseudoname", required_argument, 0L, 'p'}, {"inputfiles", optional_argument, 0L, 'I'}, {"backup", optional_argument, 0L, 'b'}, {"globalrc", optional_argument, 0L, 'g'}, {"wipeverb", optional_argument, 0L, 'x'}, {"tictoc", optional_argument, 0L, 't'}, {"headererr", optional_argument, 0L, 'H'}, {"version", no_argument, 0L, 'W'}, {0L, 0L, 0L, 0L} }; int option_index = 0L, c, i, nextc, ErrType; int Retval = FALSE, InUse; int Success, Foo; long Err, Verb = 1, PipeVerb = 1; enum { aeNoErr = 0, aeArg, /* missing/bad required argument */ aeOpt, /* unknown option returned */ aeHelp, /* just a call for help */ aeMem /* no memory */ } ArgErr = aeNoErr; optind = 0; while (!ArgErr && ((c = getopt_long((int) argc, argv, "b::d:e:f:g::hH::I::il:m:n:Lo:p:qrs:t::v::V::w:Wx::", long_options, &option_index)) != EOF)) { while (c) { nextc = 0; switch (c) { case 's': if (!(Delimit = strdup(optarg))) { PrintPrgErr(pmStrDupErr); ArgErr = aeMem; } break; case 'p': if (!(PseudoInName = strdup(optarg))) { PrintPrgErr(pmStrDupErr); ArgErr = aeMem; } break; case 'd': #ifdef STRIP_DEBUG PrintPrgErr(pmNoDebugFlag); #else nextc = ParseNumArg(&DebugLevel, 0xffff, &optarg); #endif break; case 'i': LicenseOnly = TRUE; nextc = ShiftArg(&optarg); break; case 'L': NoLineSupp = TRUE; nextc = ShiftArg(&optarg); break; case 'q': Quiet = TRUE; nextc = ShiftArg(&optarg); break; LOOP(warntype, case 'w': ErrType = etWarn; InUse = iuOK; LAST(warntype); case 'e': ErrType = etErr; InUse = iuOK; LAST(warntype); case 'm': ErrType = etMsg; InUse = iuOK; LAST(warntype); case 'n': ErrType = etMsg; InUse = iuNotUser; LAST(warntype); ) if (isdigit((unsigned char)*optarg)) { nextc = ParseNumArg(&Err, -1, &optarg); if (betw(emMinFault, Err, emMaxFault)) { LaTeXMsgs[Err].Type = ErrType; LaTeXMsgs[Err].InUse = InUse; } else { ArgErr = aeOpt; PrintPrgErr(pmWarnNumErr); } } else if (!strcasecmp(optarg, "all")) { for (i = emMinFault + 1; i < emMaxFault; i++) { LaTeXMsgs[i].Type = ErrType; LaTeXMsgs[i].InUse = InUse; } } else { ArgErr = aeOpt; PrintPrgErr(pmWarnNumErr); } break; case 'g': nextc = ParseBoolArg(&GlobalRC, &optarg); if (!GlobalRC) { ResetStacks(); } break; case 'r': ResetSettings(); nextc = ShiftArg(&optarg); break; case 'l': if (optarg) ReadRC(optarg); break; case 'f': if (!(OutputFormat = strdup(optarg))) { PrintPrgErr(pmStrDupErr); ArgErr = aeMem; } break; case 'v': nextc = ParseNumArg(&Verb, 2, &optarg); if (Verb < (long) OutFormat.Stack.Used) OutputFormat = strdup(OutFormat.Stack.Data[Verb]); else { PrintPrgErr(pmVerbLevErr); ArgErr = aeArg; } break; case 'V': nextc = ParseNumArg(&PipeVerb, 1, &optarg); if (PipeVerb < (long) OutFormat.Stack.Used) PipeOutputFormat = strdup(OutFormat.Stack.Data[PipeVerb]); else { PrintPrgErr(pmVerbLevErr); ArgErr = aeArg; } break; case 'o': if (optarg) { if (*OutputName) { PrintPrgErr(pmOutTwice); ArgErr = aeOpt; } else { if (!(OutputName = strdup(optarg))) { PrintPrgErr(pmStrDupErr); ArgErr = aeMem; } } } break; case 't': nextc = ParseBoolArg(&Foo, &optarg); break; case 'x': nextc = ParseBoolArg(&WipeVerb, &optarg); break; case 'b': nextc = ParseBoolArg(&BackupOut, &optarg); break; case 'I': nextc = ParseBoolArg(&InputFiles, &optarg); break; case 'H': nextc = ParseBoolArg(&HeadErrOut, &optarg); break; case 'W': printf("%s", Banner); exit(EXIT_SUCCESS); case '?': default: fputs(Banner, stderr); fputs(HowHelp, stderr); exit(EXIT_FAILURE); break; case 'h': ArgErr = aeHelp; break; } c = nextc; } } if ((argc > optind) && !strcmp(argv[optind], "?")) ArgErr = aeHelp; if (ArgErr) { fputs(Banner, stderr); fputs(BigBanner, stderr); fputs(HelpText, stderr); Success = FALSE; } else Success = TRUE; if (Success) Retval = optind; return (Retval); } /* * Outputs a program error. */ void PrintPrgErr(enum PrgErrNum Error, ...) { const char *Type; va_list MsgArgs; if (betw(pmMinFault, Error, pmMaxFault)) { switch (PrgMsgs[Error].Type) { case etWarn: Type = "WARNING"; break; case etMsg: Type = "NOTE"; break; default: case etErr: Type = "ERROR"; break; } fprintf(stderr, "%s: %s -- ", PrgName, Type); va_start(MsgArgs, Error); vfprintf(stderr, PrgMsgs[Error].Message, MsgArgs); va_end(MsgArgs); fputc('\n', stderr); if (PrgMsgs[Error].Type == etErr) exit(EXIT_FAILURE); } } void ErrPrintf(const char *fmt, ...) { va_list MsgArgs; va_start(MsgArgs, fmt); vfprintf(stderr, fmt, MsgArgs); va_end(MsgArgs); } chktex-1.7.6/ChkTeX.h000644 000765 000024 00000025107 12764705172 015142 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.") #undef MSG #define MSG(num, type, inuse, ctxt, text) num, enum PrgErrNum { PRGMSGS pmMaxFault }; #undef MSG extern struct ErrMsg PrgMsgs[pmMaxFault + 1]; struct ErrInfo { char *Data; char *LineBuf; char *File; unsigned long Line, Column, ErrLen; enum { efNone = 0x00, efNoItal = 0x01, efItal = 0x02, efNoMath = 0x04, efMath = 0x08 } Flags; }; extern char *ReadBuffer; extern char *CmdBuffer; extern char *TmpBuffer; extern const char BrOrder[NUMBRACKETS + 1]; extern unsigned long Brackets[NUMBRACKETS]; extern FILE *OutputFile, *InputFile; /* We include semicolons on all but the last so that we can include a * semicolon where it's called. This helps with indentation at the * calling location. It also means that DEF must never have a * semicolon. The reason for the care is that isolated semicolons * have been known to break some compilers. */ /* See also RESOURCE_INFO where the same trick doesn't work, and we * cannot include semicolons at the calling site, regardless of * indentation concerns. */ #define OPTION_DEFAULTS \ DEF(int, GlobalRC, TRUE); \ DEF(int, WipeVerb, TRUE); \ DEF(int, BackupOut, TRUE); \ DEF(int, Quiet, FALSE); \ DEF(int, LicenseOnly, FALSE); \ DEF(int, UsingStdIn, FALSE); \ DEF(int, InputFiles, TRUE); \ DEF(int, HeadErrOut, TRUE); \ DEF(const char *, OutputName, ""); \ DEF(const char *, PseudoInName, NULL); \ DEF(char *, OutputFormat, VerbNormal); \ DEF(char *, PipeOutputFormat, NULL); \ DEF(const char *, Delimit, ":"); \ DEF(long, DebugLevel, 0); \ DEF(int, NoLineSupp, FALSE) #define STATE_VARS \ DEF(enum ItState, ItState, itOff); /* Are we doing italics? */ \ DEF(int, AtLetter, FALSE); /* Whether `@' is a letter or not. */ \ DEF(int, InHeader, TRUE); /* Whether we're in the header */ \ DEF(int, VerbMode, FALSE); /* Whether we're in complete ignore-mode */ \ DEF(long, MathMode, 0); /* Whether we're in math mode or not */ \ DEF(const char *, VerbStr, ""); /* String we'll terminate verbmode upon */ \ DEF(unsigned long, ErrPrint, 0); /* # errors printed */ \ DEF(unsigned long, WarnPrint, 0); /* # warnings printed */ \ DEF(unsigned long, UserSupp, 0); /* # user suppressed warnings */ \ DEF(unsigned long, LineSupp, 0); /* # warnings suppressed on a single line */ \ DEF(uint64_t, FileSuppressions, 0); /* # warnings suppressed in a file */ \ DEF(uint64_t, UserFileSuppressions, 0) /* # User warnings suppressed in a file */ #define DEF(type, name, value) extern type name OPTION_DEFAULTS; STATE_VARS; #undef DEF extern struct Stack CharStack, InputStack, EnvStack; enum Quote { quLogic, quTrad }; extern enum Quote Quote; extern int StdInTTY, StdOutTTY, UsingStdIn; int main(int argc, char **argv); void PrintPrgErr(enum PrgErrNum, ...); void ErrPrintf(const char *fmt, ...); extern char *PrgName; #endif /* CHKTEX_H */ chktex-1.7.6/ChkTeX.tex.in000644 000765 000024 00000220406 12654306654 016117 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]} \newenvironment{errdesc}[1]{\noindent\fmted{#1}\begin{quote}}{\end{quote}% \pagebreak[3]} \newenvironment{html}{\comment}{\endcomment} \newenvironment{rawhtml}{\comment}{\endcomment} \makeatletter \@namedef{errdesc*}#1{\begin{errdesc}{\textit{#1}}} \@namedef{enderrdesc*}{\end{errdesc}} \makeatother \newenvironment{errexam} { \vskip 0pt plus 5pt \begin{center} } {\end{center}} \columnseprule 0.1pt %!\newcommand{\BS}{\verb@\@} %!\newcommand{\chktex}{ChkTeX} %!\newcommand{\slash}{/} %endlatex \title{\chktex\ v@PACKAGE_VERSION@} \author{Jens~T. Berger~Thielemann} \date{\today} \begin{document} \maketitle %latex \newcommand{\BS}{\char`\\} %endlatex \section{Introduction} This program has been written in frustration because some constructs in \LaTeX\ are sometimes non-intuitive, and easy to forget. It is \emph{not} a replacement for the built-in checker in \LaTeX\@; however it catches some typographic errors \LaTeX\ oversees. In other words, it is Lint for \LaTeX. Filters are also provided for checking the \LaTeX\ parts of CWEB documents. It is written in ANSI C and compiles silently under GCC using \Cmd{-Wall -ansi -pedantic} and almost all warning flags. This means that you can compile \& use the program on your favorite machine. Full source included. The program also supports output formats suitable for further processing by editors or other programs, making errors easy to cycle through. For example, recent versions of AUC\TeX\ (the Emacs mode) interface beautifully with \chktex. The program itself does not have any machine requirements; However compiling for other platforms has not been done for a long time now so the code has been removed. If interest rises it can be resurrected. \section{Features} \chktex\ begins to get quite a few bells \& whistles now. However, you should be aware of that in most cases, all this is transparent to the user. As you will see, \chktex\ offers the ability to adapt to many environments and configurations. \begin{itemize} \item Supports over 40 warnings. Warnings include: %latex \begin{multicols}{2} \begin{flushleft} %endlatex \begin{itemize} \item Commands terminated with space. Ignores \Cmd{\BS{}tt}, etc. \item Space in front of references instead of \Cmd{\~{}}. \item Forgetting to group parenthesis characters when sub-\slash{}super\-scripting. \item Italic correction (\Cmd{\BS/}) mistakes (double, missing, unnecessary). \item Parenthesis and environment matching. \item Ellipsis detection; also checks whether to use \Cmd{\BS{}dots}, \Cmd{\BS{}cdots} or \Cmd{\BS{}ldots}. \item Enforcement of normal space after abbreviation. Detects most abbreviations automagically. \item Enforcement of end-of-sentence space when the last sentence ended with capital letter. \item Math-mode on/off detection. \item Quote checking, both wrong types (\Cmd{"}) and wrong direction. \item Recommends splitting three quotes in a row. \item Searching for user patterns. \item Displays comments. \item Space in front of \Cmd{\BS{}label} and similar commands. \item Use of \Cmd{x} instead of \Cmd{\$\BS{}times\$} between numbers. \item Multiple spaces in input which will be rendered as one space (or multiple spaces, where that is undesirable). \item Warns about text which may be ignored. \item Mathematical operators typeset as variables. \item No space in front of/after parenthesis. \item Demands a consistent quote style. \item Punctuation inside inner math mode/outside display math mode. \item Use of \TeX\ primitives where \LaTeX\ equivalents are available. \item Space in front of footnotes. \item Bogus characters following commands. \item Ability to suppress warnings on a single line. \end{itemize} %latex \end{flushleft} \end{multicols} %endlatex \item Fully customizable. Intelligent resource format makes it possible to make \chktex\ respect your \LaTeX\ setup. Even command-line options may be specified globally in the \rsrc\ file. \item Supports \Cmd{\BS{}input} command; both \TeX\ and \LaTeX\ version. Actually includes the files. \Cmd{TEXINPUTS}-equivalent search path. \item Intelligent warning/error handling. The user may promote/mute warnings to suit his preferences. You may also mute warnings in the header of a file; thus killing much unwanted garbage. \item Scripts included for checking CWEB files written in \LaTeX. (Requires perl v5). \item Supports both \LaTeX\ 2.09 and \LaTeXe{}. \item Flexible output handling. Has some predefined formats and lets the user specify his own format. Uses a \Cmd{printf()} similar syntax. \Cmd{lacheck} compatible mode included for interfacing with systems which only support lacheck. \item Written in ANSI C\@. \Cmd{configure} script included for easy setup and installation on UNIX systems. \end{itemize} Still, it is important to realize that the output from \chktex\ is only intended as a \emph{guide} to fixing faults. However, it is by no means always correct. This means that correct \LaTeX\ code may produce errors in \chktex, and vice versa: Incorrect \LaTeX\ code may pass silently through. \section{Legal stuff} \chktex{}, documentation, installations scripts, CWEB filters and other materials provided are copyright \copyright\ 1995--96 Jens~T. Berger~Thielemann, unless explicitly stated otherwise. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY\@; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE\@. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to: \begin{quote} The Free Software Foundation, Inc. \\ 51 Franklin Street \\ Fifth Floor \\ Boston \\ MA 02110-1301 \\ USA \end{quote} \section{Availability} This program is on CTAN\@; thus it can be found at any mirrors of those. It is also part of TeX Live 2011. \section{Installation} A few words on installation on various platforms: \begin{description} \item[UNIX:] Type \Cmd{configure}, \Cmd{make} and finally \Cmd{make~install}. To make sure everything proceeded correctly, type \Cmd{make~check}. If you don't have superuser privileges and thus access to the default system areas, you should type \Cmd{configure~-{}-help} to help you set up correct paths. If you haven't installed any software like this before, that is distributed in source form, here are some guidelines to help you install it locally at your account. Please note that a mail to the system administrator may be less work for you. We assume that you have put the archive (\Cmd{chktex.tar.gz}) in a subdir of yours, with path \Cmd{\~{}/tmp}. We further assume that your shell is \Cmd{csh} or \Cmd{tcsh}. Do the following: \begin{enumerate} \item First of all, unpack the archive contents. \begin{verbatim} > cd ~/tmp > gunzip chktex.tar.gz > tar xf chktex.tar \end{verbatim} \item Now, we can configure the program. There are some configuration options you should know about: \begin{description} \item[\Cmd{-{}-enable-pcre}:] Allows using PCRE (perl compatible regular expressions) for use defined warnings. The default is to use PCRE if it is installed on your system as determined by \Cmd{pcre-config}. You can use \Cmd{-{}-disable-pcre} if you plan to distribute this for systems in which you cannot ensure PCRE will be installed. User defined regular expressions are defined using \texttt{UserWarnRegex} in the \rsrc\ file. See warning~44 for more information. \item[\Cmd{-{}-enable-lacheck-replace}] This enables a quick hack for using \chktex\ instead of lacheck. This is done by installing a stub script which ``overrides'' the original lacheck executable. In this way, tools which support lacheck can be easily made to support chktex instead. \item[\Cmd{-{}-enable-debug-info}] \chktex\ has an ability to spit out various diagnostic messages using the \Cmd{-d} flag. This behaviour is on by default. By adding the flag \Cmd{-{}-disable-debug-info} to the commandline, this will not be compiled in. This may be useful if you're running short of disk space (the time savings are neglible). \end{description} If you are installing the program on your local account, use the following command: \begin{verbatim} > configure --prefix ~/ \end{verbatim} Add eventual extra flags as specified above. This command will generate a significant amount of output, this can usually be ignored. \item Finally, we can just build the program and install it. \begin{verbatim} > make > make install \end{verbatim} \item Finished! The program is now installed and ready to use. You may now tell other people to put your bindir in their path in order to benefit from your work. All that remains is to make the shell aware of your installation. \begin{verbatim} > rehash \end{verbatim} To make the remaining parts of your system aware of this, you'll have to log out and re-log in, I'm afraid. However, you should delay this until you've completed this installation procedure. \item If you wish to make sure that everything is OK (you ought to), you may now ask \chktex\ to do a self-test: \begin{verbatim} > make check \end{verbatim} \end{enumerate} \item[Other platforms:] First of all, you have to copy the \Cmd{config.h.in} file to a file named \Cmd{config.h}. Then, edit it to reflect your system. Do the same with \Cmd{OpSys.h} (this file has been reduced significantly). If you wish, you may define \Cmd{DATADIR} to the path you want the global resource file to be put. Now, I would suggest that you take a peak at the \Cmd{OpSys.c} file, and edit it appropiately, for more comfort. This should not be necessary, though, at least not the first time. Finally, you may now compile and link all \verb@.c@ files. Do not forget to define \Cmd{HAVE\_CONFIG\_H} to 1 (on the command-line, for instance). If the \Cmd{config.h} you wish to use has another name, define \Cmd{CONFIG\_H\_NAME} to that (in that case, don't define \Cmd{HAVE\_CONFIG\_H}). Put the directory path of the \rsrc\ file in a environment variable named \Cmd{CHKTEXRC}. The files \Cmd{deweb.in} and \Cmd{chkweb} should be moved to a directory in your path. These files may need further setup, as they haven't got the location of perl initialized. If your compiler/the compiled program complains (or crashes!), you may try the hints listed below. Please note that it only makes sense to try these hints if your compiler fails to produce a working program. \begin{enumerate} \item Increase the preprocessor buffers and line buffers. The \chktex{} sources define macros sized 3--4k (expanding to about the same), and passes arguments sized about 1k. \item Use the magic switch which lets us use large \Cmd{switch(\dots)\{\dots\}} statements; some of these statements have about 120 \Cmd{case} entries. \item The sources require that at least the first 12 of each identifier is significant. \end{enumerate} \end{description} \paragraph{Note:} You \emph{must} install the new \rsrc\ file; \chktex\ will fail to function otherwise! After doing this, you may enhance \chktex' behaviour by reading/editing the \rsrc\ file. %latex \section{Usage} \subsection{\chktex} \subsubsection{Synopsis} A UNIX-compliant template format follows: \newcommand{\Group}[1]{\mbox{[#1]}} \begin{tabularx}{.95\linewidth}{lY} \texttt{chktex} & \ttfamily \Group{-hiqrW} \Group{-v[0-\dots]} \Group{-l } \Group{-[wemn] <[1-42]|all>} \Group{-d[0-\ldots]} \Group{-p } \Group{-o } \Group{-[btxgI][0|1]} file1 file2 \dots \end{tabularx} \subsubsection{Options} These are the options \chktex\ currently accepts. Please note that single-lettered options requiring a numerical or no argument may be concatenated. E.g.\ saying \Cmd{-v0qb0w2} is the same as saying \Cmd{-v0~-q~-b0~-w2}, except for being less to type. Enough general talk; here's a rather detailed description of all options: \begin{description} \item[Misc.\ options:] General options which aren't related to some specific subpart of \chktex. \begin{description} \item[\texttt{-h [-{}-help]}] Gives you a command summary. \item[\texttt{-i [-{}-license]}] Shows distribution information. \item[\texttt{-l [-{}-localrc]}] Reads a resource-file formatted as the global resource-file \rsrc, in addition to the global resource-file. This option needs the name of the resource-file as a parameter. See also \texttt{-g}. \item[\texttt{-r [-{}-reset]}] This will reset all settings to their defaults. This may be useful if you use the \texttt{CMDLINE} directive in your \rsrc\ file, and wish to do something unusual. \item[\texttt{-d [-{}-debug]}] Needs a numeric argument; a bitmask telling what to output. The values below may be added in order to output multiple debugging info. \begin{tabularx}\linewidth{cX} \bf Value & \bf Dumps\ldots\\ 1 & All warnings available and their current status. \\ 2 & Statistics for all lists in the resource file. \\ 4 & The contents of all lists in the resource file. \\ 8 & Misc.\ other status information. \\ 16 & Run-time info (note that this isn't widely used). \\ \end{tabularx} The info is produced after all switches and resource files have been processed. It is possible to install versions of \chktex\ that ignore this flag; this means that it is not certain that this flag works. \item[\texttt{-W [-{}-version]}] Displays version information, and exits. \end{description} \item[Muting warning messages:] Controls whether and in what form error messages will appear. Usually they accept a specific warning number (e.g.\ \Cmd{-w2}), but you may also say \Cmd{all} (e.g.\ \Cmd{-wall}) which does the operation on \emph{all} warnings. \begin{description} \item[\texttt{-w [-{}-warnon]}] Makes the message number passed as parameter a warning and turns it on. \item[\texttt{-e [-{}-erroron]}] Makes the message number passed as parameter an error and turns it on. \item[\texttt{-m [-{}-msgon]}] Makes the message number passed as parameter a message and turns it on. Messages are not counted. \item[\texttt{-n [-{}-nowarn]}] Turns the warning/error number passed as a parameter off. \item[\texttt{-L [-{}-nolinesupp]}] Turns off suppression of messages on a per line basis. This is meant to be used to ensure that no new errors have crept into a document while editing. \end{description} \item[Output control flags:] Determines the appearance and destination of the error reports. \begin{description} \item[\texttt{-q [-{}-quiet]}] Shuts up about copyright information. \item[\texttt{-o [-{}-output]}] Normally, all errors are piped to \texttt{stdout}. Using this option with a parameter, errors will be sent to the named file instead. Only information relative to the \LaTeX\ file will be sent to that file. Memory problems and similar will as as always be sent to \texttt{stderr}. If a file with the name given already exists, it will be renamed to \Cmd{foobar.bak} (\Cmd{foobar.\$cl} under MS-DOS), \Cmd{foobar} being the name of the file. See also \Cmd{-b}. \item[\texttt{-v [-{}-verbosity]}] Specifies how much and how you wish the error reports to be displayed. This is specified in the \rsrc\ file; we'll list the default values below. If you wish, you may thus edit the \rsrc\ file to add or modify new formats. The default is mode 1 (that is, the \emph{second} entry in the \rsrc\ file), using \texttt{-v} without any parameter will give you mode 2. \begin{description} \item[0] Will show the information in a way that should be suitable for further parsing by \texttt{awk}, \texttt{sed} or similar. The format is as follows: \begin{verbatim} File:Line:Column:Warning number:Warning message \end{verbatim} The colons may be replaced with another string; use the \verb@-s@ switch for this. As the program does not output all errors in quite order, this output format is also suitable for piping through \Cmd{sort}. \item[1] Shows the information in a way which is more comprehensible for humans, but which still doesn't need anything but a glass tty. \item[2] Shows the information in a fancy way, using escape codes and stuff. It is the indeed most readable of all modes; however, it needs proper set up of the \Cmd{ChkTeX.h} at compilation time. UNIX boxes, however, will find the information automatically. \item[3] Shows the information suitable for parsing by Emacs; this is the same format as \texttt{lacheck} uses. More formally, it is the following: \begin{verbatim} "File", line Line: Warning message \end{verbatim} To utilize this, type \verb@M-x compile RET@. Delete whatever is written in the minibuffer, and type \verb@chktex -v3 texfile.tex@, and you should be able to browse through the error messages. Use \verb@C-x `@ to parse the messages. \item[4] More or less the same as \verb@-v3@, but also includes information on where the error actually was found. Takes somewhat longer time to parse, but much more informative in use. \end{description} \item[\texttt{-f [-{}-format]}] Specifies the format of the output. This is done using a format similar to \Cmd{printf()}, where we support the specifiers listed below. \smallskip \newcommand{\Pf}[1]{\texttt{\%#1} &} \begin{tabularx}{\linewidth}{cX} \bf Code & \bf Description \\ \Pf{b} String to print \textbf{b}etween fields (from \texttt{-s} option).\\ \Pf{c} \textbf{C}olumn position of error. \\ \Pf{d} Length of error (\textbf{d}igit). \\ \Pf{f} Current \textbf{f}ilename.\\ \Pf{i} Turn on \textbf{i}nverse printing mode.\\ \Pf{I} Turn off \textbf{i}nverse printing mode.\\ \Pf{k} \textbf{k}ind of error (warning, error, message).\\ \Pf{l} \textbf{l}ine number of error.\\ \Pf{m} Warning \textbf{m}essage.\\ \Pf{n} Warning \textbf{n}umber.\\ \Pf{u} An \textbf{u}nderlining line (like the one which appears when using \Cmd{-v1}).\\ \Pf{r} Part of line in front of error ($\mbox{`S'} - 1$).\\ \Pf{s} Part of line which contains error (\textbf{s}tring).\\ \Pf{t} Part of line after error ($\mbox{`S'} + 1$). \end{tabularx} \smallskip Other characters will be passed literally; thus you can say \Cmd{\%\%} to achieve a single percent sign in the output. Please note that we may introduce other specifiers in the future, so don't abuse this feature for other characters. Also, note that we do \emph{not} support field lengths (yet). This may come in the future, if I get the time\dots The \texttt{-v} command is implemented by indexing into the \rsrc\ file; read that for seeing how each format is implemented. If you find yourself using a particular format often by using the -f switch, consider putting it in the \rsrc\ file instead. \item[\texttt{-V [-{}-pipeverb]}] Which entry we'll use in the \rsrc\ file whenever \texttt{stdout} isn't a terminal. The default is to use the same mode as specified with the \texttt{-v} switch; using \texttt{-V} without any parameter will give you mode 1. This switch was implemented because GNU less has problems with the escape codes \chktex\ uses for displaying inverse text. Under UNIX, there's another way around, though, which is slightly more elegant. Add the following line to your \Cmd{.envir} file: \begin{verbatim} setenv LESS -r \end{verbatim} \item[\texttt{-p [-{}-pseudoname]}] With this switch, you can provide the filename which will be used when we report the errors. This may be useful in scripts, especially when doing pipes. It is in other words similar to C's \verb@#line@ directive. We will only assume this name for the uppermost file; files that this one in turn \verb@\@\verb@input@ are presented under their original names. This seems most logical to me. \item[\texttt{-s [-{}-splitchar]}] String to use instead of the colons when doing \texttt{-v0}; e.g.\ this string will be output between the fields. \end{description} \item[Boolean switches:] Common for all of these are that they take an optional parameter. If it is \texttt{0}, the feature will be disabled, if it is \texttt{1}, it will be enabled. All these features are on by default; and are toggled if you don't give any parameter. \begin{description} \item[\texttt{-b [-{}-backup]}] If you use the \texttt{-o} switch, and the named outputfile exists, it will be renamed to \texttt{filename.bak}. \item[\texttt{-I [-{}-inputfiles]}] Execute \verb@\@\verb@input@ statements; e.g.\ include the file in the input. Our input parsing does of course nest; we use an input-stack to keep track of this. \item[\texttt{-H [-{}-headererr]}] Show errors found in front of the \verb@\begin{document}@ line. Some people keep \emph{lots} of pure \TeX\ code there, which errors can't be detected reliably (in other words, we will in most cases just produce a lot of garbage). \item[\texttt{-g [-{}-globalrc]}] Read in the global resource file. This switch may be useful together with the \texttt{-l} option. \item[\texttt{-t [-{}-tictoc]}] Display a twirling baton, to show that we're working. \texttt{-v0} does an \texttt{-t0}, too, as it assumes that the user then uses the program non-interactively. This is now a no-op. \item[\texttt{-x [-{}-wipeverb]}] Ignore the ``\verb@\verb@'' command found within the \LaTeX\ file and its argument is completely by the checking routines. This is done by simply overwriting them. If you somehow don't like that (for instance, you would like to count brackets inside those commands, too), use this switch. \end{description} \end{description} If you don't specify any input \LaTeX-files on the commandline, we'll read from \texttt{stdin}. To abort \texttt{stdin} input, press the following keycombinations: \smallskip \begin{tabular}{ll} \bf Machine & \bf Key-combination \\ UNIX & $\fbox{\texttt{Ctrl}} + \fbox{\texttt{D}}$ \\ MS-DOS & $\fbox{\texttt{Ctrl}} + \fbox{Z}$, followed by return. \end{tabular} \smallskip By default, we use GNU's \Cmd{getopt()} routine. \begin{itemize} \item Options may be given in any order; the names of the \LaTeX-files do not have to be the last arguments. This behaviour may be turned off by creating an environment variable named \Cmd{POSIXLY\_CORRECT}. \item The special argument \Cmd{-{}-} forces an end of option-scanning. \item Long-named options begin with \Cmd{-{}-} instead of \Cmd{-}. Their names may be abbreviated as long as the abbreviation is unique or is an exact match for some defined option. If they have an argument, it follows the option name in the argument, separated from the option name by a \Cmd{=}, or else the in next argument. \end{itemize} \subsubsection{The \rsrc\ file} You should also take a look at the \rsrc\ file. As it is self-documenting, you should be able to get the meaning of each keyword by simply reading the file. In fact, since not all options are described in this documentation it is necessary that you read the \rsrc\ file in order to understand them all. The method for \emph{finding it} has grown rather complex. An outline is given below. If \chktex\ finds multiple files when searching, each and every one will be read in the order specified below. The \Cmd{Keyword = \{ item item \dots \}} may thus be necessary to reset previously defined lists. In this list, \Cmd{\$foo} is assumed to be the environment variable \Cmd{foo}: \begin{enumerate} \item First, we'll take a look at the directory which was specified as \Cmd{DATADIR} during compilation. On UNIX boxes, this usually evaluates to something similar to \Cmd{/usr/local/share/chktexrc}, under MS-DOS it is set to \Cmd{\BS{}emtex\BS{}data\BS{}chktexrc}. \item Look in the following system directories: \begin{tabular}{ll} \bf Machine & \bf Directory \\ UNIX & \Cmd{\$HOME/.chktexrc} or \Cmd{\$LOGDIR/.chktexrc} \\ MSDOS & Program installation path \end{tabular} \item Look for it in the directory pointed to by an environment variable, as specified in the table below: \begin{tabularx}\linewidth{lY} \bf Machine & \bf Directory \\ UNIX & \Cmd{\$CHKTEXRC/.chktexrc} \\ MSDOS & \Cmd{\$CHKTEXRC\BS{}chktexrc}, \Cmd{\$CHKTEX\_HOME\BS chktexrc} or \Cmd{\$EMTEXDIR\BS{}data\BS{}chktexrc} \end{tabularx} \item Look for it in the current directory. On UNIX boxes, we expect the filename to be \Cmd{.chktexrc}; on other machines \Cmd{chktexrc}. \end{enumerate} If you for some reason wish to undo what the previous files may have done, you may say \Cmd{CmdLine \{ -g0 -r \}} somewhere in the \rsrc\ file; this will reset all previous settings. \subsubsection{Per Line and File Suppressions} There are many cases in which \chktex{} will give a warning about a construct which, although it usually indicates a mistake, is intentional. In these cases it can be extremely annoying to have this message appear everytime \chktex{} is run. For this reason you can use \LaTeX{} comments to suppress a certain message on a single line. This can be done by adding a (case-insensitive) comment at the end of the line of the form \begin{center} \verb+% chktex ##+ \end{center} where \verb+##+ is the number of the message to be suppressed. For example the line \begin{center} \verb+$[0,\infty)$+\\* \end{center} will produce a warning (number 9) about mismatched \verb+]+ and \verb+)+. However the lines \begin{center} \verb+$[0,\infty)$ % chktex 9+\\* \verb+$[0,\infty)$ % ChkTeX 9+\\* \end{center} will not produce such a message. In this case, message number 17 will still appear at the end, stating that the numbers of \verb+]+ and \verb+)+ don't match for the entire file. To suppress two different errors on the same line you will need two instances of \verb+chktex+ in the comment. This format is a little cumbersome, but it shouldn't be needed often, and hopefully will help avoid accidental suppressions. \begin{center} \verb+Jordan--H\"older on $[0,\infty)$ % chktex 8 chktex 9+\\* \end{center} One problem inherent in line-by-line suppressions is that during editing another error of the same type may creep into the same line. Therefore, I suggest using the \texttt{-L} or \texttt{-{}-nolinesupp} option to disallow line based suppressions once just before the document is finished. At that point you should go back over all the warnings and decide if they should be fixed. In addition to line-specific suppressions, you can create a suppression which will be in effect for the remainder of the file. This can be used, for example, to turn off warning 18 (about \verb+"+) in a file which uses a package (like \Cmd{babel}) where \verb+"+ is an active character. The syntax is nearly the same, namely \begin{center} \verb+% chktex-file ##+ \end{center} \subsubsection{Hints} I've tried to collect some advice that may be useful --- if you have a favourite hint, feel free to send it to me! \begin{itemize} \item If you use \Cmd{german.sty} or several of \Cmd{babel} languages which use \verb+"+ as an active character; it may be wise to put \Cmd{-n18} in the \Cmd{CmdLine} entry in the \rsrc\ file. This will probably reduce the amount of false warnings significantly. Alternately, you can put \verb+% chktex-file 18+ in your files which use one of these packages so that other files will still have these checks performed. \item Put \Cmd{-v} in the \Cmd{CmdLine} entry of the \rsrc\ file; this makes the fancy printing the default. \item If you're working on a large project, it may pay off to make a local resource file which is included in addition to the global one. In this one, add the necessary info to reduce the amount of false warnings --- these usually don't do anything but hide the real warnings. \item Create a total ignore environment, which \chktex\ will ignore completely. In here, you can place all that code which outsmarts \chktex\ completely. For instance, add the following lines at the top of your \LaTeX\ file: \begin{verbatim} % ChkTeX will ignore material within this environment \newenvironment{ignore}{}{} \end{verbatim} In addition, you should add the item \Cmd{ignore} to the \Cmd{VerbEnvir} entry in the \rsrc\ file. \end{itemize} \subsubsection{Bugs} No fatal ones, I think, but the program currently has some problems when a \LaTeX\ command/parameter stretch over a two lines --- some extra spaces may be inserted into the input. I regard the program as fairly well tested; using the SAS/C \Cmd{cover} utility I was able to make sure that approximately 95\% of the code has actually been run successfully in the final version. This does indeed leave some lines; most of these are procedure terminating brackets or ``can't happen'' lines, though. We've got some problems when isolating the arguments of a command. Although improved, it will certainly fail in certain cases; \chktex\ can for instance not handle arguments stretching over two lines. This also means that \Cmd{WIPEARG} entries in the \rsrc\ file will only have the first half of their argument wiped if the argument stretches over two lines. We will, however, take care not to wipe parenthesis in such cases, in order to avoid false warnings. Long lines are broken up into chunks and handled separately. The exact length is platform dependent, though is guaranteed to be at least 256 bytes. The first portions of the line will have line numbers that are 1 less than they should be. Some errors can be missed and some can be added erroneously. A warning will be issued if lines are too long. Before submitting a bug report, please first see whether the problem can be solved by editing the \rsrc\ file appropriately. \subsection{ChkWEB} This shell script is provided for checking CWEB files. The template is as follows: \begin{verbatim} chkweb [options] file1 file2 ... \end{verbatim} As you may see from the script, it is only a trivial interface towards \texttt{deweb} and \chktex. It does not support any individual options on the command line --- all options found will be passed onto \chktex. If \Cmd{-{}-} or a filename is found, the remaining parameters will be ignored. The only real intelligence it features is that it will try to append \verb@.w@ to filenames it can't find. If no filenames are given, we will read from \texttt{stdin}. \subsection{DeWEB} This program strips away C code and CWEB commands from CWEB sources. It is called with the following synopsis: \begin{verbatim} deweb file1 file2 ... \end{verbatim} \texttt{deweb} filters away all C \&\ CWEB commands from a CWEB source code. This leaves only the \LaTeX\ code. This stripped code, in turn, may then be passed to a suitable syntax checker for \LaTeX, like \chktex\ and \texttt{lacheck}, or spell-checkers like \texttt{ispell}. When \texttt{deweb} strips away the C code from your CWEB source, it tries to preserve line breaks. This means that the error reports from {\it your favorite tool\/} will be correct regarding to line numbers. In most cases, the column position will also be correct. This significantly simplifies finding the errors in the \LaTeX\ source (in contrast to the output from \texttt{cweave}, which output is truly difficult to figure anything out from). \texttt{deweb} accepts a list of filenames on the argument line, and will send its output to \texttt{stdout}. If no filenames are given, it will read from stdin, acting as a filter. No options are currently accepted. Macho users may try to pipe the output from \texttt{deweb} directly into \LaTeX, theoretically, this should work. This would ease the debugging of the \LaTeX\ code significantly, as when \LaTeX\ complains about wrong syntax, you'll be able to find the erroneous line much more easily. Don't expect that the output looks very much like the final one, though. \texttt{deweb} should now understand all correct \texttt{CWEB} opcodes. If it complains about not understanding a correct opcode, please inform the author. \subsubsection{Bugs} \texttt{deweb} will not even \emph{compile} under Perl versions before perl v5. Unfortunately, this means that we can't even tell the user why we failed; Perl will just complain about not being able to compile the regexps. \section{Explanation of error messages} Below is a description of all error-messages \chktex\ outputs. Error messages set in {\it italic type\/} are turned off by default. Where margin paragraphs are listed in the text, they refer to the keyword in the \rsrc\ file which controls the discussed warning. \newcommand\Keyword[1]{\marginpar{\texttt{\hfill\\ #1}}} \smallskip\pagebreak[2] \Keyword{Silent} \begin{errdesc}{Command terminated with space.} You tried to terminate a command with a blank space. Usually, this is an error as these are ignored by \LaTeX. In most cases, you would like to have a real space there. You can also specify regular expressions to match commands which can safely be terminated with a space. They are specified in the \rsrc\ file in \texttt{[]}, which in some other cases is used to indicate case-insensitive matching. This is used for example to support the \verb+\startXXX+ macros of Con\TeX t. \begin{errexam} \verb@\LaTeX@\underline{\tt\ }\verb@is a typesetter.@ \\* \LaTeX is a typesetter. \\* \smallskip \verb@\LaTeX\ is a typesetter.@ \\* \LaTeX\ is a typesetter. \\* \end{errexam} \end{errdesc} \Keyword{Linker} \begin{errdesc}{Non-breaking space (`\~{}') should have been used.} When reading a document, it is not very pretty when references are split across lines. If you use the \verb@~@ character, \LaTeX\ will assign a very high penalty for splitting a line at that point. \chktex\ issues this warning if you have forgot to do this. \begin{errexam} \verb@Please refer to figure@\underline{\tt\ }\verb@\ref{foo}.@ \\* Please refer to figure 11. \\* % Gotta cheat here! :) \smallskip \verb@Please refer to figure~\ref{foo}.@ \\* Please refer to figure~11. \\* \end{errexam} \end{errdesc} \begin{errdesc}{You should enclose the previous parenthesis with `\{\}'.} This is a warning which you may ignore, but for maximum aestethic pleasure, you should enclose your bracket characters with `\{\}'s. \begin{errexam} \verb@$@\underline{\tt\ }\verb@[(ab)^{-1}]@\underline{\tt\ }\verb@\^{-2}$@ \\* $[(ab)^{-1}]^{-2}$ \\* \smallskip \verb@${[{(ab)}^{-1}]}^{-2}$@ \\* ${[(ab)^{-1}]}^{-2}$ \\* \end{errexam} \end{errdesc} \Keyword{Italic\\ItalCmd\\NonItalic} \begin{errdesc}{Italic correction (`\BS/') found in non-italic buffer.} If you try to use the \verb@\/@ command when \chktex\ believes that the buffer is not outputted as italic, you'll get this warning. \begin{errexam} \verb@This is an@\underline{\tt\BS/}\verb@ example@ \\* This is an\/ example. \\* \smallskip \verb@This is an example.@ \\* This is an example. \\* \end{errexam} \end{errdesc} \Keyword{Italic\\ItalCmd\\NonItalic} \begin{errdesc}{Italic correction (`\BS/') found more than once.} If the buffer is italic, and you try to use the \verb@\/@ command more than once, you'll get this warning. \begin{errexam} \verb@This {\it example\/@\underline{\tt\BS/}\verb@} is not amusing.@ \\* This {\it example\/\/} is not amusing. \\* \smallskip \verb@This {\it example\/} is not amusing.@ \\* This {\it example\/} is not amusing. \\* \end{errexam} \end{errdesc} \Keyword{Italic\\ItalCmd\\NonItalic} \begin{errdesc}{No italic correction (`\BS/') found.} You get this error if \chktex\ believes that you are switching from italic to non-italic, and you've forgot to use the \verb@\/@ command to insert that extra little spacing. If you use the \Cmd{em} option, you may ignore this warning. \begin{errexam} \verb@This {\it example@\underline{\tt\ }\verb@} is not amusing, either.@ \\* This {\it example} is not amusing, either. \\* \smallskip \verb@This {\it example\/} is not amusing, either.@ \\* This {\it example\/} is not amusing, either. \\* \end{errexam} \end{errdesc} \Keyword{IJAccent} \begin{errdesc}{Accent command `command' needs use of `command'.} If you're using accenting commands, `i' and `j' should lose their dots before they get accented. This is accomplished by using the \verb@\i@, \verb@\j@, \verb@\imath@ and \verb@\jmath@ command. \begin{errexam} \verb@This is an example of use of accents: \'{@\underline{\tt i}\verb@}.@ \\* This is an example of use of accents: \'{i}. \\* \smallskip \verb@This is an example of use of accents: \'{\i}.@ \\* This is an example of use of accents: \'{\i}. \\* \end{errexam} \end{errdesc} \Keyword{HyphDash\\NumDash\\WordDash\\DashExcpt} \begin{errdesc}{Wrong length of dash may have been used.} This warning suggests that a wrong number of dashes may have been used. It does this by classifying the dash according to the the character in front and after the dashes. If they are of the same type, \chktex\ will determine which keyword to use in the \rsrc\ file. If not, it will shut up and accept that it doesn't know. \begin{tabular}{ll} \bf Character type & \bf Keyword in \rsrc\ file \\* Space & \texttt{WordDash} \\* Number & \texttt{NumDash} \\* Alphabetic character & \texttt{HyphDash} \\* \end{tabular} This is more or less correct, according to my references. One complication is that most often a hyphen (single dash) is desired between letters, but occasionally an n-dash (double dash) is required. This is the case for theorems named after two people e.g.\ Jordan--H\"older. A hyphen would indicate that it was one person with a hyphenated name e.g.\ Gregorio Ricci-Curbastro. If this is rare enough, it can be dealt with via line based suppressions. However, exceptions can also be handled by adding them to the \texttt{DashExcpt} list. The ``words'' in this list are considered to be correct regardless of any other settings. Adding \verb+Jordan--H\"older+ to this list will cause no warning to be issued. There is still the problem that no warning will be raised for Jordan-H\"older (unless added explicitly via regular expression), so care must still be taken. Some manuals---particularly American manuals---also suggest \emph{not} adding space around an m-dash (triple dash). Hopefully this check can be improved even more (suggestions?). \begin{errexam} \verb@It wasn't anything @\underline{\tt-}\verb@ just a 2@\underline {\tt-{}-{}-}\verb@3 star@\underline{\tt-{}-}\verb@shots.@ \\* It wasn't anything - just a 2---3 star--shots. \\* \smallskip \verb@It wasn't anything --- just a 2--3 star-shots@ \\* It wasn't anything --- just a 2--3 star-shots. \\* \end{errexam} \end{errdesc} \fmted{`\%s' expected, found `\%s'.} \begin{errdesc}{Solo `\%s' found.} Either brackets or environments don't match. \chktex\ expects to find matching brackets/environments in the same order as their opposites were found, and no closing delimiters which haven't been preceded by an opening one. While bracket matching is not an explicit error, it is usually a sign that something is wrong. \end{errdesc} \Keyword{CenterDots\\LowDots} \begin{errdesc}{You should use `\%s' to achieve an ellipsis.} Simply typing three \Cmd{.} in a row will not give a perfect spacing between the dots. The \verb@\ldots@ is much more suitable for this. Similar problems are noted for two periods in a row (instead of three) since lacheck does. In math mode, you should also distinguish between \verb@\cdots@ and \verb@\ldots@; take a look at the example below. \begin{errexam} \newcommand{\td}{\underline{\tt...}} \verb@Foo@\td\verb@bar. $1,@\td\verb@,3$. $1+@\td\verb@+3$. $1,@% \underline{\tt\BS{}cdots}\verb@,3$.@ \\* Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. \\* \smallskip \verb@Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$.@ \\* Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. \\ \end{errexam} \end{errdesc} \Keyword{Abbrev} \begin{errdesc}{Interword spacing (`\BS\ ') should perhaps be used.} One of the specified abbreviations were found. Unless you have previously said \verb@\frenchspacing@, you'll have incorrect spacing, which one should avoid if possible. You can also specify case-insensitive abbreviations in \texttt{[]}, though only the first letter is actually case-insensitive. \begin{errexam} \verb@This is an example, i.e.@\underline{\tt\ }\verb@an demonstration.@ \\* This is an example, i.e. an demonstration. \\* \smallskip \verb@This is an example, i.e.\ an demonstration.@ \\* This is an example, i.e.\ an demonstration. \\* \end{errexam} \end{errdesc} \begin{errdesc}{Intersentence spacing (`\BS{}@') should perhaps be used.} \LaTeX' detection of whether a period ends a sentence or not, is only based upon the character in front of the period. If it's uppercase, it assumes that it does not end a sentence. While this may be correct in many cases, it may be incorrect in others. \chktex\ thus outputs this warning in every such case. \begin{errexam} \verb@I've seen an UFO!@\underline{\tt\ }\verb@Right over there!@ \\* I've seen an UFO! Right over there! \\* \smallskip \verb+I've seen an UFO\@! Right over there!+ \\* I've seen an UFO\@! Right over there! \\* \end{errexam} \end{errdesc} \begin{errdesc}{Could not find argument for command.} \chktex\ will in some cases need the argument of a function to detect an error. As \chktex\ currently processes the \LaTeX\ file on a line-by-line basis, it won't find the argument if the command which needed it was on the previous line. On the other hand, this \emph{may} also be an error; you ought to check it to be safe. \begin{errexam} \verb@$\hat$@ \\* This will give a \LaTeX\ error\dots \\* \smallskip \verb@$\hat{a}$@ \\* $\hat{a}$ \\* \end{errexam} \end{errdesc} \begin{errdesc}{No match found for `\%s'.} This warning is triggered if we find a single, \emph{opening} bracket or environment. While bracket matching is not an explicit error, it is usually a sign that something is wrong. \end{errdesc} \Keyword{MathEnvir} \begin{errdesc}{Mathmode still on at end of LaTeX file.} This error is triggered if you at some point have turned on mathmode, and \chktex\ couldn't see that you remembered to turn it off. \end{errdesc} \begin{errdesc}{Number of `character' doesn't match the number of `character'.} Should be self-explanatory. \chktex\ didn't find the same number of an opening bracket as it found of a closing bracket. \end{errdesc} \begin{errdesc}{You should use either `` or '' as an alternative to `\,"\,'.} Self-explanatory. Look in the example, and you'll understand why. \begin{errexam} \verb@This is an @\underline{\tt"}\verb@example@\underline{\tt"} \\* This is an "example" \\* \smallskip \verb@This is an ``example''@ \\* This is an ``example'' \\* \end{errexam} \end{errdesc} \begin{errdesc*}{You should use "'" (ASCII 39) instead of "'" (ASCII 180).} On some keyboards you might get the wrong quote. This quote looks, IMHO, \emph{ugly} compared to the standard quotes, it doesn't even come out as a quote! Just see in the example. \begin{errexam} \verb@``There@\underline{\tt '}\verb@s quotes and there@\underline{\tt '}\verb@s quotes@ \underline{\tt ''} \\* % '' ``ThereŽs quotes and thereŽs quotesŽŽ \\* % '' \smallskip \verb@``There's quotes and there's quotes''@ \\* ``There's quotes and there's quotes'' \\* \end{errexam} \end{errdesc*} \Keyword{UserWarn} \begin{errdesc}{User-specified pattern found: \%s.} A substring you've specified using \texttt{UserWarn} in the \rsrc\ file, has been found. See also warning~44 which allows using regular expressions. You can also specify case-insensitive versions in \texttt{[]}. % Normally I would use a ref here, but if the numbers change that would be % hugely backwards incompatible. Also it would require adding special label code. \end{errdesc} \begin{errdesc*}{This command might not be intended.} I implemented this because a friend of mine kept on making these mistakes. Easily done if you haven't gotten quite into the syntax of \LaTeX. \begin{errexam} \verb@\LaTeX\ is an extension of \TeX@\underline{\tt\BS.}\verb@ Right?@ \\* \LaTeX\ is an extension of \TeX\. Right? \\* \smallskip \verb@\LaTeX\ is an extension of \TeX. Right?@ \\* \LaTeX\ is an extension of \TeX. Right? \\* \end{errexam} \end{errdesc*} \begin{errdesc*}{Comment displayed.} \chktex\ dumps all comments it finds, which in some cases is useful. I usually keep all my notes in the comments, and like to review them before I ship the final version. For commenting out parts of the document, the \Cmd{comment} environment is better suited. Setting this warning allows you to see notes you have left in comments. \end{errdesc*} \begin{errdesc}{Either ''\BS,' or '\BS,'' will look better.} This error is generated whenever you try to typeset three quotes in a row; this will not look pretty, and one of them should be separated from the rest. \begin{errexam} \underline{\tt```}\verb@Hello', I heard him said'', she remembered.@ \\* ```Hello', I heard him said'', she remembered. \\* \smallskip \verb@``\,`Hello', I heard him said'', she remembered.@ \\* ``\,`Hello', I heard him said'', she remembered. \end{errexam} \end{errdesc} \Keyword{PostLink} \begin{errdesc}{Delete this space to maintain correct pagereferences.} This message, issued when a space is found in front of a \verb@\index@, \verb@\label@ or similar command (can be set in the \rsrc\ file). Sometimes, this space may cause that the word and the index happens on separate pages, if a pagebreak happens just there. Warning~42 is similar in that it warns about spaces in front of footnotes. The difference is that the warning text makes more sense for that case. \begin{errexam} \verb@Indexing text@\underline{\tt\ }\verb@\index{text} is fun!@ \\* \smallskip \verb@Indexing text\index{text} is fun!@ \\* \end{errexam} \end{errdesc} \begin{errdesc}{You might wish to put this between a pair of `\{\}'} This warning is given whenever \chktex\ finds a \Cmd{\^{ }}' or a \Cmd{\_} followed by either two or more numeric digits or two or more alphabetic characters. In most situations, this means that you've forgotten some \{\}'s. \begin{errexam} \verb@$5\cdot10^@\underline{\tt10}\verb@$@ \\* $5\cdot10^10$ \\* \smallskip \verb@$5\cdot10^{10}$@ \\* $5\cdot10^{10}$ \end{errexam} \end{errdesc} \begin{errdesc}{You ought to remove spaces in front of punctuation.} This warning is issued if \chktex\ finds space in front of an end-of-sentence character. \begin{errexam} \verb@Do you understand@\underline{\tt\ }\verb@?@ \\* Do you understand ? \\* \smallskip \verb@Do you understand?@ \\* Do you understand? \\* \end{errexam} \end{errdesc} \begin{errdesc}{Could not execute LaTeX command.} Some \LaTeX\ commands will be interpreted by \chktex; however, some of them are sensible to errors in the \LaTeX\ source. Most notably, the \verb@\@\verb@input@ command requires that the input file exist\dots \end{errdesc} \Keyword{Italic\\ItalCmd\\NonItalic} \begin{errdesc}{Don't use \BS/ in front of small punctuation.} Italic correction should generally \emph{not} be used in front of small punctuation characters like `.' and `,'; as it looks better when the preceding italic character leans ``over'' the punctum or comma. \begin{errexam} \verb@It is just a {\it test@\underline{\tt\BS/}\verb@}, don't think anything else.@ \\* It is just a {\it test\/}, don't think anything else. \\* \smallskip \verb@It is just a {\it test}, don't think anything else.@ \\* It is just a {\it test}, don't think anything else. \end{errexam} \end{errdesc} \begin{errdesc}{\$\BS{}times\$ may look prettier here.} In ASCII environments, it is usual to use the `x' character as an infix operator to denote a dimension. The mathemathical symbol $\times$ provided by the \verb@$\times$@ command is better suited for this. \begin{errexam} \verb@The program opens a screen sized 640@\underline{\tt x}\verb@200 pixels.@ \\* The program opens a screen sized 640x200 pixels. \\* \smallskip \verb@The program opens a screen sized $640\times200$ pixels.@ \\* The program opens a screen sized $640\times200$ pixels. \end{errexam} \end{errdesc} \begin{errdesc*}{Multiple spaces detected in output.} This warning, intended for the novice, will remind you that even if you \emph{type} multiple spaces in your input, only a single space will come out. Some ways to come around this is listed below. \begin{errexam} \verb@White is a beautiful colour.@ \\* White is a beautiful colour. \\* \smallskip \verb@White~~~~~{ }{ }{ }\ \ \ is a beautiful colour.@ \\* White~~~~~{ }{ }{ }\ \ \ is a beautiful colour. \\ \end{errexam} \end{errdesc*} \Keyword{VerbEnvir} \begin{errdesc}{This text may be ignored.} Certain implementations of the \verb@verbatim@ environment and derivations of that, ignore all text on the same line as \verb@\end{verbatim}@. This will warn you about this. \end{errdesc} \fmted{Use ` to begin quotation, not '.}\hfill\\ \fmted{Use ' to end quotation, not `.}\hfill\\ \begin{errdesc}{Don't mix quotes.} Proper quotations should start with a \verb@`@ and end with a \verb@'@; anything else isn't very pretty. Both these warnings are relative to this; look in the example below. \begin{errexam} \verb@There are @\underline{\tt`'}% \verb@examples'' and there are ``examples@\underline{\tt``}\verb@.@ \\* There are `'examples'' and there are ``examples``. \\* \smallskip \verb@There are ``examples'' and there are ``examples''.@ \\* There are ``examples'' and there are ``examples''. \end{errexam} \end{errdesc} \Keyword{MathRoman} \begin{errdesc}{You should perhaps use `cmd' instead.} Most mathematical operators should be set as standard roman font, instead of the math italic \LaTeX\ uses for variables. For many operators, \LaTeX\ provides a pre-defined command which will typeset the operator correctly. Look below for an illustration of the point. \begin{errexam} \verb@$@\underline{\tt sin}\verb@^2 x + @\underline{\tt cos}\verb@^2 x = 1$@ \\* $sin^2 x + cos^2 x= 1$ \\* \smallskip \verb@$\sin^2 x + \cos^2 x = 1$@ \\* $\sin^2 x + \cos^2 x = 1$ \end{errexam} \end{errdesc} \fmted{You should put a space in front of/after parenthesis.}\hfill\\ \begin{errdesc}{You should avoid spaces in front of/after parenthesis.} Outside math mode, you should put a space in front of any group of opening parenthesis, and no spaces after. If you have several after each other, you should of course not put a space in between each; look in the example below. Likewise, there should not be spaces in front of closing parenthesis, but there should be at least one after. \begin{errexam} \verb@This@\underline{\tt( }\verb@an example@\underline{\tt( }% \verb@Nuff said@\underline{\tt\ }\verb@)), illustrates@\underline{\tt( }% \verb@``my''@\underline{\tt\ )}\verb@point.@\\ This( an example( Nuff said )), illustrates( ``my'' )point. \\ \smallskip \verb@This (an example (Nuff said)), illustrates (``my'') point.@\\ This (an example (Nuff said)), illustrates (``my'') point.\\ \end{errexam} \end{errdesc} \Keyword{QuoteStyle} \begin{errdesc}{You should not use punctuation in front of/after quotes.} % For best looking documents, you should decide on how you wish to put quotes relative to punctuation. \chktex\ recognizes two styles; you may specify which you use in the \rsrc\ file. A description on each style follows: \begin{description} \item[Traditional:] This style is the most visually pleasing. It always puts the punctuation \emph{in front of} the quotes, which gives a continuous bottom line. However, it may in certain cases be ambigious. Consider the following example from a fictious \Cmd{vi(1)} tutorial (quote taken from the Jargon file): \begin{center} \verb@Then delete a line from the file by typing ``dd.''@ \\* Then delete a line from the file by typing ``dd.'' \end{center} That would be very bad --- because the reader would be prone to type the string d-d-dot, and it happens that in \Cmd{vi(1)} dot repeats the last command accepted. The net result would be to delete \emph{two} lines! This problem is avoided using logical style, described below. \pagebreak[3] \item[Logical:] This style uses quotes as balanced delimiters like parentheses. While this is not the most visual pleasing, it is can't be misunderstood. The above sentence would then become: \nopagebreak \begin{center} \verb@Then delete a line from the file by typing ``dd''.@ \\* Then delete a line from the file by typing ``dd''. \end{center} \nopagebreak \end{description} \end{errdesc} \begin{errdesc}{Double space found.} This warning is triggered whenever \chktex\ finds a space in front of a hard space, or vice versa. This will be rendered as two spaces (which you usually don't wish). \begin{errexam} \verb@For output codes, see table@\underline{\tt\ }% \verb@~@\underline{\tt\ }\verb@\ref{foo}.@ \\* For output codes, see table ~ 1.1.\\* \smallskip \verb@For output codes, see table~\ref{foo}.@ \\* For output codes, see table~1.1. \end{errexam} \end{errdesc} \Keyword{MathEnvir} \begin{errdesc}{You should put punctuation outside inner/inside display math mode.} As recommended in the \TeX{}book, you should try to put punctuation outside inner math mode, as this is gets formatted better. Similarily, you should let any final punctuation in display math mode end up within it. Look at the following example, which was taken from the \TeX{}book: \begin{errexam} \verb@for $x = a@\underline{\tt,}\verb@b$, or $c$.@\\* for $x = a,b$, or $c$. \\* \smallskip \verb@for $x = a$, $b$, or $c$.@\\* for $x = a$, $b$, or $c$.\\* \end{errexam} \end{errdesc} \Keyword{Primitives} \begin{errdesc*}{You ought to not use primitive TeX in LaTeX code.} This warning is triggered whenever you use a raw \TeX\ command which has been replaced by a \LaTeX\ equivalent. If you consider yourself a purist (or want to be sure your code works under \LaTeX3), you should use the \LaTeX\ equivalent. \end{errdesc*} \Keyword{NotPreSpaced} \begin{errdesc}{You should remove spaces in front of `\%s'} Some commands should not be prepended by a space character, for cosmetical reasons. This notes you of this whenever this has happened. \begin{errexam} \verb@This is a footnote@\underline{\tt\ }\verb@\footnotemark[1] mark.@\\* This is a footnote ${}^1$ mark. \\* \smallskip \verb@This is a footnote\footnotemark[1] mark.@\\* This is a footnote${}^1$ mark. \\* \end{errexam} \end{errdesc} \Keyword{NoCharNext} \begin{errdesc}{`\%s' is normally not followed by `\%c'.} \LaTeX' error message when calling \verb@\left \{@ instead of \verb@left \{@ is unfortunately rather poor. This warning detects this and similar errors. \end{errdesc} \Keyword{UserWarnRegex} \begin{errdesc}{User Regex:\ \%s.} A pattern you've specified using \texttt{UserWarnRegex} in the \rsrc\ file, has been found. See also warning~20 which allows specification of simple string matching. Depending on how \chktex\ was configured, you can use either PCRE regular expressions, POSIX extended regular expressions, or none at all. A warning will be issued if \chktex\ was built without regular expression support, but you try to use one. By default the matching portion of the line is printed to help distinguish between user specified regular expressions. However, if the regular expression begins with a PCRE comment (which has a syntax of \verb+(?#+~\dots~\verb+)+), then that comment will be printed instead. This can be used to remind yourself why you were searching for the problem or how to fix it. This applies even if POSIX regular expressions are used since \chktex\ itself parses a single initial PCRE-style comment. \emph{Note:} If a regular expression (not a comment) starts with \texttt{PCRE:} or \texttt{POSIX:} it will be used only if support for that regular expression engine has been compiled in. It is primarily meant to make testing easier but, can be used to allow better regular expressions if PCRE is available. If you want a regular expression that starts with \texttt{PCRE:} or \texttt{POSIX:} then you can enclose one of the characters in brackets like \texttt{[P]CRE:}. An example, included in the \rsrc\ file, is given below. Remember that you have to escape (with~\verb+!+) spaces and \verb+#+ as well as a few other characters. One should always use \verb+\nmid+ instead of \verb+\not\mid+ because the results are much better. \begin{errexam} \verb+\\not! *(\||\\mid)+\\* \verb+User Regex: \not\mid.+\\* \end{errexam} or with an initial comment \begin{errexam} \verb+(?!#Always! use! \nmid)\\not! *(\||\\mid)+\\* \verb+User Regex: Always use \nmid.+ \end{errexam} You can use \verb+% chktex 44+ to suppress user regular expression warnings on a given line, but this is often undesirable since all such warnings are suppressed this way. For this reason you can ``name'' user regular expression warnings with negative numbers. For example \verb+% chktex 4+ will suppress the system warning number 4, but \verb+% chktex -4+ will suppress the user regular expression warning number 4. Since one might wish to add, remove, or rearrange user warnings in the \rsrc\ file, you must explicitly name particular warnings rather than relying on position in that file. In order to name one, include an initial PCRE-style comment with the first characters being a number (positive or negative---the absolute value will be used). The numbers are limited by the number of bits in a \texttt{long}, usually giving 1--63 as possible names. You can give more than one regular expression the same name, and suppressing that name will suppress all regular expressions with that name. Using the example from before, all of the following will be suppressed with \verb+% chktex -4+. Note that the name \emph{will} be printed as written so that you know which number to suppress. \begin{errexam} \verb+(?!#4:Always! use! \nmid)\\not! *(\||\\mid)+\\* \verb+(?!#-4Always! use! \nmid)\\not! *(\||\\mid)+\\* \verb+(?!#-4! Always! use! \nmid)\\not! *(\||\\mid)+\\* \end{errexam} \end{errdesc} \begin{errdesc}{Use \textbackslash[ ... \textbackslash] instead of \$\$ ... \$\$.} In \LaTeX\ documents, using \verb+\[...\]+ is strongly preferred over \verb+$$...$$+. This is because using \verb+$$+ will change the vertical spacing in the equations making them inconsistent. \end{errdesc} \begin{errdesc*}{Use \textbackslash( ... \textbackslash) instead of \$ ... \$.} In \LaTeX\ documents using \verb+\(...\)+ is slightly preferred over \verb+$...$+. Some error messages might be clearer with \verb+\(...\)+. \end{errdesc*} \section{Future plans} In a somewhat prioritized sequence, this is what I'd like to put into the program --- if I have the time. \begin{itemize} \item De-linearize the checker. Currently, it works on a line-by-line basis, in most respects, at least. I hope to be able to remove this barrier; as this will reduce the amount of false warnings somewhat. \item Probably some more warnings/errors; just have to think them out first. Suggestions are appreciated --- I've ``stolen'' most that similar programs provides, and am running out of ideas, really. It would also be nice to investigate the field of ``globally'' oriented warnings; i.e.\ warnings regarding the document as a whole. Currently, \chktex\ operates mainly on a local/``greedy'' basis. If you have suggestions/ideas on this topic, they're certainly welcome, including references to literature. \item Fix a few more bugs. \end{itemize} \section{Notes} \subsection{Wish to help?} As most other living creatures, I have only a limited amount of time. If you like \chktex\ and would like to help improving it, here's a few things I would like to receive. The following ideas are given: \begin{itemize} \item Does anyone have a $\mbox{\LaTeX}\rightarrow \mbox{\texttt{troff}}$ conversion program? It would be really nice if I could extract the relevant sections from this manual, and present them as a man page. I will not, however, convert this manual to \TeX{}info in order to be able to do this; IMHO \TeX{}info documents have far too limited typographic possibilities. This doesn't mean that I'm not willing to restructure the document at all. This manual already uses some kind of preprocessing in order to achieve HTML output via \LaTeX2\texttt{html}, I'm willing to do the same in order to produce \texttt{troff} output. \item Help me port the program! This is a prioritized one. It's no fun writing ANSI C when people haven't got a C compiler. Of course, I'll provide whatever help necessary to modify the sources to fit to the new platform. Take contact if you're interested. I will include your compiled binary in the distribution, and give you credit where appropiate. Just one request: If you have to modify the sources in order to make \chktex\ compile \& work on the new platform, \emph{please} enclose your changes in something like \Cmd{\#ifdef \_\_PLATFORM\_\_\dots code\dots\#endif}! It makes life so much easier later, when we try to merge the two source trees. \item Reports on problems configuring and compiling \chktex\ on supported (and unsupported) systems are welcomed. \item Filters for other file formats. I do believe that there are several formats using \LaTeX\ for its formatting purposes, combining that with something else. If you can write a program or script which filters everything away but the \LaTeX\ code, it will surely be appreciated (and included). Look at the \verb@deweb@ script to see what I mean. \item Interfaces for other editors are also welcomed. \item If you update the \rsrc\ file in anyway that is not strictly local, I would appreciate to receive your updated version. \item Suggestions for new warnings are always welcomed. Both formal (i.e.\ regexps or similar) and non-formal (plain English) descriptions are welcomed. \end{itemize} Of course, people doing any of this will be mentioned in this document, and thus receive eternal glory and appreciation. \subsection{Caps and stuff} Where trademarks have been used, the author is aware of that they belong to someone, and has tried to stick to the original caps. \section{About the author} A quick summary of who I am and what I do: I'm 21 years old, and live in Oslo, the capital of Norway. I'm currently studying maths and computer science at the University~of~Oslo; planning to get a degree within mathematical modeling, with a dash of physics and emphazing the computer part of the study. More precisely, in autumn'96 my studies consist of mathematical analysis, statistics \& probability calculations plus studying the relationship between society and computers. At home I now possess 4 computers, of which 1 is regular use: A vanilla Amiga 1200, expanded only by a HD\@. The others are a \texttt{80286} PC and an Amiga 500, both semi-out-of-order. The last one is a Commodore VIC-20, which for some peculiar reason never seems to be used. Plans are to get a Linux-capable PC, though. Most of the time in front of these computers (including SGI Indy's and SPARC stations at our university) is spent on C and shell programming, plus some text-processing. % I am also involved in writing the document % for {\sc Isaac} --- Interactive Simulation as an Alternative to % Advanced Calculations. This is planned to help newcomers to physics, % by providing a computer program which enables one to simulate most % experiments relating to classical mechanics. % C and shell programming are not my only knowledge areas regarding computers, however. I write the following languages more or less: Perl, Motorola \texttt{68000} assembly code, ARexx, Simula, C++, \LaTeX, HTML, AmigaGuide, Amos Basic and Installer LISP\@. Once I also mastered Commodore Basic V2, the ``language'' included with my VIC-20. However, I also try to not to end up as a computer nerd. Thus, in addition to the compulsory (?) interest for computers, I am a scout. Still running into the woods, climbing the trees, falling down and climbing up once more, in other words. To be more specific, I am a now a troop leader for `Ulven' scout-group; Norwegian Scouts Association. I am also a active rover in `V{\aa}lerenga' scout-group. Certainly a lot more to tell (I play the piano and like cross-country skiing, for instance); but I'll stop here before you fall asleep\dots \section{Thanks} The author wishes to thank the following people (in alphabetical order): \def\Name#1#2{% \item[] \setbox0=\hbox{ \begin{tabular}{l} \textbf{#1} \\ \texttt{#2} \\ \end{tabular} } \usebox0\\ } \begin{description} \Name{Russ Bubley}{russ@scs.leeds.ac.uk} He has been the main external beta-tester for this program, sending me loads and loads of understandable and reproducible bug reports. If you somehow think that \chktex\ is well-behaved and free from bugs, send warm thoughts to Russ. He has also provided ideas for enhanced checks and so forth. In addition, he sent me a huge list of 238 common English abbreviations, for inclusion in the \rsrc\ file! Together with the enhanced abbreviation recognizer, I do now believe most abbreviations should be caught\dots Finally, he has also given me valuable hints for improving the program's outputting routine, and given me lots of suggestions for filtering unnecessary/false warnings away. \Name{Gerd B\"ohm}{Gerd.Boehm@physik.uni-regensburg.de} Improved and bug-fixed the MS-DOS port of \chktex\ v1.4, sending me ready-to-yank code patches. The original port didn't respect all the peculiarities of the MS-DOS file-system, unfortunately. \Name{Antonio DiCesare}{dicesare@vodafone.it} He provided many feature requests and bug reports for the 1.7.1 version making it a much better release than it would have otherwise been. He also helped expand several keywords in the \rsrc\ file. \Name{Mojca Miklavec}{mojca.miklavec.lists@gmail.com} Found and helped debug a problem (fixed in 1.7.2) occurring only on some platforms, 32 bit Macs for one. \Name{Baruch Even}{chktex@ev-en.org} Maintainer of \chktex\ for about a decade. \Name{Lars Frellesen}{frelle@math-tech.dk} Sent a few bug reports regarding the filtering of messages. He has also helped me to expand the \Cmd{SILENT} keyword in the \rsrc\ file. \Name{Wolfgang Fritsch}{fritsch@hmi.de} Author of the OS/2 port, which he did using the emx compiler. Please direct questions regarding strictly to that port to him (I would like to receive a carbon copy, though). \Name{Stefan Gerberding}{stefan@inferenzsysteme.informatik.th-darmstadt.de} First one to report the Enforcer hit in v1.2 when using \chktex\ as a pipe. Also came with suggestions to make \chktex\ more easily compile on early gcc compilers. He has also kept on beta-testing later versions of \chktex, giving me bug-reports and enhancements requests. \Name{Kasper B. Graversen}{kbg2001@internet.dk} Lots of creative suggestions and improvements. Several of the warnings implemented were based on his ideas. In addition, he has given advice for improving the existing warnings. Has also provided some OS-oriented code. \Name{Frank Luithle}{f\_luithle@outside.sb.sub.de} Wrote a translation for v1.0. Unfortunately, he remained unreachable after that\dots:-/ \Name{Nat}{nat@nataa.frmug.fr.net} Reported the same bug as Gerberding. In addition, he taught me a few tricks regarding the use of gcc + made me understand that the ANSI standard isn't unambigious; at least the \verb@getenv()@ call seem to be open for interpretations. Many possible incompatibilities have been removed due to these lessons. \Name{Michael Sanders}{sanders@umich.edu} Has found some of the bugs in this beast; both obscure and long-lived. Has also provided motivation to clarify this document. \Name{Bj\o rn Ove Thue}{bjort@ifi.uio.no} Author of the MSDOS port; please direct questions regarding strictly to that port to him (I would like to receive a carbon copy, though). \Name{Martin Ward}{Martin.Ward@durham.ac.uk} Sent a few bug-reports; also gave me information upon where to find regexp code. He also provided a Perl script for checking ordinary text, which ideas I was able to implement in \chktex. In addition, he sent me the source code for \verb@lacheck@; which also inspired some of the warnings. \end{description} %endlatex \section{Contacting the author} If you wish to contact me for any reason or would like to participate in the development of \chktex, please write to: %latex \begin{samepage} %endlatex \begin{quote} Jens Berger \\ Spektrumvn. 4 \\ N-0666 Oslo \\ Norway \\ E-mail: \texttt{} \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.6/ChkTeX.texrc000644 000765 000024 00000000302 07672461033 016023 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.6/chktexrc000644 000765 000024 00000056224 12654307031 015373 0ustar00iandrusstaff000000 000000 ## ## ChkTeX, example resource file for ChkTeX. ## Copyright (C) 1995-96 Jens T. Berger Thielemann ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ## ## Contact the author at: ## Jens Berger ## Spektrumvn. 4 ## N-0666 Oslo ## Norway ## E-mail: ## ##################################################################### # # Note: The format has changed slightly (again). The { ... } # syntax does now mean case-sensitive comparing, while [ ... ] means # case-insensitive comparing of the keywords. Case-insensitive # comparing of the keywords is only supported on a few of the # keywords (it's not meaningful in all contexts, and it slows ChkTeX # down). Keywords supporting this are marked throughout the file. # # You may also reset a list by saying "KEYWORD = { ... }"; it will # then be set equal to the contents of the list you specify. # # Comments begin with `#', and continues for the rest of the line. # Blank lines plus leading and trailing spaces are of course ignored. # # The general format of this file is the following: # # KEYWORD { item item ...} [ item item ... ] /* Adds items */ # # KEYWORD [ item item ...] { item item ... } /* Adds items */ # # KEYWORD = item # # KEYWORD = { item item ... } /* Clears list before adding */ # # KEYWORD = [ item item ... ] /* Clears list before adding */ # # This does _not_ mean that you may alternate the forms; certain # keywords demands a list, other a single value. You thus have to # look at the examples of their use. # # Please also note that if you specify a list-keyword twice, we'll # concatenate the lists. If you specify a item-keyword twice, we'll # kill the previous value. # # We are slightly context-sensitive when detecting tokens like "}" # and "]"; they have to be preceded by a space. This generally makes # life easier. # # Items are separated by spaces. Newlines are considered as spaces, # but can't be escaped. You may surround items with quotes (`"') to # easily put spaces into them. # # Escape sequences available: # # Sequence Resulting character # ! A space (type `! ', not just a exclamation mark) # !" " # !# # # !! ! # !{ { # !} } # ![ [ # !] ] # != = # !b Backspace # !n New line # !r Carriage return # !t Tab # !f Form feed # !xNN NN must be a hexadecimal number (00 - ff), # _both_ characters must be included. # !dNNN DDD must be a decimal number (000 - 255), all # three characters must be included. Unspecified # results if DDD > 255. # !NNN DDD must be a octal number (000 - 377), all # three characters must be included. Unspecified # results if DDD > 377. # # Minor note: As you can see, most of these escape sequences are # equal to those in C (with some extensions); however, we use ! # instead of \ as escape character for obvious reasons. # # # Quick summary of keywords follows. Keywords marked with a * accept # keywords accepting case-insensitive lists. # # Abbrev* - A list of abbreviations not automatically caught. # CenterDots - Commands/characters which should have \cdots in # between. # CmdLine - Default commandline options. These will be # processed before the ones you give on the command # line. # HyphDash \ # NumDash - Number of dashes allowed in different contexts. # WordDash / # IJAccent - Commands which puts an accent _over_ their # argument. # Italic - Commands immediately turning on italic mode. # ItalCmd - Commands putting their argument into italic. # Linker - Commands which should have a non-breaking space in # front. # LowDots - Commands/characters which should have \ldots in # between. # MathEnvir - Environments which turn on math mode. # MathCmd - Commands which turn on math mode. # TextCmd - Commands which turn off math mode. # MathRoman - Mathematical operators with LaTeX replacement # defined. # NoCharNext - Insists on that certain commands aren't followed by # certain characters. # NonItalic - Commands immediately turning off italic mode. # NotPreSpaced- Commands which should not have a space in front of # them. # Primitives - Primitive TeX commands. # PostLink - Commands which generates a page reference. # OutFormat - Formats to use for output. See the -f & -v switch # in the main doc. # QuoteStyle - Either "Traditional" or "Logical". See main doc, # warning 38. # Silent - These commands do not produce any textual output; # and are thus allowed to have a space after them. # TabSize - Tab size you are using. # TeXInputs - Paths to search \input and \include files for. # UserWarn* - These strings will be searched for throughout the # text. # VerbEnvir - Environments which contents should be ignored. # VerbClear - String we will overwrite unwanted data with. # WipeArg - Commands (with arguments) which should be ignored # in the checking. # ##################################################################### # # Enter which type of quote-style you are using here. Currently, we # support the following styles: # # Style Example of use # Traditional "An example," he said, "would be great." # Logical "An example", he said, "would be great". # QuoteStyle = Logical ##################################################################### # # Enter here what interval you have between your tabs. Only regular # intervals are supported. # TabSize = 8 ##################################################################### # # Here, you can put default commandline options; most users would for # instance like to put -v2 here. # CmdLine { } ##################################################################### # # These patterns will be searched for through the text; no matter # whether they appear as normal text, commands or whatever. # Currently case-sensitive. They are not found in comments. # # I usually define a special command like this: # # \def\unknown{\large\bf??} # # which I use whenever there is some information I don't have at the # moment of writing. Thus, it makes sense to search for it. # # You should be able to develop your own uses for this. # UserWarn { \unknown ### # # Another example; one should write \chktex or Chk\TeX - never ChkTeX. # ### ChkTeX } [ ### # # You may put case-insensitive patterns here. # ### ] ### # # These patterns will be searched for, no matter whether they appear # as normal text, commands or arguments. However, they will _not_ # match in verbatim environments. # # Remember that you have to escape (with a !) the following # characters: "#!= as well as spaces and {}[] if they are proceeded by # a space. # # Since these are PCRE regular expressions, you can use (?i) to make # the expression case insensitive. See the man pages (man pcresyntax) # or the nicely formatted http://perldoc.perl.org/perlre.html for # documentation on the regular expression syntax. Note however that # some the features of perl regular expression are not available such # as running code (callouts), and replacing. # # An initial PCRE comment (?# ... ) can be used change what is # displayed, thereby reminding yourself how to fix the problem. # ### UserWarnRegex { (?!#Always! use! \nmid)\\not! *(\||\\mid) # capitalize section when saying Section 6. (?!#-1:Capitalize! before! references)PCRE:\b(chapter|(sub)?section|theorem|lemma|proposition|corollary|appendix)~\\ref (?!#1:Capitalize! before! references)POSIX:([^[:alnum:]]|^)(chapter|(sub)?section|theorem|lemma|proposition|corollary|appendix)~\\ref # spell it out. # PCRE:(?i)\bintro\b(?!#Spell! it! out.! This! comment! is! not! used.) # POSIX:([^[:alnum:]]|^)intro([^[:alnum:]]|$) # Pretty tables--see http://texdoc.net/texmf-dist/doc/latex/booktabs/booktabs.pdf (?!#-2:Use! \toprule,! midrule,! or! \bottomrule! from! booktabs)\\hline # This relies on it being on a single line, and not having anything # else on that line. With PCRE we could match balanced [] and {}, # but I wonder if it's worth the complexity... (?!#-2:Vertical! rules! in! tables! are! ugly)\\begin\{(array|tabularx?\*?)\}(\[.*\])?\{.*\|.*\} } ##################################################################### # # Here you can list the path of where ChkTeX should look for files it # \inputs. The // postfix is now supported; if you append a double # path-separator we'll recursively search that directory directories. # MS-DOS users must append \\ instead, e.g. "C:\EMTEX\\". # # If you under either MS-DOS or UNIX wish to search an entire # partition or the complete directory tree, you must use *three* # slashes, e.g. "c:\\\" or "///". This may be considered to be a bug. # # By default, we'll search the current directory (not recursively, # put "//" in the list for this); any paths specified below will be # searched in addition to this. # TeXInputs { } ##################################################################### # # Here you may specify more output formats for use with the -v option, # it simply indexes into this list. Remember to use ! instead of \, # though. # # For explanation of how % fields expand; look at ChkTeX.{dvi,ps,pdf}. # # We will by default select entry number _two_ in this list (we count # from 0), and -v without any parameter selects entry number _three_. # OutFormat { # -v0; silent mode %f%b%l%b%c%b%n%b%m!n # -v1; normal mode "%k %n in %f line %l: %m!n%r%s%t!n%u!n" # -v2; fancy mode "%k %n in %f line %l: %m!n%r%i%s%I%t!n!n" # -v3; lacheck mode "!"%f!", line %l: %m!n" # -v4; verbose lacheck mode "!"%f!", line %l: %m!n%r%s%t!n%u!n" # -v5; no line number, ease auto-test "%k %n in %f: %m!n%r%s%t!n%u!n" # -v6; emacs compilation mode "!"%f!", line %l.%c:(#%n) %m!n" } ##################################################################### # # These commands should be ignored when detecting whether a command # is ended by a space. You can specify regular expressions in the [] # section in case you have many custom macros that can be safely # terminated with a space. # Silent { \rm \em \bf \it \sl \sf \sc \tt \selectfont \rmfamily \sffamily \ttfamily \mdseries \bfseries \slshape \scshape \relax \vskip \pagebreak \nopagebreak \textrm \textem \textbf \textit \textsl \textsf \textsc \texttt \clearpage \ddots \dotfill \flushbottom \fussy \indent \linebreak \onecolumn \pagebreak \pushtabs \poptabs \scriptsize \sloppy \twocolumn \vdots \today \kill \newline \thicklines \thinlines \columnsep \space \item \tiny \footnotesize \small \normalsize \normal \large \Large \LARGE \huge \Huge \printindex \newpage \listoffigures \listoftables \tableofcontents \maketitle \makeindex \hline \hrule \vrule \centering \bigskip \medskip \smallskip \noindent \expandafter \makeatletter \makeatother \columnseprule \textwidth \textheight \hsize \vsize \if \fi \else \csname \endcsname \z@ \p@ \@warning \typeout \dots \ldots \input \endinput \nextline \leavevmode \cdots \appendix \listfiles \and \quad \hskip \vfill \vfil \hfill \hfil \topmargin \oddsidemargin \frenchspacing \nonfrenchspacing \begingroup \endgroup \par \vrefwarning \upshape \headheight \headsep \hoffset \voffset \cdot \qquad \left \right \qedhere \xspace \addlinespace \cr \fill \frontmatter \toprule \midrule \bottomrule }[ # Here you can put regular expressions to match Silent macros. It was # designed for the case where you have many custom macros sharing a # common prefix, but can of course be used for other things. # Support ConTeXt to at least some extent \\start.* \\stop.* ] ##################################################################### # # Here, you can specify the length of various dashes. We sort the # dash according to which type of characters that are on the left and # right of it. We are only conclusive if they are the same. # # We associate as follows: # # Name Type of character on each side # HyphDash Alphabetic (foo-bar) # NumDash Numeric (2--3) # WordDash Space (like this --- see?) # # Below you specify how many dashes which are legal in each case. We # define 0 as a magic constant which always generates an error. You # may specify more than one legal dash-length. # # Let's look at an example. You use the following dash-syntax: # # foo-bar # 2--3 # like this---see? # # # HYPHDASH { 1 3 } # Either a hyphen, or inter-word # NUMDASH { 2 } # Between words # WORDDASH { 0 } # We never use this # HyphDash { 1 3 } NumDash { 2 } WordDash { 3 } ##################################################################### # # Here are exceptions to the dash rules above. For example, an # n-dash -- between words is usually wrong, but in some cases it is # correct, such as when naming a theorem. The Birch--Swinnerton-Dyer # conjecture is one example where the difference matters. You can # tell that Birch is one person and Swinnerton-Dyer is another. # # Adding line suppressions for these is possible, but can quickly # become tedious if a certain theorem is referenced often. For this # reason exceptions can be specified here. They are case-sensitive. # DashExcpt { Birch--Swinnerton-Dyer } ##################################################################### # # This keyword indicates commands whose argument isn't LaTeX code, # and thus should be ignored. # # After the command, you may place arguments that you wish that # should be wiped in the process; use [] for optional arguments, {} # for required ones and * if the command supports an alternative # variant. These should be separated from the command with a colon. # Some commands (e.g. \cmidrule) use () to delimit and optional # argument and so this syntax is supported as well. # # For instance, if you would like to wipe the \newcommand command, # you would declare it as \newcommand:*[][]{} # # These commands may be "executed" before they're wiped, so you will # typically also wish to list filehandling commands and similar here. # WipeArg { \label:{} \ref:{} \eqref:{} \vref:{} \pageref:{} \index:[]{} \cite:[][]{} \nocite:{} \input:{} \verbatiminput:[]{} \listinginput:[]{}{} \verbatimtabinput:[]{} \include:{} \includeonly:{} \bibitem:[]{} \cline:{} \cmidrule:[](){} \href:{}{} # Cleveref -- there are many others that could be here as well... \cref:*{} \cpageref:*{} \crefrange:*{}{} \cpagerefrange:*{}{} \Cref:*{} \Cpageref:*{} \Crefrange:*{}{} \Cpagerefrange:*{}{} # natbib \citet:*[][]{} \citep:*[][]{} \citealt:*{} \citealp:*[]{} \citeauthor:*{} \Citet:*[][]{} \Citep:*[][]{} \Citealt:*{} \Citealp:*[]{} \Citeauthor:{} \citetext:{} \citeyear:*{} \citeyearpar:{} # tipa which uses " \textipa:{} } ##################################################################### # # These environments contain material which will be typeset as # mathematics by LaTeX. This turns on/off some warnings. # # We will automagically append a * to each keyword. # MathEnvir { displaymath math eqnarray array equation align alignat gather flalign multline } ##################################################################### # # These commands contain material which will be typeset as mathematics # by LaTeX. The commands are assumed to have one mandatory argument # which is in math mode. This turns on/off some warnings. # MathCmd { \ensuremath } ##################################################################### # # These commands contain material which will _not_ be typeset as # mathematics by LaTeX even if it would otherwise be in mathmode. The # commands are assumed to have one mandatory argument which is in text # mode. This turns on/off some warnings. # TextCmd { \text \intertext \shortintertext \mbox } ##################################################################### # # These environments contains material which contents should be # ignored. # # We will automagically append a * to each keyword. # VerbEnvir { verbatim comment listing verbatimtab rawhtml errexam picture texdraw filecontents pgfpicture tikzpicture minted lstlisting IPA } ##################################################################### # # ChkTeX does automagically catch most abbreviations; the ones we # need to list here, are those which are most likely to be followed # by a word with an upper-case letter (that is not the beginning of a # new sentence). # # The case-insensitive abbreviations are not really case-insensitive, # it seems to be more practical to only let the first character be # case-insensitive, while the remaining are case-sensitive. # # To speed up the searching process somewhat, we require that these # end in a `.', this should not be a problem. # # Much of this work (both the abbreviations below, and the regexps # necessary to catch the remaining automatically) have been provided # by Russ Bubley, . # Abbrev { # Ordinals 1st. 2nd. 3rd. 4th. # Titles Mr. Mrs. Miss. Ms. Dr. Prof. St. # # Days # Mon. Tue. Wed. Thu. Fri. Sat. Sun. # # Months # Jan. Feb. Mar. Apr. May. Jun. Jul. Aug. Sep. Oct. Nov. Dec. # # Letters # Kt. Jr. # # Corporate # Co. Ltd. # # Addresses # Rd. Dr. St. Ave. Cres. Gdns. Sq. Circ. Terr. Pl. Arc. La. Clo. Ho. Est. Gn. # # Misc. # oe. pbab. ps. rsvp. Tx. } [ ### # # The first letter is case-insensitive in the abbrevs in this # list. Due to the nature of the checking algorithm used for # this, entries consisting of only one character will be # silently ignored. # ## # Latin # cf. "et al." etc. qed. qv. viz. # # Corporate # inc. plc. # # Misc # fax. pcs. qty. tel. misc. ] ##################################################################### # # Commands which accent characters, meaning that \i or \j (\imath and # \jmath in mathmode) should be used instead of `i' and `j' # IJAccent { \hat \check \breve \acute \grave \tilde \bar \vec \dot \ddot \' \` \^ \" \~ \= \. \u \v \H \t ### # # The remaining accent commands (\c,\d,\b) put their accent _under_ # the character, not above, and should thus be used with normal i's # and j's. # ### } ##################################################################### # # Commands which, when the group is terminated, needs italic # correction. # Italic { \it \em \sl \itshape \slshape } ##################################################################### # # Commands which makes the font non-italic. # NonItalic { \bf \rm \sf \tt \sc \upshape } ##################################################################### # # Commands which put their argument into italic (and thus possibly # needs italic correction in the end). # # This is currently empty, since \textit, \textsl and \emph do that # automatically. # ItalCmd { } ##################################################################### # # These commands all have in common that a pagebreak right in front # of them is highly undesirable; thus there should be no space in # front of them. # PostLink { \index \label } ##################################################################### # # These commands should not have a space in front of them for various # reasons. I.e. much the same as POSTLINK, but produces another # warning. # NotPreSpaced { \footnote \footnotemark \/ } ##################################################################### # # The commands listed here, should be prepended with a `~', as in # "look in table~\ref{foo}", to avoid the references being split # across lines. # Linker { \ref \vref \pageref \eqref \cite } ##################################################################### # # Commands/characters which should have \cdots in between, e.g. # $1+2+3+\cdots+n$. # CenterDots { = + - \cdot \div & \times \geq \leq < > } ##################################################################### # # Commands/characters which should have \ldots in between, e.g. # $1,2,3,\ldots,n$. # LowDots { . , ; } ##################################################################### # # In maths mode, there are certain aliases for mathematical operators # like sin, cos, etc. Ignore the leading backslash in the commands, # and so forth. You should list these below. # MathRoman { log lg ln lim limsup liminf sin arcsin sinh cos arccos cosh tan arctan tanh cot coth sec csc max min sup inf arg ker dim hom det exp Pr gcd deg bmod pmod mod } ##################################################################### # # These TeX commands have become unnecessary, as there are LaTeX # commands that does the same. Purists should thus avoid these in # their code. # # (These are a spell-corrected version of those lacheck uses). # Primitives { \above \advance \catcode \chardef \closein \closeout \copy \count \countdef \cr \crcr \csname \delcode \dimendef \dimen \divide \expandafter \font \hskip \vskip \openout } ##################################################################### # # Format: \command:characters # # We'll emit a warning if any of characters are found after the # command. # NoCharNext { \left:{}$ \right:{}$ } ##################################################################### # # We're killing \verb@...@ commands and the arguments of the commands # listed above in WipeArg by overwriting them with a string or a # single character. # # This should not contain an alphabetic character (in case the user # writes (\foo\verb@bar@), neither should it contain be one of # LaTeX's reserved characters (`#$%&~_^\{}'), or any parenthesis # character ('()[]{}'). If possible, don't use a punctuation # character, either, or any spacing character. # # The asterisk is also unsuitable, as some commands behave in another # way if they are appended with an asterisk. Which more or less # leaves us with the pipe. # # Please note that this may also be a _string_, which will be # repeated until the proper length is reached. # VerbClear = "|" # # All for now - have fun. # ##################################################################### chktex-1.7.6/chkweb000755 000765 000024 00000002441 11765104422 015017 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.6/chkweb.1000644 000765 000024 00000005530 10522030600 015137 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.6/config.h.in000644 000765 000024 00000010376 12125660710 015655 0ustar00iandrusstaff000000 000000 /* config.h.in. Generated from configure.in by autoheader. */ /* Define to 1 if you have the `access' function. */ #undef HAVE_ACCESS /* Define to 1 if you have the `closedir' function. */ #undef HAVE_CLOSEDIR /* Define to 1 if you have the declaration of `stpcpy', and to 0 if you don't. */ #undef HAVE_DECL_STPCPY /* Define to 1 if you have the 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. */ #undef HAVE_MEMORY_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_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 you have the ANSI C header files. */ #undef STDC_HEADERS /* Strip debug info */ #undef STRIP_DEBUG /* Define for Solaris 2.5.1 so the uint64_t typedef from , , 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 to `unsigned int' if does not define. */ #undef size_t /* Define to the type of an unsigned integer type of width exactly 64 bits if such a type exists and the standard includes do not define it. */ #undef uint64_t chktex-1.7.6/configure000755 000765 000024 00000526536 12764710126 015561 0ustar00iandrusstaff000000 000000 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for ChkTeX 1.7.6. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='ChkTeX' PACKAGE_TARNAME='chktex' PACKAGE_VERSION='1.7.6' PACKAGE_STRING='ChkTeX 1.7.6' PACKAGE_BUGREPORT='' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS WITH_PCRE EGREP GREP CPP LATEX2HTML LYNX DVIPS LATEX GROFF PERL5 MKDIR_P LN_S INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC CLEAN BUILT_SCRIPTS SCRIPTS target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_pcre enable_posixre enable_lacheck_replace enable_debug_info enable_coverage_testing ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures ChkTeX 1.7.6 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/chktex] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of ChkTeX 1.7.6:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-pcre: Use PCRE to allow regular expressions in user warnings. (Default: yes, if available). --enable-posixre: Use POSIX extended regular expressions in user warnings. (Default: yes, unless using PCRE). --enable-lacheck-replace: Installs a lacheck replacement. (Default: no). --enable-debug-info: Compile in miscellaneous runtime debugging information. (Default: yes). --enable-coverage-testing: Activate coverage testing with gcov. (Default: no) Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L 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=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF ChkTeX configure 1.7.6 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_find_uintX_t LINENO BITS VAR # ------------------------------------ # Finds an unsigned integer type with width BITS, setting cache variable VAR # accordingly. ac_fn_c_find_uintX_t () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 $as_echo_n "checking for uint$2_t... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" # Order is important - never check a type that is potentially smaller # than half of the expected target width. for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \ 'unsigned long long int' 'unsigned short int' 'unsigned char'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : case $ac_type in #( uint$2_t) : eval "$3=yes" ;; #( *) : eval "$3=\$ac_type" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if eval test \"x\$"$3"\" = x"no"; then : else break fi done fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_find_uintX_t # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case 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 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES # --------------------------------------------- # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR # accordingly. ac_fn_c_check_decl () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack as_decl_name=`echo $2|sed 's/ *(.*//'` as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 $as_echo_n "checking whether $as_decl_name is declared... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { #ifndef $as_decl_name #ifdef __cplusplus (void) $as_decl_use; #else (void) $as_decl_name; #endif #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_decl cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by ChkTeX $as_me 1.7.6, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CLEAN= # Check whether --enable-pcre was given. if test "${enable_pcre+set}" = set; then : enableval=$enable_pcre; else enable_pcre=yes fi # Check whether --enable-posixre was given. if test "${enable_posixre+set}" = set; then : enableval=$enable_posixre; else enable_posixre=yes fi # Check whether --enable-lacheck-replace was given. if test "${enable_lacheck_replace+set}" = set; then : enableval=$enable_lacheck_replace; else enable_lacheck_replace=no fi # Check whether --enable-debug-info was given. if test "${enable_debug_info+set}" = set; then : enableval=$enable_debug_info; else enable_debug_info=yes fi # Check whether --enable-coverage-testing was given. if test "${enable_coverage_testing+set}" = set; then : enableval=$enable_coverage_testing; else enable_coverage_testing=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether lacheck replacement should be installed" >&5 $as_echo_n "checking whether lacheck replacement should be installed... " >&6; } if test "$enable_lacheck_replace" = "yes"; then SCRIPTS="$SCRIPTS lacheck" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether runtime debug info should be used" >&5 $as_echo_n "checking whether runtime debug info should be used... " >&6; } if test "$enable_debug_info" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else $as_echo "#define STRIP_DEBUG 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether coverage testing is enabled" >&5 $as_echo_n "checking whether coverage testing is enabled... " >&6; } if test "$enable_coverage_testing" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } CFLAGS="${CFLAGS} -fprofile-arcs -ftest-coverage -O0" CLEAN="${CLEAN} \$(wildcard *.bb *.bbg *.da *.gcov)" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking CFLAGS for strict prototypes" >&5 $as_echo_n "checking CFLAGS for strict prototypes... " >&6; } if ${ac_cv_cflags_strict_prototypes+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_cflags_strict_prototypes="no, unknown" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_save_CFLAGS="$CFLAGS" for ac_arg in "-pedantic % -fstrict-prototypes -Wstrict-prototypes" "-pedantic % -Wstrict-prototypes" "-pedantic % -Wmissing-prototypes" "-pedantic % -Werror-implicit-function-declaration" "-pedantic % -Wimplicit-function-declaration" # do CFLAGS="$ac_save_CFLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_cflags_strict_prototypes=`echo $ac_arg | sed -e 's,.*% *,,'` ; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case ".$ac_cv_cflags_strict_prototypes" in .|.no|.no,*) ;; *) # sanity check with signal() from sys/signal.h cp config.log config.tmp cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { if (signal (SIGINT, SIG_IGN) == SIG_DFL) return 1; if (signal (SIGINT, SIG_IGN) != SIG_DFL) return 2; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if test `diff config.log config.tmp | grep -i warning | wc -l` != 0 then if test `diff config.log config.tmp | grep -i warning | wc -l` != 1 then ac_cv_cflags_strict_prototypes="no, suppressed, signal.h," ; fi ; fi else ac_cv_cflags_strict_prototypes="no, suppressed, signal.h" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext rm config.tmp ;; esac CFLAGS="$ac_save_CFLAGS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags_strict_prototypes" >&5 $as_echo "$ac_cv_cflags_strict_prototypes" >&6; } case ".$ac_cv_cflags_strict_prototypes" in .ok|.ok,*) ;; .|.no|.no,*) ;; *) if echo " $CFLAGS " | grep " $ac_cv_cflags_strict_prototypes " 2>&1 >/dev/null then { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS does contain \$ac_cv_cflags_strict_prototypes"; } >&5 (: CFLAGS does contain $ac_cv_cflags_strict_prototypes) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } else { { $as_echo "$as_me:${as_lineno-$LINENO}: : CFLAGS=\"\$CFLAGS \$ac_cv_cflags_strict_prototypes\""; } >&5 (: CFLAGS="$CFLAGS $ac_cv_cflags_strict_prototypes") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } CFLAGS="$CFLAGS $ac_cv_cflags_strict_prototypes" fi ;; esac ansi= if test -z "$ansi"; then msg="for C compiler warning flags" else msg="for C compiler warning and ANSI conformance flags" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking $msg" >&5 $as_echo_n "checking $msg... " >&6; } if ${vl_cv_prog_cc_warnings+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then cat > conftest.c <&1 | grep -i "WorkShop" > /dev/null 2>&1 && $CC -c -v -Xc conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="-v" else vl_cv_prog_cc_warnings="-v -Xc" fi elif $CC -V 2>&1 | grep -i "Digital UNIX Compiler" > /dev/null 2>&1 && $CC -c -verbose -w0 -warnprotos -std1 conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="-verbose -w0 -warnprotos" else vl_cv_prog_cc_warnings="-verbose -w0 -warnprotos -std1" fi elif $CC 2>&1 | grep -i "C for AIX Compiler" > /dev/null 2>&1 && $CC -c -qlanglvl=ansi -qinfo=all conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="-qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" else vl_cv_prog_cc_warnings="-qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd -qlanglvl=ansi" fi elif $CC -version 2>&1 | grep -i "MIPSpro Compilers" > /dev/null 2>&1 && $CC -c -fullwarn -ansi -ansiE conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="-fullwarn" else vl_cv_prog_cc_warnings="-fullwarn -ansi -ansiE" fi elif what $CC 2>&1 | grep -i "HP C Compiler" > /dev/null 2>&1 && $CC -c -Aa +w1 conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="+w1" else vl_cv_prog_cc_warnings="+w1 -Aa" fi elif $CC -V 2>&1 | grep "/SX" > /dev/null 2>&1 && $CC -c -pvctl,fullmsg -Xc conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="-pvctl,fullmsg" else vl_cv_prog_cc_warnings="-pvctl,fullmsg -Xc" fi elif $CC -V 2>&1 | grep -i "Cray" > /dev/null 2>&1 && $CC -c -h msglevel 2 conftest.c > /dev/null 2>&1 && test -f conftest.o; then if test -z "$ansi"; then vl_cv_prog_cc_warnings="-h msglevel 2" else vl_cv_prog_cc_warnings="-h msglevel 2 -h conform" fi fi rm -f conftest.* fi if test -n "$vl_cv_prog_cc_warnings"; then CFLAGS="$CFLAGS $vl_cv_prog_cc_warnings" else vl_cv_prog_cc_warnings="unknown" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $vl_cv_prog_cc_warnings" >&5 $as_echo "$vl_cv_prog_cc_warnings" >&6; } ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in perl5 perl do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PERL5+:} false; then : $as_echo_n "(cached) " >&6 else case $PERL5 in [\\/]* | ?:[\\/]*) ac_cv_path_PERL5="$PERL5" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy="$PATH:/usr/bin:/usr/local/bin" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PERL5="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PERL5=$ac_cv_path_PERL5 if test -n "$PERL5"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL5" >&5 $as_echo "$PERL5" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PERL5" && break done test -n "$PERL5" || PERL5="no" if test "$PERL5" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether perl is v5 or higher" >&5 $as_echo_n "checking whether perl is v5 or higher... " >&6; } if $PERL5 -e 'exit($] >= 5)'; then PERL5=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi fi if test "$PERL5" != no; then BUILT_SCRIPTS="$BUILT_SCRIPTS deweb" SCRIPTS="$SCRIPTS chkweb" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: chkweb will not be installed since you do not have perl5." >&5 $as_echo "$as_me: WARNING: chkweb will not be installed since you do not have perl5." >&2;} fi for ac_prog in 'groff -man -P-bu -Tlatin1' 'nroff -man' do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_GROFF+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$GROFF"; then ac_cv_prog_GROFF="$GROFF" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_GROFF="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi GROFF=$ac_cv_prog_GROFF if test -n "$GROFF"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GROFF" >&5 $as_echo "$GROFF" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$GROFF" && break done test -n "$GROFF" || GROFF="'nroff -man'" # Extract the first word of "latex", so it can be a program name with args. set dummy latex; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_LATEX+:} false; then : $as_echo_n "(cached) " >&6 else case $LATEX in [\\/]* | ?:[\\/]*) ac_cv_path_LATEX="$LATEX" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_LATEX="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_LATEX" && ac_cv_path_LATEX="no" ;; esac fi LATEX=$ac_cv_path_LATEX if test -n "$LATEX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LATEX" >&5 $as_echo "$LATEX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "dvips", so it can be a program name with args. set dummy dvips; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_DVIPS+:} false; then : $as_echo_n "(cached) " >&6 else case $DVIPS in [\\/]* | ?:[\\/]*) ac_cv_path_DVIPS="$DVIPS" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_DVIPS="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi DVIPS=$ac_cv_path_DVIPS if test -n "$DVIPS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DVIPS" >&5 $as_echo "$DVIPS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "lynx", so it can be a program name with args. set dummy lynx; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_LYNX+:} false; then : $as_echo_n "(cached) " >&6 else case $LYNX in [\\/]* | ?:[\\/]*) ac_cv_path_LYNX="$LYNX" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_LYNX="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi LYNX=$ac_cv_path_LYNX if test -n "$LYNX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LYNX" >&5 $as_echo "$LYNX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "latex2html", so it can be a program name with args. set dummy latex2html; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_LATEX2HTML+:} false; then : $as_echo_n "(cached) " >&6 else case $LATEX2HTML in [\\/]* | ?:[\\/]*) ac_cv_path_LATEX2HTML="$LATEX2HTML" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_LATEX2HTML="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi LATEX2HTML=$ac_cv_path_LATEX2HTML if test -n "$LATEX2HTML"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LATEX2HTML" >&5 $as_echo "$LATEX2HTML" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tgetent in -ltermlib" >&5 $as_echo_n "checking for tgetent in -ltermlib... " >&6; } if ${ac_cv_lib_termlib_tgetent+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ltermlib $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char tgetent (); int main () { return tgetent (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_termlib_tgetent=yes else ac_cv_lib_termlib_tgetent=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_termlib_tgetent" >&5 $as_echo "$ac_cv_lib_termlib_tgetent" >&6; } if test "x$ac_cv_lib_termlib_tgetent" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBTERMLIB 1 _ACEOF LIBS="-ltermlib $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tgetent in -ltermcap" >&5 $as_echo_n "checking for tgetent in -ltermcap... " >&6; } if ${ac_cv_lib_termcap_tgetent+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ltermcap $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char tgetent (); int main () { return tgetent (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_termcap_tgetent=yes else ac_cv_lib_termcap_tgetent=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_termcap_tgetent" >&5 $as_echo "$ac_cv_lib_termcap_tgetent" >&6; } if test "x$ac_cv_lib_termcap_tgetent" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBTERMCAP 1 _ACEOF LIBS="-ltermcap $LIBS" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } if eval \${$as_ac_Header+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_ac_Header { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in limits.h stat.h strings.h stdarg.h sys/stat.h termcap.h termlib.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if ${ac_cv_c_inline+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi ac_fn_c_find_uintX_t "$LINENO" "64" "ac_cv_c_uint64_t" case $ac_cv_c_uint64_t in #( no|yes) ;; #( *) $as_echo "#define _UINT64_T 1" >>confdefs.h cat >>confdefs.h <<_ACEOF #define uint64_t $ac_cv_c_uint64_t _ACEOF ;; esac for ac_func in vprintf do : ac_fn_c_check_func "$LINENO" "vprintf" "ac_cv_func_vprintf" if test "x$ac_cv_func_vprintf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VPRINTF 1 _ACEOF ac_fn_c_check_func "$LINENO" "_doprnt" "ac_cv_func__doprnt" if test "x$ac_cv_func__doprnt" = xyes; then : $as_echo "#define HAVE_DOPRNT 1" >>confdefs.h fi fi done for ac_func in access closedir fileno isatty opendir readdir stat strcasecmp strdup strlwr strtol do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_decl "$LINENO" "stpcpy" "ac_cv_have_decl_stpcpy" "$ac_includes_default" if test "x$ac_cv_have_decl_stpcpy" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STPCPY $ac_have_decl _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether PCRE regular expressions are enabled" >&5 $as_echo_n "checking whether PCRE regular expressions are enabled... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_pcre" >&5 $as_echo "$enable_pcre" >&6; } if test "$enable_pcre" = "yes"; then # Extract the first word of "pcre-config", so it can be a program name with args. set dummy pcre-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_WITH_PCRE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$WITH_PCRE"; then ac_cv_prog_WITH_PCRE="$WITH_PCRE" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_WITH_PCRE="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_WITH_PCRE" && ac_cv_prog_WITH_PCRE="no" fi fi WITH_PCRE=$ac_cv_prog_WITH_PCRE if test -n "$WITH_PCRE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WITH_PCRE" >&5 $as_echo "$WITH_PCRE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$WITH_PCRE" = "yes"; then $as_echo "#define HAVE_PCRE 1" >>confdefs.h CFLAGS="${CFLAGS} $(pcre-config --cflags-posix)" LDFLAGS="${LDFLAGS} $(pcre-config --libs-posix)" else $as_echo "#define HAVE_PCRE 0" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: PCRE library not found." >&5 $as_echo "$as_me: WARNING: PCRE library not found." >&2;} fi else $as_echo "#define HAVE_PCRE 0" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: PCRE regular expressions not enabled." >&5 $as_echo "$as_me: WARNING: PCRE regular expressions not enabled." >&2;} fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for POSIX extended regular expressions" >&5 $as_echo_n "checking for POSIX extended regular expressions... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef REG_EXTENDED yes # endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "yes" >/dev/null 2>&1; then : posix_ere=yes else posix_ere=no fi rm -f conftest* { $as_echo "$as_me:${as_lineno-$LINENO}: result: $posix_ere" >&5 $as_echo "$posix_ere" >&6; } if test "$WITH_PCRE" = "yes"; then $as_echo "#define HAVE_POSIX_ERE 0" >>confdefs.h else if test "$enable_posixre" = "yes"; then if test "$posix_ere" = "yes"; then $as_echo "#define HAVE_POSIX_ERE 1" >>confdefs.h else $as_echo "#define HAVE_POSIX_ERE 0" >>confdefs.h fi else $as_echo "#define HAVE_POSIX_ERE 0" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Regular expressions not enabled." >&5 $as_echo "$as_me: WARNING: Regular expressions not enabled." >&2;} fi fi ac_config_headers="$ac_config_headers config.h" ac_config_files="$ac_config_files stamp-h" ac_config_files="$ac_config_files Makefile deweb rmeheader ChkTeX.tex" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by ChkTeX $as_me 1.7.6, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ ChkTeX config.status 1.7.6 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "stamp-h") CONFIG_FILES="$CONFIG_FILES stamp-h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "deweb") CONFIG_FILES="$CONFIG_FILES deweb" ;; "rmeheader") CONFIG_FILES="$CONFIG_FILES rmeheader" ;; "ChkTeX.tex") CONFIG_FILES="$CONFIG_FILES ChkTeX.tex" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` 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=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac case $ac_file$ac_mode in "stamp-h":F) echo timestamp > stamp-h ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi chktex-1.7.6/configure.in000644 000765 000024 00000012664 12764707053 016160 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.6) AC_SUBST(SCRIPTS) AC_SUBST(BUILT_SCRIPTS) AC_SUBST(CLEAN) CLEAN= AC_ARG_ENABLE(pcre,[ --enable-pcre: Use PCRE to allow regular expressions in user warnings. (Default: yes, if available).],, enable_pcre=yes) AC_ARG_ENABLE(posixre,[ --enable-posixre: Use POSIX extended regular expressions in user warnings. (Default: yes, unless using PCRE).],, enable_posixre=yes) AC_ARG_ENABLE(lacheck-replace,[ --enable-lacheck-replace: Installs a lacheck replacement. (Default: no).],, enable_lacheck_replace=no) AC_ARG_ENABLE(debug-info,[ --enable-debug-info: Compile in miscellaneous runtime debugging information. (Default: yes).],, enable_debug_info=yes) AC_ARG_ENABLE(coverage-testing,[ --enable-coverage-testing: Activate coverage testing with gcov. (Default: no)],, enable_coverage_testing=no) AC_MSG_CHECKING(whether lacheck replacement should be installed) if test "$enable_lacheck_replace" = "yes"; then SCRIPTS="$SCRIPTS lacheck" AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) fi AC_MSG_CHECKING(whether runtime debug info should be used) if test "$enable_debug_info" = "yes"; then AC_MSG_RESULT(yes) else AC_DEFINE(STRIP_DEBUG, 1, Strip debug info) AC_MSG_RESULT(no) fi AC_MSG_CHECKING(whether coverage testing is enabled) if test "$enable_coverage_testing" = "yes"; then AC_MSG_RESULT(yes) CFLAGS="${CFLAGS} -fprofile-arcs -ftest-coverage -O0" CLEAN="${CLEAN} \$(wildcard *.bb *.bbg *.da *.gcov)" else AC_MSG_RESULT(no) fi dnl Check compiler and flags AC_PROG_CC AX_CFLAGS_STRICT_PROTOTYPES VL_PROG_CC_WARNINGS dnl Checks for programs. AC_PROG_INSTALL AC_PROG_LN_S AC_PROG_MKDIR_P AC_PATH_PROGS(PERL5, perl5 perl, no, $PATH:/usr/bin:/usr/local/bin) if test "$PERL5" != no; then AC_MSG_CHECKING(whether perl is v5 or higher) if $PERL5 -e 'exit($] >= 5)'; then PERL5=no AC_MSG_RESULT(no) else AC_MSG_RESULT(yes) fi fi if test "$PERL5" != no; then BUILT_SCRIPTS="$BUILT_SCRIPTS deweb" SCRIPTS="$SCRIPTS chkweb" else AC_MSG_WARN(chkweb will not be installed since you do not have perl5.) fi AC_CHECK_PROGS(GROFF, 'groff -man -P-bu -Tlatin1' 'nroff -man', 'nroff -man') AC_PATH_PROG(LATEX, latex, no) dnl if test "$LATEX" = no; then dnl AC_MSG_ERROR([No LaTeX on the system, cannot find latex program.]) dnl fi AC_PATH_PROG(DVIPS, dvips) AC_PATH_PROG(LYNX, lynx) AC_PATH_PROG(LATEX2HTML, latex2html) dnl Checks for libraries. AC_CHECK_LIB(termlib, tgetent) AC_CHECK_LIB(termcap, tgetent) dnl Checks for header files. AC_HEADER_STDC AC_HEADER_DIRENT AC_CHECK_HEADERS(limits.h stat.h strings.h stdarg.h dnl sys/stat.h termcap.h termlib.h unistd.h) dnl Checks for typedefs, structures, and compiler characteristics. AC_C_CONST AC_C_INLINE AC_TYPE_SIZE_T AC_TYPE_UINT64_T dnl Checks for library functions. AC_FUNC_VPRINTF AC_CHECK_FUNCS(access closedir fileno isatty opendir readdir stat dnl strcasecmp strdup strlwr strtol) dnl Checks for declarations. AC_CHECK_DECLS([stpcpy]) dnl Check for PCRE regular expression support AC_MSG_CHECKING(whether PCRE regular expressions are enabled) AC_MSG_RESULT($enable_pcre) if test "$enable_pcre" = "yes"; then AC_CHECK_PROG(WITH_PCRE, pcre-config, yes, no) if test "$WITH_PCRE" = "yes"; then AC_DEFINE(HAVE_PCRE, 1, Whether PCRE can be used for user warnings.) CFLAGS="${CFLAGS} $(pcre-config --cflags-posix)" LDFLAGS="${LDFLAGS} $(pcre-config --libs-posix)" else AC_DEFINE(HAVE_PCRE, 0) AC_MSG_WARN(PCRE library not found.) fi else AC_DEFINE(HAVE_PCRE, 0) AC_MSG_WARN(PCRE regular expressions not enabled.) fi dnl Check for POSIX extended regular expression support AC_MSG_CHECKING(for POSIX extended regular expressions) AC_EGREP_CPP([yes], [#include #ifdef REG_EXTENDED yes # endif ], posix_ere=yes, posix_ere=no) AC_MSG_RESULT($posix_ere) if test "$WITH_PCRE" = "yes"; then AC_DEFINE(HAVE_POSIX_ERE, 0, Whether POSIX ERE can be used for user warnings.) else if test "$enable_posixre" = "yes"; then if test "$posix_ere" = "yes"; then AC_DEFINE(HAVE_POSIX_ERE, 1) else AC_DEFINE(HAVE_POSIX_ERE, 0) fi else AC_DEFINE(HAVE_POSIX_ERE, 0) AC_MSG_WARN(Regular expressions not enabled.) fi fi AC_CONFIG_HEADER(config.h) AC_CONFIG_FILES([stamp-h], [echo timestamp > stamp-h]) AC_OUTPUT(Makefile deweb rmeheader ChkTeX.tex) chktex-1.7.6/COPYING000644 000765 000024 00000044703 11057723555 014700 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.6/deweb.1000644 000765 000024 00000005705 11057723555 015014 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.6/deweb.in000644 000765 000024 00000005474 12600666273 015263 0ustar00iandrusstaff000000 000000 #! @PERL5@ # deweb v1.2, kills the C sections of a CWEB file, for passing to ChkTeX. # Copyright (C) 1996 Jens T. Berger Thielemann # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Contact the author at: # Jens Berger # Spektrumvn. 4 # N-0666 Oslo # Norway # E-mail: # # # 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.6/FindErrs.c000644 000765 000024 00000166265 12764705172 015536 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; /***************************** 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 }; /* * String used to delimit a line suppression. This string must be * followed immediately by the number of the warning to be suppressed. * If more than one warning is to be suppressed, then multiple copies * of LineSuppDelim+number must be used. */ const char LineSuppDelim[] = "chktex "; /* * String used to delimit a file suppression. This string must be * followed immediately by the number of the warning to be suppressed. * If more than one warning is to be suppressed, then multiple copies * of FileSuppDelim+number must be used. */ const char FileSuppDelim[] = "chktex-file "; /* * A bit field used to hold the suppressions for the current line. */ static uint64_t LineSuppressions; /* * A bit field used to hold the suppressions of numbered user warnings * for the current line. */ static uint64_t UserLineSuppressions; static unsigned long Line; static const char *RealBuf; static char *BufPtr; static int ItFlag = efNone; static int MathFlag = efNone; NEWBUF(Buf, BUFSIZ); NEWBUF(CmdBuffer, BUFSIZ); NEWBUF(ArgBuffer, BUFSIZ); static enum ErrNum PerformCommand(const char *Cmd, char *Arg); #ifdef isdigit CTYPE(isdigit) #else # define my_isdigit isdigit #endif #ifdef isalpha CTYPE(isalpha) #else # define my_isalpha isalpha #endif /* * Reads in a TeX token from Src and puts it in Dest. * */ static char *GetLTXToken(char *Src, char *Dest) { int Char; if (Src && *Src) { if (*Src == '\\') { *Dest++ = *Src++; Char = *Dest++ = *Src++; if (istex(Char)) { while (istex(Char)) Char = *Dest++ = *Src++; Src--; Dest--; } } else *Dest++ = *Src++; *Dest = 0; } else Src = NULL; return (Src); } /* * Scans the `SrcBuf' for a LaTeX arg, and puts that arg into `Dest'. * `Until' specifies what we'll copy. Assume the text is * "{foo}bar! qux} baz". * GET_TOKEN => "{foo}" * GET_STRIP_TOKEN => "foo" * '!' => "{foo}bar!" (i.e. till the first "!") * Returns NULL if we can't find the argument, ptr to the first character * after the argument in other cases. * * If one of the tokens found is in the wl wordlist, and we're in the * outer most paren, and Until isn't a single character, we'll stop. * You may pass NULL as wl. * * We assume that you've previously skipped over leading spaces. * */ #define GET_TOKEN 256 #define GET_STRIP_TOKEN 257 static char *GetLTXArg(char *SrcBuf, char *OrigDest, const int Until, struct WordList *wl) { char *Retval; char *TmpPtr; char *Dest = OrigDest; unsigned long DeliCnt = 0; *Dest = 0; TmpPtr = SrcBuf; switch (Until) { case GET_STRIP_TOKEN: case GET_TOKEN: while ((Retval = GetLTXToken(TmpPtr, Dest))) { switch (*Dest) { case '{': DeliCnt++; break; case '}': DeliCnt--; } Dest += Retval - TmpPtr; TmpPtr = Retval; if (!DeliCnt || ((DeliCnt == 1) && wl && HasWord(Dest, wl))) break; } if (Retval && (*OrigDest == '{') && (Until == GET_STRIP_TOKEN)) { int len = strlen(OrigDest+1); memmove(OrigDest, OrigDest + 1, len + 1); /* Strip the last '}' off */ OrigDest[len-1] = 0; } break; default: DeliCnt = TRUE; while ((Retval = GetLTXArg(TmpPtr, Dest, GET_TOKEN, NULL))) { if (*Dest == Until) DeliCnt = FALSE; Dest += Retval - TmpPtr; TmpPtr = Retval; if (!DeliCnt) break; } break; } *Dest = 0; return (Retval); } static char *PreProcess(void) { char *TmpPtr; /* Reset any line suppressions */ LineSuppressions = FileSuppressions; UserLineSuppressions = UserFileSuppressions; /* Kill comments. */ strcpy(Buf, RealBuf); TmpPtr = Buf; LastWasComment = FALSE; while ((TmpPtr = strchr(TmpPtr, '%'))) { char *EscapePtr = TmpPtr; int NumBackSlashes = 0; while (EscapePtr != Buf && EscapePtr[-1] == '\\') { ++NumBackSlashes; --EscapePtr; } /* If there is an even number of backslashes, then it's a comment. */ if ((NumBackSlashes % 2) == 0) { LastWasComment = TRUE; PSERR(TmpPtr - Buf, 1, emComment); *TmpPtr = 0; /* Check for line suppressions */ if (!NoLineSupp) { int error; const int MaxSuppressionBits = 63; /* Convert to lowercase to compare with LineSuppDelim */ EscapePtr = ++TmpPtr; /* move past NUL terminator */ while ( *EscapePtr ) { *EscapePtr = tolower((unsigned char)*EscapePtr); ++EscapePtr; } EscapePtr = TmpPtr; /* Save it for later */ while ((TmpPtr = strstr(TmpPtr, FileSuppDelim))) { TmpPtr += STRLEN(FileSuppDelim); error = atoi(TmpPtr); if (abs(error) > MaxSuppressionBits) { PrintPrgErr(pmSuppTooHigh, error, MaxSuppressionBits); } if (error > 0) { FileSuppressions |= ((uint64_t)1 << error); LineSuppressions |= ((uint64_t)1 << error); } else { UserFileSuppressions |= ((uint64_t)1 << (-error)); UserLineSuppressions |= ((uint64_t)1 << (-error)); } } TmpPtr = EscapePtr; while ((TmpPtr = strstr(TmpPtr, LineSuppDelim))) { TmpPtr += STRLEN(LineSuppDelim); error = atoi(TmpPtr); if (abs(error) > MaxSuppressionBits) { PrintPrgErr(pmSuppTooHigh, error, MaxSuppressionBits); } if (error > 0) { LineSuppressions |= ((uint64_t)1 << error); } else { UserLineSuppressions |= ((uint64_t)1 << (-error)); } } } break; } TmpPtr++; } return (Buf); } /* * Interpret environments */ static void PerformEnv(char *Env, int Begin) { static char VBStr[BUFSIZ] = ""; if (HasWord(Env, &MathEnvir)) { MathMode += Begin ? 1 : -1; MathMode = max(MathMode, 0); } if (Begin && HasWord(Env, &VerbEnvir)) { VerbMode = TRUE; strcpy(VBStr, "\\end{"); strcat(VBStr, Env); strcat(VBStr, "}"); VerbStr = VBStr; } } static char *SkipVerb(void) { char *TmpPtr = BufPtr; int TmpC; if (VerbMode && BufPtr) { if (!(TmpPtr = strstr(BufPtr, VerbStr))) BufPtr = &BufPtr[strlen(BufPtr)]; else { VerbMode = FALSE; BufPtr = &TmpPtr[strlen(VerbStr)]; SKIP_AHEAD(BufPtr, TmpC, LATEX_SPACE(TmpC)); if (*BufPtr) PSERR(BufPtr - Buf, strlen(BufPtr) - 2, emIgnoreText); } } return (TmpPtr); } #define CHECKDOTS(wordlist, dtval) \ for(i = 0; (i < wordlist.Stack.Used) && !(Back && Front); i++) \ { if(!strafter(PstPtr, wordlist.Stack.Data[i])) \ Back = dtval; \ if(!strinfront(PrePtr, wordlist.Stack.Data[i])) \ Front = dtval; } /* * Checks that the dots are correct */ static enum DotLevel CheckDots(char *PrePtr, char *PstPtr) { unsigned long i; int TmpC; enum DotLevel Front = dtUnknown, Back = dtUnknown; if (MathMode) { PrePtr--; #define SKIP_EMPTIES(macro, ptr) macro(ptr, TmpC, \ (LATEX_SPACE(TmpC) || (TmpC == '{') || (TmpC == '}'))) SKIP_EMPTIES(SKIP_BACK, PrePtr); SKIP_EMPTIES(SKIP_AHEAD, PstPtr); CHECKDOTS(CenterDots, dtCDots); if (!(Front && Back)) { CHECKDOTS(LowDots, dtLDots); } return (Front & Back); } else return (dtLDots); } static const char *Dot2Str(enum DotLevel dl) { const char *Retval = INTERNFAULT; switch (dl) { case dtUnknown: Retval = "\\cdots or \\ldots"; break; case dtDots: Retval = "\\dots"; break; case dtCDots: Retval = "\\cdots"; break; case dtLDots: Retval = "\\ldots"; break; } return Retval; } /* * Wipes a command, according to the definition in WIPEARG */ static void WipeArgument(const char *Cmd, char *CmdPtr) { unsigned long CmdLen = strlen(Cmd); const char *Format; char *TmpPtr; int c, TmpC; if (Cmd && *Cmd) { TmpPtr = &CmdPtr[CmdLen]; Format = &Cmd[CmdLen + 1]; while (TmpPtr && *TmpPtr && *Format) { switch (c = *Format++) { case '*': SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC)); if (*TmpPtr == '*') TmpPtr++; break; case '[': SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC)); if (*TmpPtr == '[') TmpPtr = GetLTXArg(TmpPtr, ArgBuffer, ']', NULL); break; case '(': SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC)); if (*TmpPtr == '(') TmpPtr = GetLTXArg(TmpPtr, ArgBuffer, ')', NULL); break; case '{': SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC)); TmpPtr = GetLTXArg(TmpPtr, ArgBuffer, GET_TOKEN, NULL); case '}': case ']': case ')': break; default: PrintPrgErr(pmWrongWipeTemp, &Cmd[strlen(Cmd) + 1]); break; } } if (TmpPtr) strwrite(CmdPtr+CmdLen, VerbClear, TmpPtr - CmdPtr - CmdLen); else strxrep(CmdPtr+CmdLen, "()[]{}", *VerbClear); } } /* * Checks italic. * */ static void CheckItal(const char *Cmd) { int TmpC; char *TmpPtr; if (HasWord(Cmd, &NonItalic)) ItState = itOff; else if (HasWord(Cmd, &Italic)) ItState = itOn; else if (HasWord(Cmd, &ItalCmd)) { TmpPtr = BufPtr; SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC)); if (*TmpPtr == '{') { ItFlag = ItState ? efItal : efNoItal; ItState = itOn; } } } /* * Interpret isolated commands. * */ static void PerformBigCmd(char *CmdPtr) { char *TmpPtr; const char *ArgEndPtr; unsigned long CmdLen = strlen(CmdBuffer); int TmpC; enum ErrNum ErrNum; struct ErrInfo *ei; enum DotLevel dotlev, realdl = dtUnknown; TmpPtr = BufPtr; SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC)); ArgEndPtr = GetLTXArg(TmpPtr, ArgBuffer, GET_STRIP_TOKEN, NULL); /* Kill `\verb' commands */ if (WipeVerb) { if (!strcmp(CmdBuffer, "\\verb")) { if (*BufPtr && (*BufPtr != '*' || BufPtr[1])) { if (*BufPtr == '*') TmpPtr = strchr(&BufPtr[2], BufPtr[1]); else TmpPtr = strchr(&BufPtr[1], *BufPtr); if (TmpPtr) strwrite(CmdPtr, VerbClear, (TmpPtr - CmdPtr) + 1); else PSERR(CmdPtr - Buf, 5, emNoArgFound); } } } if (HasWord(CmdBuffer, &IJAccent)) { if (ArgEndPtr) { TmpPtr = ArgBuffer; SKIP_AHEAD(TmpPtr, TmpC, TmpC == '{'); /* } */ if ((*TmpPtr == 'i') || (*TmpPtr == 'j')) PrintError(CurStkName(&InputStack), RealBuf, CmdPtr - Buf, (long) strlen(CmdBuffer), Line, emAccent, CmdBuffer, *TmpPtr, MathMode ? "math" : ""); } else PSERR(CmdPtr - Buf, CmdLen, emNoArgFound); } if (HasWord(CmdBuffer, &NotPreSpaced) && isspace((unsigned char)CmdPtr[-1])) PSERRA(CmdPtr - Buf - 1, 1, emRemPSSpace, CmdBuffer); if ((TmpPtr = HasWord(CmdBuffer, &NoCharNext))) { char *BPtr = BufPtr; TmpPtr += strlen(TmpPtr) + 1; SKIP_AHEAD(BPtr, TmpC, LATEX_SPACE(TmpC)); if (strchr(TmpPtr, *BPtr)) { PSERR2(CmdPtr - Buf, CmdLen, emNoCharMean, CmdBuffer, *BPtr); } } /* LaTeX environment tracking */ if (!strcmp(CmdBuffer, "\\begin") || !strcmp(CmdBuffer, "\\end")) { if (ArgEndPtr) { if (!strcmp(ArgBuffer, "document")) InHeader = FALSE; if (CmdBuffer[1] == 'b') { if (!(PushErr(ArgBuffer, Line, CmdPtr - Buf, CmdLen, RealBuf, &EnvStack))) PrintPrgErr(pmNoStackMem); } else { if ((ei = PopErr(&EnvStack))) { if (strcmp(ei->Data, ArgBuffer)) PrintError(CurStkName(&InputStack), RealBuf, CmdPtr - Buf, (long) strlen(CmdBuffer), Line, emExpectC, ei->Data, ArgBuffer); FreeErrInfo(ei); } else PrintError(CurStkName(&InputStack), RealBuf, CmdPtr - Buf, (long) strlen(CmdBuffer), Line, emSoloC, ArgBuffer); } PerformEnv(ArgBuffer, (int) CmdBuffer[1] == 'b'); } else PSERR(CmdPtr - Buf, CmdLen, emNoArgFound); } /* ConTeXt \start \stop tracking */ if (!strncmp(CmdBuffer, "\\start", 6) || !strncmp(CmdBuffer, "\\stop", 5)) { if (CmdBuffer[3] == 'a') /* start */ { TmpPtr = CmdBuffer + 6; if (!(PushErr(TmpPtr, Line, CmdPtr - Buf + 6, CmdLen - 6, RealBuf, &EnvStack))) PrintPrgErr(pmNoStackMem); } else { TmpPtr = CmdBuffer + 5; if ((ei = PopErr(&EnvStack))) { if (strcmp(ei->Data, TmpPtr)) PrintError(CurStkName(&InputStack), RealBuf, CmdPtr - Buf + 5, (long) strlen(TmpPtr), Line, emExpectC, ei->Data, TmpPtr); FreeErrInfo(ei); } else { PrintError(CurStkName(&InputStack), RealBuf, CmdPtr - Buf, (long) strlen(CmdBuffer), Line, emSoloC, TmpPtr); } } /* TODO: Do I need to call PerformEnv? */ /* It handles math and verbatim environments */ } CheckItal(CmdBuffer); if ((ErrNum = PerformCommand(CmdBuffer, BufPtr))) PSERR(CmdPtr - Buf, CmdLen, ErrNum); if (!strcmp(CmdBuffer, "\\cdots")) realdl = dtCDots; if (!strcmp(CmdBuffer, "\\ldots")) realdl = dtLDots; if (!strcmp(CmdBuffer, "\\dots")) realdl = dtLDots; if (realdl != dtUnknown) { dotlev = CheckDots(CmdPtr, BufPtr); if (dotlev && (dotlev != realdl)) { const char *cTmpPtr = Dot2Str(dotlev); PSERRA(CmdPtr - Buf, CmdLen, emEllipsis, cTmpPtr); } } if ((TmpPtr = HasWord(CmdBuffer, &WipeArg))) WipeArgument(TmpPtr, CmdPtr); } /* * Check user abbreviations. Pass a pointer to the `.'; * also ensure that it's followed by spaces, etc. * * Note: We assume that all abbrevs have been transferred from * AbbrevCase into Abbrev. */ static void CheckAbbrevs(const char *Buffer) { long i; char *TmpPtr; const char *AbbPtr; if (INUSE(emInterWord)) { TmpPtr = TmpBuffer + Abbrev.MaxLen + 2; *TmpPtr = 0; AbbPtr = Buffer; for (i = Abbrev.MaxLen; i >= 0; i--) { *--TmpPtr = *AbbPtr--; if (!isalpha((unsigned char)*AbbPtr) && HasWord(TmpPtr, &Abbrev)) PSERR(Buffer - Buf + 1, 1, emInterWord); if (!*AbbPtr) break; } } } /* * Check misc. things which can't be included in the main loop. * */ static void CheckRest(void) { unsigned long Count; long CmdLen; char *UsrPtr; /* Search for user-specified warnings */ #if ! (HAVE_PCRE || HAVE_POSIX_ERE) if (INUSE(emUserWarnRegex) && UserWarnRegex.Stack.Used > 0) { PrintPrgErr(pmNoRegExp); ClearWord( &UserWarnRegex ); } else if (INUSE(emUserWarn)) { strcpy(TmpBuffer, Buf); } #else if (INUSE(emUserWarnRegex) && UserWarnRegex.Stack.Used > 0) { static char error[ERROR_STRING_SIZE]; static regmatch_t MatchVector[NUM_MATCHES]; int rc; int len = strlen(TmpBuffer); strcpy(TmpBuffer, Buf); /* Compile all regular expressions if not already compiled. */ if ( !RegexArray && UserWarnRegex.Stack.Used > 0 ) { RegexArray = (regex_t*)malloc( sizeof(regex_t) * UserWarnRegex.Stack.Used ); if (!RegexArray) { /* Allocation failed. */ PrintPrgErr(pmNoRegexMem); ClearWord(&UserWarnRegex); NumRegexes = 0; } else { NumRegexes = 0; FORWL(Count, UserWarnRegex) { char *pattern = UserWarnRegex.Stack.Data[Count]; char *CommentEnd = NULL; /* See if it's got a special name that it goes by. Only use the comment if it's at the very beginning. */ if ( strncmp(pattern,"(?#",3) == 0 ) { CommentEnd = strchr(pattern, ')'); /* TODO: check for PCRE/POSIX only regexes */ if ( CommentEnd != NULL ) { *CommentEnd = '\0'; /* We're leaking a little here, but this was never freed until exit anyway... */ UserWarnRegex.Stack.Data[NumRegexes] = pattern+3; /* Compile past the end of the comment so that it works with POSIX too. */ pattern = CommentEnd + 1; } } /* Ignore PCRE and POSIX specific regexes. * This is mostly to make testing easier. */ if ( strncmp(pattern,"PCRE:",5) == 0 ) { #if HAVE_PCRE pattern += 5; #else continue; #endif } if ( strncmp(pattern,"POSIX:",6) == 0 ) { #if HAVE_POSIX_ERE pattern += 6; #else continue; #endif } rc = regcomp((regex_t*)(&RegexArray[NumRegexes]), pattern, REGEX_FLAGS); /* Compilation failed: print the error message */ if (rc != 0) { /* TODO: decide whether a non-compiling regex should completely stop, or just be ignored */ regerror(rc,(regex_t*)(&RegexArray[NumRegexes]), error, ERROR_STRING_SIZE); PrintPrgErr(pmRegexCompileFailed, pattern, error); } else { if ( !CommentEnd ) { ((char*)UserWarnRegex.Stack.Data[NumRegexes])[0] = '\0'; } ++NumRegexes; } } } } for (Count = 0; Count < NumRegexes; ++Count) { int offset = 0; char *ErrMessage = UserWarnRegex.Stack.Data[Count]; const int NamedWarning = strlen(ErrMessage) > 0; while (offset < len) { /* Check if this warning should be suppressed. */ if (UserLineSuppressions && NamedWarning) { /* The warning can be named with positive or negative numbers. */ int UserWarningNumber = abs(atoi(ErrMessage)); if (UserLineSuppressions & ((uint64_t)1 << UserWarningNumber)) { break; } } rc = regexec( (regex_t*)(&RegexArray[Count]), TmpBuffer+offset, NUM_MATCHES, MatchVector, 0); /* Matching failed: handle error cases */ if (rc != 0) { switch(rc) { case REG_NOMATCH: /* no match, no problem */ break; default: regerror(rc, (regex_t*)(&RegexArray[Count]), error, ERROR_STRING_SIZE); PrintPrgErr(pmRegexMatchingError, error); break; } offset = len; /* break out of loop */ } else { #define MATCH (MatchVector[0]) if ( NamedWarning ) { /* User specified error message */ PSERR2(offset + MATCH.rm_so, MATCH.rm_eo - MATCH.rm_so, emUserWarnRegex, strlen(ErrMessage), ErrMessage); } else { /* Default -- show the match */ PSERR2(offset + MATCH.rm_so, MATCH.rm_eo - MATCH.rm_so, emUserWarnRegex, /* The format specifier expects an int */ (int)(MATCH.rm_eo - MATCH.rm_so), TmpBuffer + offset + MATCH.rm_so); } if ( MATCH.rm_eo == 0 ) { /* Break out of loop if the match was empty. * This avoids an infinite loop when the match * is empty, e.g $ */ offset = len; } else { offset += MATCH.rm_eo; } #undef MATCH } } } } else if (INUSE(emUserWarn)) { strcpy(TmpBuffer, Buf); } #endif if (INUSE(emUserWarn)) { FORWL(Count, UserWarn) { for (UsrPtr = TmpBuffer; (UsrPtr = strstr(UsrPtr, UserWarn.Stack.Data[Count])); UsrPtr++) { CmdLen = strlen(UserWarn.Stack.Data[Count]); PSERRA(UsrPtr - TmpBuffer, CmdLen, emUserWarn, UserWarn.Stack.Data[Count]); } } strlwr(TmpBuffer); FORWL(Count, UserWarnCase) { for (UsrPtr = TmpBuffer; (UsrPtr = strstr(UsrPtr, UserWarnCase.Stack.Data[Count])); UsrPtr++) { CmdLen = strlen(UserWarnCase.Stack.Data[Count]); PSERRA(UsrPtr - TmpBuffer, CmdLen, emUserWarn, UserWarnCase.Stack.Data[Count]); } } } } /* * Checks that the dash-len is correct. */ static void CheckDash(void) { char *TmpPtr; int TmpC; long TmpCount, Len; struct WordList *wl = NULL; unsigned long i; int Errored; char *PrePtr = &BufPtr[-2]; TmpPtr = BufPtr; SKIP_AHEAD(TmpPtr, TmpC, TmpC == '-'); TmpCount = TmpPtr - BufPtr + 1; if (MathMode) { if (TmpCount > 1) HERE(TmpCount, emWrongDash); } else { if (LATEX_SPACE(*PrePtr) && LATEX_SPACE(*TmpPtr)) wl = &WordDash; if (isdigit((unsigned char)*PrePtr) && isdigit((unsigned char)*TmpPtr)) wl = &NumDash; if (isalpha((unsigned char)*PrePtr) && isalpha((unsigned char)*TmpPtr)) wl = &HyphDash; if (wl) { Errored = TRUE; FORWL(i, *wl) { Len = strtol(wl->Stack.Data[i], NULL, 0); if (TmpCount == Len) { Errored = FALSE; break; } } if (Errored) { struct WordList *el = &DashExcpt; FORWL(i, *el) { char *exception = el->Stack.Data[i]; char *e = exception; while ( *e ) { if ( *e == '-' && 0 == strncmp( BufPtr, e, strlen(e) ) ) { char *f = e; TmpPtr = BufPtr; while ( f > exception && *(--f) == *(--TmpPtr) ) { /* Nothing */ } if ( f <= exception && *f == *TmpPtr ) { Errored = FALSE; break; } } ++e; } if ( !Errored ) break; } } if (Errored) HERE(TmpCount, emWrongDash); } } } /* * Pushes and pops nesting characters. * */ static void HandleBracket(char Char) { unsigned long BrOffset; /* Offset into BrOrder array */ struct ErrInfo *ei; char TmpC, Match; char ABuf[2], BBuf[2]; char *TmpPtr; AddBracket(Char); if ((BrOffset = BrackIndex(Char)) != ~0UL) { if (BrOffset & 1) /* Closing bracket of some sort */ { if ((ei = PopErr(&CharStack))) { Match = MatchBracket(*(ei->Data)); /* Return italics to proper state */ if (ei->Flags & efNoItal) { if (ItState == itOn) { TmpPtr = BufPtr; SKIP_AHEAD(TmpPtr, TmpC, TmpC == '}'); /* If the next character is a period or comma, * or the last character is, then it's not an * error. */ /* Checking 2 characters back seems dangerous, * but it's already done in CheckDash. */ if ( !strchr(LTX_SmallPunc, *TmpPtr) && !strchr(LTX_SmallPunc, *(TmpPtr-2)) ) HERE(1, emNoItFound); } ItState = FALSE; } else if (ei->Flags & efItal) ItState = TRUE; /* Same for math mode */ if (ei->Flags & efMath) { MathMode = 1; } else if (ei->Flags & efNoMath) { MathMode = 0; } FreeErrInfo(ei); } else Match = 0; if (Match != Char) { ABuf[0] = Match; BBuf[0] = Char; ABuf[1] = BBuf[1] = 0; if (Match) PrintError(CurStkName(&InputStack), RealBuf, BufPtr - Buf - 1, 1, Line, emExpectC, ABuf, BBuf); else HEREA(1, emSoloC, BBuf); } } else /* Opening bracket of some sort */ { if ((ei = PushChar(Char, Line, BufPtr - Buf - 1, &CharStack, RealBuf))) { if (Char == '{') { switch (ItFlag) { default: ei->Flags |= ItFlag; ItFlag = efNone; break; case efNone: ei->Flags |= ItState ? efItal : efNoItal; } switch (MathFlag) { default: ei->Flags |= MathFlag; MathFlag = efNone; break; case efNone: ei->Flags |= MathMode ? efMath : efNoMath; } } } else PrintPrgErr(pmNoStackMem); } } } /* * Checks to see if CmdBuffer matches any of the words in Silent, or * any of the regular expressions in SilentCase. * */ int CheckSilentRegex(void) { #if ! (HAVE_PCRE || HAVE_POSIX_ERE) return HasWord(CmdBuffer, &Silent) != NULL; #else static char error[ERROR_STRING_SIZE]; char *pattern; char *tmp; int i; int rc; int len = 4; /* Enough for the (?:) */ /* Initialize regular expression */ if (INUSE(emSpaceTerm) && SilentCase.Stack.Used > 0) { /* Find the total length we need */ /* There is 1 for | and the final for null terminator */ FORWL(i, SilentCase) { len += strlen( SilentCase.Stack.Data[i] ) + 1; } /* (A|B|...) */ tmp = (pattern = (char*)malloc( sizeof(char) * len )); #if HAVE_PCRE tmp = stpcpy(tmp,"(?:"); #else tmp = stpcpy(tmp,"("); #endif FORWL(i, SilentCase) { tmp = stpcpy(tmp, SilentCase.Stack.Data[i]); *tmp++ = '|'; } tmp = stpcpy(tmp - 1, ")"); SilentRegex = malloc( sizeof(regex_t) ); rc = regcomp(SilentRegex, pattern, REGEX_FLAGS); /* Compilation failed: print the error message */ if (rc != 0) { regerror(rc, SilentRegex, error, ERROR_STRING_SIZE); PrintPrgErr(pmRegexCompileFailed, pattern, error); SilentRegex = NULL; } /* Ensure we won't initialize it again */ SilentCase.Stack.Used = 0; free(pattern); } /* Check against the normal */ if ( HasWord(CmdBuffer, &Silent) ) return 1; if (!SilentRegex) return 0; /* Check against the regexes */ rc = regexec(SilentRegex, CmdBuffer, 0, NULL, 0); if (rc == 0) return 1; /* Matching failed: handle error cases */ switch(rc) { case REG_NOMATCH: return 0; break; default: regerror(rc, SilentRegex, error, ERROR_STRING_SIZE); PrintPrgErr(pmRegexMatchingError, error); break; } return 0; #endif } /* * Searches the `Buf' for possible errors, and prints the errors. `Line' * is supplied for error printing. */ int FindErr(const char *_RealBuf, const unsigned long _Line) { char *CmdPtr; /* We'll have to copy each command out. */ char *PrePtr; /* Ptr to char in front of command, NULL if * the cmd appears as the first character */ char *TmpPtr; /* Temporary pointer */ char *ErrPtr; /* Ptr to where an error started */ char TmpC, /* Just a temp var used throughout the proc. */ MatchC, Char; /* Char. currently processed */ unsigned long CmdLen; /* Length of misc. things */ int MixingQuotes; int (*pstcb) (int c); enum DotLevel dotlev; FoundErr = EXIT_SUCCESS; if (_RealBuf) { RealBuf = _RealBuf; Line = _Line; if (!LastWasComment) { SeenSpace = TRUE; } BufPtr = PreProcess(); BufPtr = SkipVerb(); /* Skip past leading whitespace which is insignificant in TeX to avoid * spurious warnings (Delete this space to maintain correct * pagereferences). If we have seen a space we don't _need_ to skip * past, and doing so misses Message 30 (Multiple spaces detected). We * can miss some of Message 30 in the "not SeenSpace" case too, but I * think it's less important, since Message 30 is for newbies. */ if (!SeenSpace && BufPtr) { SKIP_AHEAD(BufPtr, TmpC, LATEX_SPACE(TmpC)); } while (BufPtr && *BufPtr) { PrePtr = BufPtr - 1; Char = *BufPtr++; if (isspace((unsigned char)Char)) Char = ' '; switch (Char) { case '~': TmpPtr = NULL; if (isspace((unsigned char)*PrePtr)) TmpPtr = PrePtr; else if (isspace((unsigned char)*BufPtr)) TmpPtr = BufPtr; if (TmpPtr) PSERR(TmpPtr - Buf, 1, emDblSpace); break; case 'X': case 'x': TmpPtr = PrePtr; SKIP_BACK(TmpPtr, TmpC, (LATEX_SPACE(TmpC) || strchr("{}$", TmpC))); if (isdigit((unsigned char)*TmpPtr)) { TmpPtr = BufPtr; SKIP_AHEAD(TmpPtr, TmpC, (LATEX_SPACE(TmpC) || strchr("{}$", TmpC))); if (isdigit((unsigned char)*TmpPtr)) HERE(1, emUseTimes); } /* FALLTHRU */ /* CTYPE: isalpha() */ case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': /* case 'x': */ case 'y': case 'z': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': /* case 'X': */ case 'Y': case 'Z': if (!isalpha((unsigned char)*PrePtr) && (*PrePtr != '\\') && MathMode) { TmpPtr = BufPtr; CmdPtr = CmdBuffer; do { *CmdPtr++ = Char; Char = *TmpPtr++; } while (isalpha((unsigned char)Char)); *CmdPtr = 0; if (HasWord(CmdBuffer, &MathRoman)) HEREA(strlen(CmdBuffer), emWordCommand, CmdBuffer); } break; case ' ': TmpPtr = BufPtr; SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC)); if (*TmpPtr && *PrePtr) { if ((TmpPtr - BufPtr) > 0) { HERE(TmpPtr - BufPtr + 1, emMultiSpace); strwrite(BufPtr, VerbClear, TmpPtr - BufPtr - 1); } } break; case '.': if ((Char == *BufPtr) && (Char == BufPtr[1])) { const char *cTmpPtr; dotlev = CheckDots(&PrePtr[1], &BufPtr[2]); cTmpPtr = Dot2Str(dotlev); HEREA(3, emEllipsis, cTmpPtr); } /* Regexp: "([^A-Z@.])\.[.!?:]*\s+[a-z]" */ TmpPtr = BufPtr; SKIP_AHEAD(TmpPtr, TmpC, strchr(LTX_EosPunc, TmpC)); if (LATEX_SPACE(*TmpPtr)) { if (!isupper((unsigned char)*PrePtr) && (*PrePtr != '@') && (*PrePtr != '.')) { SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC)); if (islower((unsigned char)*TmpPtr)) PSERR(BufPtr - Buf, 1, emInterWord); else CheckAbbrevs(&BufPtr[-1]); } } /* FALLTHRU */ case ':': case '?': case '!': case ';': /* Regexp: "[A-Z][A-Z][.!?:;]\s+" */ if (isspace((unsigned char)*BufPtr) && isupper((unsigned char)*PrePtr) && (isupper((unsigned char)PrePtr[-1]) || (Char != '.'))) HERE(1, emInterSent); /* FALLTHRU */ case ',': if (isspace((unsigned char)*PrePtr) && !(isdigit((unsigned char)*BufPtr) && ((BufPtr[-1] == '.') || (BufPtr[-1] == ',')))) PSERR(PrePtr - Buf, 1, emSpacePunct); if (MathMode && (((*BufPtr == '$') && (BufPtr[1] != '$')) || (!strafter(BufPtr, "\\)")))) HEREA(1, emPunctMath, "outside inner"); if (!MathMode && (((*PrePtr == '$') && (PrePtr[-1] == '$')) || (!strinfront(PrePtr, "\\]")))) HEREA(1, emPunctMath, "inside display"); break; case '\'': case '`': if ((Char == *BufPtr) && (Char == BufPtr[1])) { PrintError(CurStkName(&InputStack), RealBuf, BufPtr - Buf - 1, 3, Line, emThreeQuotes, Char, Char, Char, Char, Char, Char); } if (Char == '\'') MatchC = '`'; else MatchC = '\''; TmpPtr = BufPtr; SKIP_AHEAD(TmpPtr, TmpC, TmpC == Char); MixingQuotes = FALSE; if ((*TmpPtr == MatchC) || (*TmpPtr == '\"') || (*TmpPtr == '\xB4')) /* xB4 = latin1 acute accent */ MixingQuotes = TRUE; SKIP_AHEAD(TmpPtr, TmpC, strchr("`\'\"\xB4", TmpC)); /* xB4 = latin1 acute accent */ if (MixingQuotes) HERE(TmpPtr - BufPtr + 1, emQuoteMix); switch (Char) { case '\'': if (isalpha((unsigned char)*TmpPtr) && (strchr(LTX_GenPunc, *PrePtr) || isspace((unsigned char)*PrePtr))) HERE(TmpPtr - BufPtr + 1, emBeginQ); /* Now check quote style */ #define ISPUNCT(ptr) (strchr(LTX_GenPunc, *ptr) && (ptr[-1] != '\\')) /* We ignore all single words/abbreviations in quotes */ { char *WordPtr = PrePtr; SKIP_BACK(WordPtr, TmpC, (isalnum((unsigned char)TmpC) || strchr(LTX_GenPunc, TmpC))); if (*WordPtr != '`') { if (*PrePtr && (Quote != quTrad) && ISPUNCT(PrePtr)) PSERRA(PrePtr - Buf, 1, emQuoteStyle, "in front of"); if (*TmpPtr && (Quote != quLogic) && ISPUNCT(TmpPtr)) PSERRA(TmpPtr - Buf, 1, emQuoteStyle, "after"); } } break; case '`': if (isalpha((unsigned char)*PrePtr) && (strchr(LTX_GenPunc, *TmpPtr) || isspace((unsigned char)*TmpPtr))) HERE(TmpPtr - BufPtr + 1, emEndQ); break; } BufPtr = TmpPtr; break; case '"': HERE(1, emUseQuoteLiga); break; case '\264': /* Ž (in Latin-1) */ HERE(1, emUseOtherQuote); break; case '_': case '^': if (*PrePtr != '\\') { TmpPtr = PrePtr; SKIP_BACK(TmpPtr, TmpC, LATEX_SPACE(TmpC)); CmdLen = 1; switch (*TmpPtr) { /*{ */ case '}': if (PrePtr[-1] != '\\') break; CmdLen++; PrePtr--; /* FALLTHRU */ /*[( */ case ')': case ']': PSERR(PrePtr - Buf, CmdLen, emEnclosePar); } TmpPtr = BufPtr; SKIP_AHEAD(TmpPtr, TmpC, LATEX_SPACE(TmpC)); ErrPtr = TmpPtr; if (isalpha((unsigned char)*TmpPtr)) pstcb = &my_isalpha; else if (isdigit((unsigned char)*TmpPtr)) pstcb = &my_isdigit; else break; while ((*pstcb) (*TmpPtr++)) ; TmpPtr--; if ((TmpPtr - ErrPtr) > 1) PSERR(ErrPtr - Buf, TmpPtr - ErrPtr, emEmbrace); } break; case '-': CheckDash(); break; case '\\': /* Command encountered */ BufPtr = GetLTXToken(--BufPtr, CmdBuffer); if (SeenSpace) { /* We must be careful to not point to the "previous space" * when it was actually on the previous line. This could * cause us to write into someone else's memory (inside of * PrintError). */ if (HasWord(CmdBuffer, &Linker)) PSERR( (PrePtr > Buf) ? (PrePtr - Buf) : 0, 1, emNBSpace); if (HasWord(CmdBuffer, &PostLink)) PSERR( (PrePtr > Buf) ? (PrePtr - Buf) : 0, 1, emFalsePage); } if (LATEX_SPACE(*BufPtr) && !MathMode && !CheckSilentRegex() && (strlen(CmdBuffer) != 2)) { PSERR(BufPtr - Buf, 1, emSpaceTerm); } else if ((*BufPtr == '\\') && (!isalpha((unsigned char)BufPtr[1])) && (!LATEX_SPACE(BufPtr[1]))) PSERR(BufPtr - Buf, 2, emNotIntended); PerformBigCmd(PrePtr + 1); BufPtr = SkipVerb(); break; case '(': if (*PrePtr && !LATEX_SPACE(*PrePtr) && !isdigit((unsigned char)*PrePtr) && !strchr("([{`~", *PrePtr)) { if (PrePtr[-1] != '\\') /* Short cmds */ { TmpPtr = PrePtr; SKIP_BACK(TmpPtr, TmpC, istex(TmpC)); if (*TmpPtr != '\\') /* Long cmds */ PSERRA(BufPtr - Buf - 1, 1, emSpaceParen, "in front of"); } } if (isspace((unsigned char)*BufPtr)) PSERRA(BufPtr - Buf, 1, emNoSpaceParen, "after"); HandleBracket(Char); break; case ')': if (isspace((unsigned char)*PrePtr)) PSERRA(BufPtr - Buf - 1, 1, emNoSpaceParen, "in front of"); if (isalpha((unsigned char)*BufPtr)) PSERRA(BufPtr - Buf, 1, emSpaceParen, "after"); HandleBracket(Char); break; case '}': case '{': case '[': case ']': HandleBracket(Char); break; case '$': if (*PrePtr != '\\') { if (*BufPtr == '$') { BufPtr++; TmpPtr = BufPtr; SKIP_AHEAD(TmpPtr, TmpC, (TmpC != '$' && TmpC != '\0')); PSERR(BufPtr - Buf - 2, TmpPtr-BufPtr+4, emDisplayMath); } else { TmpPtr = BufPtr; SKIP_AHEAD(TmpPtr, TmpC, (TmpC != '$' && TmpC != '\0')); PSERR(BufPtr - Buf - 1, TmpPtr-BufPtr+2, emInlineMath); } MathMode ^= TRUE; } break; } SeenSpace = LATEX_SPACE(Char); } if (!VerbMode) { CheckRest(); } } return FoundErr; } /* * Tries to create plural forms for words. Put a '%s' where a * suffix should be put, e.g. "warning%s". Watch your %'s! */ static void Transit(FILE * fh, unsigned long Cnt, const char *Str) { switch (Cnt) { case 0: fputs("No ", fh); fprintf(fh, Str, "s"); break; case 1: fputs("One ", fh); fprintf(fh, Str, ""); break; default: fprintf(fh, "%ld ", Cnt); fprintf(fh, Str, "s"); break; } } /* * Prints the status/conclusion after doing all the testing, including * bracket stack status, math mode, etc. */ void PrintStatus(unsigned long Lines) { unsigned long Cnt; struct ErrInfo *ei; while ((ei = PopErr(&CharStack))) { PrintError(ei->File, ei->LineBuf, ei->Column, ei->ErrLen, ei->Line, emNoMatchC, (char *) ei->Data); FreeErrInfo(ei); } while ((ei = PopErr(&EnvStack))) { PrintError(ei->File, ei->LineBuf, ei->Column, ei->ErrLen, ei->Line, emNoMatchC, (char *) ei->Data); FreeErrInfo(ei); } if (MathMode) { PrintError(CurStkName(&InputStack), "", 0L, 0L, Lines, emMathStillOn); } for (Cnt = 0L; Cnt < (NUMBRACKETS >> 1); Cnt++) { if (Brackets[Cnt << 1] != Brackets[(Cnt << 1) + 1]) { PrintError(CurStkName(&InputStack), "", 0L, 0L, Lines, emNoMatchCC, BrOrder[Cnt << 1], BrOrder[(Cnt << 1) + 1]); } } if (!Quiet) { Transit(stderr, ErrPrint, "error%s printed; "); Transit(stderr, WarnPrint, "warning%s printed; "); Transit(stderr, UserSupp, "user suppressed warning%s; "); Transit(stderr, LineSupp, "line suppressed warning%s.\n"); /* Print how to suppress warnings. */ if ( ErrPrint + WarnPrint > 0 ) { fprintf(stderr, "See the manual for how to suppress some or all of these warnings/errors.\n" ); } } } /* * Uses OutputFormat. Be sure that `String' * does not contain tabs, newlines, etc. * Prints a formatted string. Formatting codes understood: * %b - string to print Between fields (from -s option) * %c - Column position of error * %d - lenght of error (Digit) * %f - current Filename * %i - Turn on inverse printing mode. * %I - Turn off inverse printing mode. * %k - Kind of error (warning, error, message) * %l - Line number of error * %m - warning Message * %n - warning Number * %u - an Underlining line (like the one which appears when using -v1) * %r - part of line in front of error ('S' - 1) * %s - part of line which contains error (String) * %t - part of line after error ('S' + 1) */ void PrintError(const char *File, const char *String, const long Position, const long Len, const long LineNo, const enum ErrNum Error, ...) { static /* Just to reduce stack usage... */ char PrintBuffer[BUFSIZ]; va_list MsgArgs; char *LastNorm = OutputFormat; char *of; int c; enum Context Context; if (betw(emMinFault, Error, emMaxFault)) { switch (LaTeXMsgs[Error].InUse) { case iuOK: if (SUPPRESSED_ON_LINE(Error)) { LineSupp++; } else { FoundErr = EXIT_FAILURE; Context = LaTeXMsgs[Error].Context; if (!HeadErrOut) Context |= ctOutHead; #define RGTCTXT(Ctxt, Var) if((Context & Ctxt) && !(Var)) break; RGTCTXT(ctInMath, MathMode); RGTCTXT(ctOutMath, !MathMode); RGTCTXT(ctInHead, InHeader); RGTCTXT(ctOutHead, !InHeader); switch (LaTeXMsgs[Error].Type) { case etWarn: WarnPrint++; break; case etErr: ErrPrint++; break; case etMsg: break; } while ((of = strchr(LastNorm, '%'))) { c = *of; *of = 0; fputs(LastNorm, OutputFile); *of++ = c; switch (c = *of++) { case 'b': fputs(Delimit, OutputFile); break; case 'c': /* TODO: need to add the offset of the column * here when long lines are broken. */ fprintf(OutputFile, "%ld", Position + 1); break; case 'd': fprintf(OutputFile, "%ld", Len); break; case 'f': fputs(File, OutputFile); break; case 'i': fputs(ReverseOn, OutputFile); break; case 'I': fputs(ReverseOff, OutputFile); break; case 'k': switch (LaTeXMsgs[Error].Type) { case etWarn: fprintf(OutputFile, "Warning"); break; case etErr: fprintf(OutputFile, "Error"); break; case etMsg: fprintf(OutputFile, "Message"); break; } break; case 'l': fprintf(OutputFile, "%ld", LineNo); break; case 'm': va_start(MsgArgs, Error); vfprintf(OutputFile, LaTeXMsgs[Error].Message, MsgArgs); va_end(MsgArgs); break; case 'n': fprintf(OutputFile, "%d", Error); break; case 'u': sfmemset(PrintBuffer, ' ', (long) Position); sfmemset(&PrintBuffer[Position], '^', Len); PrintBuffer[Position + Len] = 0; fputs(PrintBuffer, OutputFile); break; case 'r': substring(String, PrintBuffer, 0L, Position); fputs(PrintBuffer, OutputFile); break; case 's': substring(String, PrintBuffer, Position, Len); fputs(PrintBuffer, OutputFile); break; case 't': substring(String, PrintBuffer, Position + Len, LONG_MAX); fputs(PrintBuffer, OutputFile); break; default: fputc(c, OutputFile); break; } LastNorm = of; } fputs(LastNorm, OutputFile); } break; case iuNotUser: UserSupp++; break; case iuNotSys: break; } } } /* * All commands isolated is routed through this command, so we can * update global statuses like math mode and whether @ is a letter * or not. */ static enum ErrNum PerformCommand(const char *Cmd, char *Arg) { const char *Argument = ""; enum ErrNum en = emMinFault; int TmpC; if (!strcmp(Cmd, "\\makeatletter")) AtLetter = TRUE; else if (!strcmp(Cmd, "\\makeatother")) AtLetter = FALSE; else if (InputFiles && !(strcmp(Cmd, "\\input") && strcmp(Cmd, "\\include"))) { SKIP_AHEAD(Arg, TmpC, LATEX_SPACE(TmpC)); if (*Arg == '{') /* } */ { if (GetLTXArg(Arg, TmpBuffer, GET_STRIP_TOKEN, NULL)) Argument = TmpBuffer; } else Argument = strip(Arg, STRP_BTH); if (!(Argument && PushFileName(Argument, &InputStack))) en = emNoCmdExec; } else if (HasWord(Cmd, &Primitives)) en = emTeXPrim; else if (HasWord(Cmd, &MathCmd)) { SKIP_AHEAD(Arg, TmpC, LATEX_SPACE(TmpC)); if (*Arg == '{') { MathFlag = MathMode ? efMath : efNoMath; MathMode = 1; } } else if (HasWord(Cmd, &TextCmd)) { SKIP_AHEAD(Arg, TmpC, LATEX_SPACE(TmpC)); if (*Arg == '{') { MathFlag = MathMode ? efMath : efNoMath; MathMode = 0; } } else if (*Cmd == '\\') { /* Quicker check of single lettered commands. */ switch (Cmd[1]) { case '(': case '[': MathMode = TRUE; break; case ']': case ')': MathMode = FALSE; break; case '/': switch (ItState) { case itOn: ItState = itCorrected; Argument = Arg; SKIP_AHEAD(Argument, TmpC, TmpC == '{' || TmpC == '}'); if (strchr(".,", *Argument)) en = emItPunct; break; case itCorrected: en = emItDup; break; case itOff: en = emItInNoIt; } break; } } return (en); } chktex-1.7.6/FindErrs.h000644 000765 000024 00000014340 12654037504 015520 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 $ ... $.") #undef MSG #define MSG(num, type, inuse, ctxt, text) num, enum ErrNum { ERRMSGS emMaxFault }; #undef MSG enum Context { ctNone = 0x00, ctInMath = 0x01, ctOutMath = 0x02, ctInHead = 0x04, ctOutHead = 0x08 }; struct ErrMsg { enum ErrNum Number; enum { etMsg, etWarn, etErr } Type; enum { iuNotSys, iuNotUser, iuOK } InUse; /* Requirements posed upon environment */ enum Context Context; const char *Message; }; enum ItState { itOff, itOn, itCorrected }; enum DotLevel { dtUnknown = 0x0, dtCDots = 0x1, dtLDots = 0x2, dtDots = 0x4 }; extern struct ErrMsg LaTeXMsgs[emMaxFault + 1]; extern char *OutputFormat; int CheckSilentRegex(void); int FindErr(const char *, const unsigned long); void PrintError(const char *, const char *, const long, const long, const long, const enum ErrNum, ...); void PrintStatus(unsigned long Lines); #endif /* FINDERRS */ chktex-1.7.6/input.tex000644 000765 000024 00000000074 07654704243 015520 0ustar00iandrusstaff000000 000000 \this is a test of whether the file is actually inputted... chktex-1.7.6/install-sh000755 000765 000024 00000034523 12764710126 015644 0ustar00iandrusstaff000000 000000 #!/bin/sh # install - install a program, script, or datafile scriptversion=2013-12-25.23; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: chktex-1.7.6/lacheck000755 000765 000024 00000001717 11057723555 015163 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.6/m4/000755 000765 000024 00000000000 12764710123 014146 5ustar00iandrusstaff000000 000000 chktex-1.7.6/Makefile.in000644 000765 000024 00000021243 12764704302 015677 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@ DVIPS=@DVIPS@ PS2PDF=ps2pdf PERL5=@PERL5@ LATEX2HTML=@LATEX2HTML@ LYNX=@LYNX@ GROFF=@GROFF@ SHELL=/bin/sh BUILT_SCRIPTS=@BUILT_SCRIPTS@ SCRIPTS=@SCRIPTS@ USRDEFS=-DSYSCONFDIR=\"$(sysconfdir)\" -D__unix__ VPATH=$(srcdir) ##################################################################### EXTRA_DIST=configure.in Makefile.in stamp-h.in config.h.in rmeheader.in \ MakeHTML.pl ChkTeX.tex.in aclocal.m4 NEWS \ chkweb deweb.in COPYING chktex.1 chkweb.1 deweb.1 \ input.tex Test.tex Test.pcre.out Test.posix-ere.out Test.nore.out configure \ install-sh lacheck chktexrc \ $(wildcard m4/*.m4) # created by configure CONFIG_DIST=ChkTeX.tex # created at make time BUILT_DIST=chktex.doc chkweb.doc deweb.doc README ChkTeX.dvi CSOURCES=ChkTeX.c FindErrs.c OpSys.c Resource.c Utility.c # The sources are the C sources and possibly the files with the same base name # but ending with .h SOURCEFILES=$(CSOURCES) $(wildcard $(CSOURCES:.c=.h)) types.h DISTFILES=$(EXTRA_DIST) $(SOURCEFILES) all: chktex DISTDIR:=chktex-@PACKAGE_VERSION@ dist: $(DISTDIR).tar.gz $(DISTDIR).tar.gz: $(DISTFILES) $(CONFIG_DIST) $(BUILT_DIST) html rm -r $(DISTDIR) 2>/dev/null ; true $(MKDIR_P) $(DISTDIR) for f in $(DISTFILES) ; do \ cp $(srcdir)/$$f $(DISTDIR) ; \ done cp $(CONFIG_DIST) $(BUILT_DIST) $(DISTDIR) $(MKDIR_P) $(DISTDIR)/html cp HTML/ChkTeX/*.{html,css} $(DISTDIR)/html rm -f $(DISTDIR).tar.gz tar --owner=0 --group=0 -chzf $@ $(DISTDIR) rm -rf $(DISTDIR) ######################################################################## .c.o: $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ CLEAN+=$(CSOURCES:.c=.o) .%.d: %.c $(CC) -M $(CPPFLAGS) $< > $@.tmp sed 's,\($*\)\.o *:,\1.o $@ : Makefile,g' $@.tmp > $@ -rm -f $@.tmp 2>/dev/null DEPFILES=$(patsubst %.c,.%.d,$(CSOURCES)) CLEAN+=$(DEPFILES) ifeq ($(findstring clean,$(MAKECMDGOALS)),) include $(DEPFILES) endif ###################### MAIN DEPENDENCIES ################################ OBJS= ChkTeX.o FindErrs.o OpSys.o Resource.o Utility.o MAKETEST= (builddir=`pwd` ; cd $(srcdir) ; $${builddir}/chktex -mall -r -g0 -lchktexrc -v5 Test.tex || :) # We can't grep the output of chtex because it might not be built yet TestOutFile := $(shell sed -n 's/.*HAVE_\(.*RE\) 1.*/\1/p' config.h | tr "A-Z_" "a-z-") ifeq ($(TestOutFile),) TestOutFile := Test.nore.out else TestOutFile := Test.$(TestOutFile).out endif $(srcdir)/$(TestOutFile): $(srcdir)/Test.tex -rm -f $(srcdir)/$(TestOutFile) @echo "" @echo "***Warning: creating $(TestOutFile)***" @echo "" $(MAKETEST) 1> $(srcdir)/$(TestOutFile) check: chktex $(srcdir)/$(TestOutFile) @echo ">>> Testing that checking algorithms work correctly..." @-rm -f chktest $(MAKETEST) 1> chktest @if cmp -s chktest $(srcdir)/$(TestOutFile); then \ echo ">>> OK!"; \ rm -f chktest; \ else \ echo "***WARNING***"; \ echo "Problems when checking compilation. This may or may not"; \ echo "be a problem; anyway, I'm giving you a diff from what the"; \ echo "results were *supposed* to be..."; \ diff -u $(srcdir)/$(TestOutFile) chktest; \ fi chktex: $(OBJS) $(CC) $(LDFLAGS) -o chktex $(OBJS) $(LIBS) install: chktex ChkTeX.dvi $(MKDIR_P) $(DESTDIR)$(bindir) for program in chktex $(BUILT_SCRIPTS); do \ $(INSTALL_PROGRAM) $$program $(DESTDIR)$(bindir); \ done for program in $(SCRIPTS); do \ $(INSTALL_PROGRAM) $(srcdir)/$$program $(DESTDIR)$(bindir); \ done $(MKDIR_P) $(DESTDIR)$(sysconfdir) $(INSTALL_DATA) $(srcdir)/chktexrc $(DESTDIR)$(sysconfdir) if (eval echo "$(BUILT_SCRIPTS)") | egrep deweb >/dev/null 2>&1; then \ $(MKDIR_P) $(DESTDIR)$(mandir)/man1; \ cp $(srcdir)/deweb.1 $(DESTDIR)$(mandir)/man1; \ fi uninstall: for program in chktex $(SCRIPTS) $(BUILT_SCRIPTS); do \ rm -f $(DESTDIR)$(bindir)/$$program; \ done rm -f $(DESTDIR)$(sysconfdir)/chktexrc $(DESTDIR)$(mandir)/man1/deweb.1 test: chktex -v2 -mall $(srcdir)/Test.tex | less -r indent: indent -npsl -bli0 -npcs -nut -i4 $(SOURCEFILES) mostlyclean: clean clean: rm -rf $(CLEAN) $(BUILT_DIST) $(DISTDIR).tar.gz \ *.aux *.log *.pdf *.dvi *.ps \ chktex HTML rme chktest distclean: clean rm -rf $(CONFIG_DIST) *.cache *.status *.log *.tar.gz \ deweb Makefile autom4te.cache config.h maintainer-clean: distclean rm -rf *.rme install-sh config.guess config.sub aclocal.m4 \ configure missing rmeheader stamp-h mkinstalldirs tags dvi: ChkTeX.dvi pdf: ChkTeX.pdf ifneq ($(LATEX2HTML),) html: ChkTeX.tex MakeHTML.pl -rm -r HTML $(MKDIR_P) HTML $(PERL5) $(srcdir)/MakeHTML.pl ChkTeX.tex > HTML/ChkTeX.tex cd HTML; $(LATEX2HTML) ChkTeX.tex $(PERL5) -i -pe 's% %%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.in aclocal.m4 cd $(srcdir) && autoconf #autoheader might not change config.h.in, so touch a stamp file. $(srcdir)/config.h.in: stamp-h.in $(srcdir)/stamp-h.in: configure.in aclocal.m4 cd $(srcdir) && autoheader echo timestamp > $(srcdir)/stamp-h.in config.h: stamp-h stamp-h: config.h.in config.status ./config.status ChkTeX.tex: ChkTeX.tex.in ./config.status ChkTeX.tex Makefile: Makefile.in config.status ./config.status config.status: configure ./config.status --recheck ###################### INDIVIDUAL DEPENDENCIES ########################## %.doc: %.1 $(GROFF) $< > $@ ChkTeX.dvi: ChkTeX.tex ifdef LATEX $(LATEX) ChkTeX.tex else echo "No latex program found by configure" false endif ChkTeX.ps: ChkTeX.dvi $(DVIPS) -o ChkTeX.ps ChkTeX.dvi ChkTeX.pdf: ChkTeX.ps $(PS2PDF) $< $@ cover: -./chktex -h -./chktex Test.tex -./chktex -v2 -t -o tmptmptmp ) { $latexonly = 1 if /^%latex/i; $latexonly = 0 if /^%endlatex/i; if($latexonly) { if(/^%!(.*)/) { print $1; } } else { print; } } chktex-1.7.6/NEWS000644 000765 000024 00000017646 12764707053 014353 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.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.6/OpSys.c000644 000765 000024 00000026626 12042742540 015060 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[BUFSIZ] = LOCALRCFILE; const char *ReverseOn; const char *ReverseOff; static int HasFile(char *Dir, const char *Filename, const char *App); #if USE_RECURSE static int SearchFile(char *Dir, const char *Filename, const char *App); #endif /* USE_RECURSE */ /* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ /* * Modify this one to suit your needs. In any case, it should fill * the ConfigFile (sized BUFLEN) buffer above with full name & path * for the configuration file. The macro RCFILE will give you the * filename part of the file, if you need that. * * Note: This routine will be called several times. Your mission will * be to look in each location, and see whether a .chktexrc file exist * there. * * If you choose to do nothing, only the current directory will be * searched. * */ enum LookIn { liMin, liSysDir, liUsrDir, liEnvir, liCurDir, liNFound, liMax }; int SetupVars(void) { char *Env; #ifdef __MSDOS__ char *Ptr; #endif static enum LookIn i = liMin; static int FoundFile; while (++i < liMax) { switch (i) { case liCurDir: /* Current directory */ strcpy(ConfigFile, LOCALRCFILE); break; case liEnvir: /* Environment defined */ #ifdef __MSDOS__ if ((Env = getenv("CHKTEXRC")) || (Env = getenv("CHKTEX_HOME"))) #elif defined(TEX_LIVE) if ((Env = kpse_var_value("CHKTEXRC"))) #else if ((Env = getenv("CHKTEXRC"))) #endif { strcpy(ConfigFile, Env); tackon(ConfigFile, LOCALRCFILE); #ifdef TEX_LIVE free(Env); #endif } else #ifdef __MSDOS__ if ((Env = getenv("EMTEXDIR"))) { strcpy(ConfigFile, Env); tackon(ConfigFile, "data"); tackon(ConfigFile, LOCALRCFILE); } else #endif *ConfigFile = 0; break; case liUsrDir: /* User dir for resource files */ #if defined(__unix__) if ((Env = getenv("HOME")) || (Env = getenv("LOGDIR"))) { strcpy(ConfigFile, Env); tackon(ConfigFile, LOCALRCFILE); } else #elif defined(__MSDOS__) strcpy(ConfigFile, PrgName); if ((Ptr = strrchr(ConfigFile, '\\')) || (Ptr = strchr(ConfigFile, ':'))) strcpy(++Ptr, RCBASENAME); else #endif *ConfigFile = 0; break; case liSysDir: /* System dir for resource files */ #ifdef TEX_LIVE if ((Env = kpse_var_value("CHKTEX_CONFIG"))) { strcpy(ConfigFile, Env); free(Env); } else if ((Env = kpse_var_value("TEXMFMAIN"))) { strcpy(ConfigFile, Env); tackon(ConfigFile, "chktex"); tackon(ConfigFile, RCBASENAME); free(Env); } else *ConfigFile = 0; #else /* TEX_LIVE */ #if defined(__unix__) || defined(__MSDOS__) strcpy(ConfigFile, SYSCONFDIR); tackon(ConfigFile, RCBASENAME); #else *ConfigFile = 0; #endif #endif /* TEX_LIVE */ break; case liNFound: case liMin: case liMax: *ConfigFile = 0; if (!FoundFile) PrintPrgErr(pmNoRsrc); } if (*ConfigFile && fexists(ConfigFile)) break; } FoundFile |= *ConfigFile; return (*ConfigFile); } /* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ /* * This function should initialize the global variables ReverseOn * and ReverseOff to magic cookies, which when printed, makes the * text in between stand out. */ void SetupTerm(void) { #ifdef USE_TERMCAP char *termtype = getenv("TERM"); int success; char *buffer; static char str_so[3] = "so", str_se[3] = "se"; if (termtype) { success = tgetent(term_buffer, termtype); if (success < 0) PrintPrgErr(pmNoTermData); if (success == 0) PrintPrgErr(pmNoTermDefd); buffer = (char *) malloc(sizeof(term_buffer)); ReverseOn = tgetstr(str_so, &buffer); ReverseOff = tgetstr(str_se, &buffer); if (ReverseOn && ReverseOff) return; } #endif ReverseOn = PRE_ERROR_STR; ReverseOff = POST_ERROR_STR; } /* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ /* * Concatenates the `File' string to the `Dir' string, leaving the result * in the `Dir' buffer. Takes care of inserting `directory' characters; * if we've got the strings "/usr/foo" and "bar", we'll get * "/usr/foo/bar". * * Behaviour somewhat controlled by the macros SLASH and DIRCHARS in the * OpSys.h file. * */ void tackon(char *Dir, const char *File) { int EndC; unsigned long SLen; if (Dir && (SLen = strlen(Dir))) { EndC = Dir[SLen - 1]; if (!(strchr(DIRCHARS, EndC))) { Dir[SLen++] = SLASH; Dir[SLen] = 0L; } } strcat(Dir, File); } /* * This function should add the appendix App to the filename Name. * If the resulting filename gets too long due to this, it may * overwrite the old appendix. * * Name may be assumed to be a legal filename under your OS. * * The appendix should contain a leading dot. */ void AddAppendix(char *Name, const char *App) { #ifdef __MSDOS__ char *p; if ((p = strrchr(Name, '.'))) strcpy(p, App); else strcat(Name, App); #else /* * NOTE! This may fail if your system has a claustrophobic file * name length limit. */ strcat(Name, App); #endif } /* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ /* * Locates a file, given a wordlist containing paths. If a * dir ends in a double SLASH, we'll search it recursively. * * We assume that * a) a deeper level in the dir. tree. has a longer path than * one above. * b) adding a level doesn't change any of the previous levels. * * If this function returns TRUE, Dest is guaranteed to contain * path & name of the found file. * * FALSE indicates that the file was not found; Dest is then * unspecified. */ int LocateFile(const char *Filename, /* File to search for */ char *Dest, /* Where to put final file */ const char *App, /* Extra optional appendix */ struct WordList *wl) /* List of paths, entries * ending in // will be recursed */ { unsigned long i; #if USE_RECURSE unsigned long Len; #endif FORWL(i, *wl) { strcpy(Dest, wl->Stack.Data[i]); #if USE_RECURSE Len = strlen(Dest); if (Len && (Dest[Len - 1] == SLASH) && (Dest[Len - 2] == SLASH)) { Dest[Len - 1] = Dest[Len - 2] = 0; if (SearchFile(Dest, Filename, App)) return (TRUE); } else #endif /* USE_RECURSE */ { if (HasFile(Dest, Filename, App)) return (TRUE); } } return (FALSE); } static int HasFile(char *Dir, const char *Filename, const char *App) { int DirLen = strlen(Dir); tackon(Dir, Filename); if (fexists(Dir)) return (TRUE); if (App) { AddAppendix(Dir, App); if (fexists(Dir)) return (TRUE); } Dir[DirLen] = 0; return (FALSE); } #if USE_RECURSE static int SearchFile(char *Dir, const char *Filename, const char *App) { struct stat *statbuf; struct dirent *de; DIR *dh; int DirLen = strlen(Dir); int Found = FALSE; DEBUG(("Searching %s for %s\n", Dir, Filename)); if (HasFile(Dir, Filename, App)) return (TRUE); else { if ((statbuf = malloc(sizeof(struct stat)))) { if ((dh = opendir(Dir))) { while (!Found && (de = readdir(dh))) { Dir[DirLen] = 0; if (strcmp(de->d_name, ".") && strcmp(de->d_name, "..")) { tackon(Dir, de->d_name); if (!stat(Dir, statbuf)) { if ((statbuf->st_mode & S_IFMT) == S_IFDIR) Found = SearchFile(Dir, Filename, App); } } } closedir(dh); } else PrintPrgErr(pmNoOpenDir, Dir); free(statbuf); } } return (Found); } #endif /* USE_RECURSE */ chktex-1.7.6/OpSys.h000644 000765 000024 00000014042 11503221652 015047 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 * BUFSIZ bytes. * * The program does also assume that __unix__ is defined if the source is * compiled on a UNIX machine. * */ /* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ /* * Here you should define what codes which should be returned to the * shell upon success/failure. * */ #ifndef EXIT_FAILURE # define EXIT_FAILURE 1 #endif #ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 #endif /* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ /* * SLASH should be defined to the character your computer uses to * separate files/directories. Most systems use '/', messydos uses * '\'. * * DIRCHARS should be defined to the characters a directory entry * may end on. On Amigas, this is ":/" (either "FOO:BAR/" or "FOO:"), * Unix uses only "/", while messydos uses ":\\". * * This data will be used to automatically concatenate a directory * path and a filename. * * Adjust both to suit your needs. */ #ifdef TEX_LIVE #if defined(__MSDOS__) || defined(WIN32) # define SLASH '\\' # define DIRCHARS ":\\" #else # define SLASH '/' # define DIRCHARS "/" #endif #else /* TEX_LIVE */ #if defined(__unix__) # define SLASH '/' #elif defined(__MSDOS__) # define SLASH '\\' #endif #if defined(__unix__) # define DIRCHARS "/" #elif defined(__MSDOS__) # define DIRCHARS ":\\" #endif #endif /* TEX_LIVE */ /* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ /* * Here, define what key-combination which is used to abort stdin * keyboard input. It should be a string, as we we'll type it out as * information to the user. */ #if defined(__unix__) # define STDIN_BREAK "Ctrl-D" #elif defined(__MSDOS__) # define STDIN_BREAK "Ctrl-Z + Enter" #else # define STDIN_BREAK "stdin break combination" #endif /* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ /* * For fancy printing of commands, we'll use these strings to turn * on/off the error indication. The codes listed here are ANSI * compatible; if you don't have that type of terminal, you may wish * to adjust this. Use "chktex -v2 Test.tex" to check the effects of * these macros. Note: These strings will be printf()'ed, so watch your * %'s. * * Under UNIX, we'll ignore these values and use termcap instead, where * that is installed. * * If these strings can't be specified statically, you'll have to add * code in the SetupTerm() function. * * PRE_ERROR_STR is of course printed in front of each location we * wish to show as an error, and POST_ERROR_STR after each location. * * The codes #defined here, will switch back- and foreground colours. * We're using '\033[' as escape character, some terminals may like * '\233' better. * */ # define PRE_ERROR_STR "\033[7m" # define POST_ERROR_STR "\033[0m" /* -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- -=><=- */ /* * This macro should contain the appendix for backup files, which * will be appended onto the original filename. It should contain * a leading dot. */ #ifdef __MSDOS__ # define BAKAPPENDIX ".$cl" #else # define BAKAPPENDIX ".bak" #endif /***************** END OF USER SETTABLE PREFERENCES *****************/ /********************************************************************/ #ifndef WORDLIST_DEFINED struct WordList; #endif /* Sorry; there are now cyclic dependencies in the * source tree. :-/ */ extern const char *ReverseOn; extern const char *ReverseOff; extern char ConfigFile[BUFSIZ]; char *MatchFileName(char *String); int SetupVars(void); void SetupTerm(void); void AddAppendix(char *Name, const char *App); void tackon(char *, const char *); int LocateFile(const char *Filename, char *Dest, const char *App, struct WordList *wl); #endif /* OPSYS_H */ chktex-1.7.6/README000644 000765 000024 00000001775 11761113207 014514 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.6/Resource.c000644 000765 000024 00000034527 12042743766 015604 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 *); static char MapChars(char **String); /* * Parses the contents of a resource file. * * Format: * Keyword { item1 item2 ... } [ item1 item2 ... ] * Keyword [ item1 item2 ... ] { item1 item2 ... } * Keyword = { item1 item2 ... } * Keyword = [ item1 item2 ... ] * Keyword = item * * Returns whether the attempt was a successful one. */ int ReadRC(const char *Filename) { const char *String = NULL; int Success = FALSE; FILE *fh; enum Token Token; unsigned long Counter; struct KeyWord *CurWord = NULL; /* Interpret incoming words as ... */ enum { whList, /* List elements */ whCaseList, /* Case insensitive list elements */ whEqual, /* Solo elements */ whNone /* List items not accepted */ } What = whNone; RsrcLine = 0; Expect = FLG_Word | FLG_Eof; if ((fh = fopen(Filename, "r"))) { Success = TRUE; do { Token = ReadWord(ReadBuffer, fh); if (!(Expect & Token)) { switch (Token) { case FLG_Item: String = "item"; break; case FLG_Word: String = "word"; break; case FLG_Equal: String = "`='"; break; case FLG_Open: String = "`{'"; break; case FLG_Close: String = "`}'"; break; case FLG_BrOpen: String = "`['"; break; case FLG_BrClose: String = "`]'"; break; case FLG_Eof: String = "EOF"; break; } PrintPrgErr(pmFaultFmt, Filename, RsrcLine, String); Success = FALSE; Token = FLG_Eof; } switch (Token) { case FLG_Word: for (Counter = 0; Keys[Counter].Name; Counter++) { if (!strcasecmp(ReadBuffer, Keys[Counter].Name)) { CurWord = &Keys[Counter]; Expect = (CurWord->List ? FLG_Open : 0) | (CurWord->CaseList ? FLG_BrOpen : 0) | FLG_Equal; break; } } if (!Keys[Counter].Name) { PrintPrgErr(pmKeyWord, ReadBuffer, Filename); Success = FALSE; Token = FLG_Eof; } break; case FLG_Item: switch (What) { case whEqual: if (!(*(CurWord->String) = strdup(ReadBuffer))) { PrintPrgErr(pmStrDupErr); Token = FLG_Eof; Success = FALSE; } What = whNone; Expect = FLG_Word | FLG_Eof; break; case whCaseList: if (!InsertWord(ReadBuffer, CurWord->CaseList)) { Token = FLG_Eof; Success = FALSE; } break; case whList: if (!InsertWord(ReadBuffer, CurWord->List)) { Token = FLG_Eof; Success = FALSE; } break; case whNone: PrintPrgErr(pmAssert); } break; case FLG_Equal: What = whEqual; Expect = (CurWord->List ? FLG_Open : 0) | (CurWord->CaseList ? FLG_BrOpen : 0) | (CurWord->String ? FLG_Item : 0); break; case FLG_BrOpen: if (What == whEqual) ClearWord(CurWord->CaseList); What = whCaseList; Expect = FLG_Item | FLG_BrClose; break; case FLG_Open: if (What == whEqual) ClearWord(CurWord->List); What = whList; Expect = FLG_Item | FLG_Close; break; case FLG_BrClose: case FLG_Close: Expect = (CurWord->List ? FLG_Open : 0) | (CurWord->CaseList ? FLG_BrOpen : 0) | FLG_Equal | FLG_Word | FLG_Eof; What = whNone; break; case FLG_Eof: break; } } while (Token != FLG_Eof); fclose(fh); } else PrintPrgErr(pmRsrcOpen, Filename); return (Success); } /* * Reads a token from the `.chktexrc' file; if the token is * FLG_Item or FLG_Word, Buffer will contain the plaintext of the * token. If not, the contents are undefined. */ static enum Token ReadWord(char *Buffer, FILE * fh) { static char *String = NULL; static char StatBuf[BUFSIZ]; enum Token Retval = FLG_Eof; unsigned short Chr; char *Ptr; int OnceMore = TRUE, Cont = TRUE; if (Buffer) { do { if (!(String && *String)) { if (fgets(StatBuf, BUFSIZ - 1, fh)) String = strip(StatBuf, STRP_RGT); RsrcLine++; } Ptr = Buffer; if (String && (String = strip(String, STRP_LFT))) { switch (Chr = *String) { case 0: case CMNT: String = NULL; break; case QUOTE: /* Quoted argument */ Cont = TRUE; String++; while (Cont) { switch (Chr = *String++) { case 0: case QUOTE: Cont = FALSE; break; case ESCAPE: if (!(Chr = MapChars(&String))) break; /* FALLTHRU */ default: *Ptr++ = Chr; } } *Ptr = 0; Retval = FLG_Item; OnceMore = FALSE; break; #define DONEKEY (FLG_Open | FLG_Equal | FLG_BrOpen) #define DONELIST (FLG_Close | FLG_BrClose) #define TOKEN(c, ctxt, tk) case c: if(Expect & (ctxt)) Retval = tk; LAST(token) LOOP(token, TOKEN('{', DONEKEY, FLG_Open); TOKEN('[', DONEKEY, FLG_BrOpen); TOKEN('=', DONEKEY, FLG_Equal); TOKEN(']', DONELIST, FLG_BrClose); TOKEN('}', DONELIST, FLG_Close); ) if (Retval != FLG_Eof) { OnceMore = FALSE; String++; break; } /* FALLTHRU */ default: /* Non-quoted argument */ OnceMore = FALSE; if (Expect & FLG_Word) { while (Cont) { Chr = *String++; if (isalpha((unsigned char)Chr)) *Ptr++ = Chr; else Cont = FALSE; } String--; Retval = FLG_Word; } else /* Expect & FLG_Item */ { while (Cont) { switch (Chr = *String++) { case CMNT: case 0: String = NULL; Cont = FALSE; break; case ESCAPE: if (!(Chr = MapChars(&String))) break; *Ptr++ = Chr; break; default: if (!isspace((unsigned char)Chr)) *Ptr++ = Chr; else Cont = FALSE; } } Retval = FLG_Item; } if (!(Buffer[0])) { PrintPrgErr(pmEmptyToken); if (*String) String++; } *Ptr = 0; break; } } else OnceMore = FALSE; } while (OnceMore); } return (Retval); } /* * Translates escape codes. Give it a pointer to the char after the * escape char, and we'll return what it maps to. */ #define MAP(a,b) case a: Tmp = b; break; static char MapChars(char **String) { int Chr, Tmp = 0; unsigned short Cnt; Chr = *((char *) (*String)++); switch (tolower((unsigned char)Chr)) { MAP(QUOTE, QUOTE); MAP(ESCAPE, ESCAPE); MAP(CMNT, CMNT); MAP('n', '\n'); MAP('r', '\r'); MAP('b', '\b'); MAP('t', '\t'); MAP('f', '\f'); MAP('{', '{'); MAP('}', '}'); MAP('[', '['); MAP(']', ']'); MAP('=', '='); MAP(' ', ' '); case 'x': Tmp = 0; for (Cnt = 0; Cnt < 2; Cnt++) { Chr = *((*String)++); if (isxdigit((unsigned char)Chr)) { Chr = toupper((unsigned char)Chr); Tmp = (Tmp << 4) + Chr; if (isdigit((unsigned char)Chr)) Tmp -= '0'; else Tmp -= 'A' - 10; } else { if (Chr) { PrintPrgErr(pmNotPSDigit, Chr, "hex"); Tmp = 0; } break; } } break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': Tmp = Chr - '0'; for (Cnt = 0; Cnt < 2; Cnt++) { Chr = *((*String)++); if (within('0', Chr, '7')) Tmp = (Tmp * 8) + Chr - '0'; else { if (Chr) { PrintPrgErr(pmNotPSDigit, Chr, "octal"); Tmp = 0; } break; } } break; case 'd': for (Cnt = 0; Cnt < 3; Cnt++) { if (isdigit((unsigned char)(Chr = *((*String)++)))) Tmp = (Tmp * 10) + Chr - '0'; else { if (Chr) { PrintPrgErr(pmNotPSDigit, Chr, ""); Tmp = 0; } break; } } break; default: PrintPrgErr(pmEscCode, ESCAPE, Chr); } return (Tmp); } chktex-1.7.6/Resource.h000644 000765 000024 00000004715 12333417255 015577 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)\ KEY(VerbClear, "|") KEY(QuoteStyle, "Traditional") KEY(TabSize, "8") #define LIST(a) extern struct WordList a; #define LNEMPTY LIST #define LCASE(a) LIST(a) LIST(a ## Case) #define KEY(a,def) extern const char *a; RESOURCE_INFO #undef KEY #undef LCASE #undef LNEMPTY #undef LIST int ReadRC(const char *); #endif /* RESOURCE */ chktex-1.7.6/rmeheader.in000644 000765 000024 00000001457 11051040544 016110 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.6/stamp-h.in000644 000765 000024 00000000012 12764710125 015522 0ustar00iandrusstaff000000 000000 timestamp chktex-1.7.6/Test.nore.out000644 000765 000024 00000062232 12654040132 016237 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 1 in Test.tex: Command terminated with space. \stoptext ^ Message 9 in Test.tex: `section' expected, found `text'. \stoptext ^^^^ Message 22 in Test.tex: Comment displayed. % Warning 2 ^ Message 2 in Test.tex: Non-breaking space (`~') should have been used. This is a faulty reference to \ref{foo} ^ Message 22 in Test.tex: Comment displayed. % Warning 3 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $[(ab)^{-1}]^{-2}$ is not beautiful ^^^^^^^^^^^^^^^^^^ Message 3 in Test.tex: You should enclose the previous parenthesis with `{}'. $[(ab)^{-1}]^{-2}$ is not beautiful ^ Message 3 in Test.tex: You should enclose the previous parenthesis with `{}'. $[(ab)^{-1}]^{-2}$ is not beautiful ^ Message 30 in Test.tex: Multiple spaces detected in input. $[(ab)^{-1}]^{-2}$ is not beautiful ^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. ${{[{(ab)}^{-1}]}}^{-2}$ is beautiful ^^^^^^^^^^^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 4-6, 28 ^ Message 6 in Test.tex: No italic correction (`\/') found. Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^ Message 42 in Test.tex: You should remove spaces in front of `\/' Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^^ Message 28 in Test.tex: Don't use \/ in front of small punctuation. Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^^ Message 42 in Test.tex: You should remove spaces in front of `\/' Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^ Message 5 in Test.tex: Italic correction (`\/') found more than once. Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^^ Message 22 in Test.tex: Comment displayed. % LaTeX2e ^ Message 42 in Test.tex: You should remove spaces in front of `\/' Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^^ Message 42 in Test.tex: You should remove spaces in front of `\/' Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing \textem{italic\/} in this \textit{sentence}, as \textem{you see}. ^^ Message 22 in Test.tex: Comment displayed. % Warning 7 ^ Message 7 in Test.tex: Accent command `\'' needs use of `\i'. This \'is a test of $\hat{j}$ accents. ^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. This \'is a test of $\hat{j}$ accents. ^^^^^^^^^ Message 7 in Test.tex: Accent command `\hat' needs use of `\jmath'. This \'is a test of $\hat{j}$ accents. ^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. This \'{\i}s a test of $\hat{\jmath}$ accents. ^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 8 ^ Message 8 in Test.tex: Wrong length of dash may have been used. It wasn't anything - just a 2---3 star--shots. ^ Message 8 in Test.tex: Wrong length of dash may have been used. It wasn't anything - just a 2---3 star--shots. ^^^ Message 8 in Test.tex: Wrong length of dash may have been used. It wasn't anything - just a 2---3 star--shots. ^^ Message 22 in Test.tex: Comment displayed. % From Knuths TeXbook Chapter 14 ^ Message 22 in Test.tex: Comment displayed. % "How TeX Breaks Paragraphs into Lines", fourth paragraph: ^ Message 22 in Test.tex: Comment displayed. % Using DashExcpt ^ Message 8 in Test.tex: Wrong length of dash may have been used. The Birch--Swinnerton--Dyer conjecture is not correct. ^^ Message 8 in Test.tex: Wrong length of dash may have been used. The Birch--Swinnerton--Dyer conjecture is not correct. ^^ Message 22 in Test.tex: Comment displayed. % Warning 9-10 ^ Message 22 in Test.tex: Comment displayed. % Brackets: ^ Message 10 in Test.tex: Solo `)' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `}' found. )}{[])} }}}]]]))) ^ Message 9 in Test.tex: `}' expected, found `)'. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `}' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `}' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `}' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `}' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `]' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `]' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `]' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `)' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `)' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `)' found. )}{[])} }}}]]]))) ^ Message 22 in Test.tex: Comment displayed. % Envs: ^ Message 9 in Test.tex: `baz' expected, found `quux'. \begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo} ^^^^ Message 9 in Test.tex: `quux' expected, found `baz'. \begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo} ^^^^ Message 10 in Test.tex: Solo `asoi' found. \begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo} ^^^^ Message 22 in Test.tex: Comment displayed. % Warning 11 ^ Message 11 in Test.tex: You should use \ldots to achieve an ellipsis. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^^^^ Message 11 in Test.tex: You should use \ldots to achieve an ellipsis. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^^^^ Message 11 in Test.tex: You should use \cdots to achieve an ellipsis. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^^^^^^^ Message 11 in Test.tex: You should use \ldots to achieve an ellipsis. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^^^^^^^^^^^^^^^ Message 11 in Test.tex: You should use \cdots to achieve an ellipsis. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$. ^^^^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$. ^^^^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$. ^^^^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$. ^^^^^^^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 12 ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 22 in Test.tex: Comment displayed. % Warning 13 ^ Message 13 in Test.tex: Intersentence spacing (`\@') should perhaps be used. Look at THIS! It's an error. ^ Message 22 in Test.tex: Comment displayed. % Warning 14 ^ Message 1 in Test.tex: Command terminated with space. \hat ^ Message 14 in Test.tex: Could not find argument for command. \hat ^^^^ Message 22 in Test.tex: Comment displayed. % Warning 18,19 ^ Message 18 in Test.tex: Use either `` or '' as an alternative to `"'. Is this an "example", or is it an ŽexampleŽ. ^ Message 18 in Test.tex: Use either `` or '' as an alternative to `"'. Is this an "example", or is it an ŽexampleŽ. ^ Message 19 in Test.tex: Use "'" (ASCII 39) instead of "Ž" (ASCII 180). Is this an "example", or is it an ŽexampleŽ. ^ Message 19 in Test.tex: Use "'" (ASCII 39) instead of "Ž" (ASCII 180). Is this an "example", or is it an ŽexampleŽ. ^ Message 22 in Test.tex: Comment displayed. % Warning 20 ^ Message 20 in Test.tex: User-specified pattern found: \unknown. That bug is \unknown\ to me. ^^^^^^^^ Message 22 in Test.tex: Comment displayed. % That bug is \unknown\ to me. ^ Message 22 in Test.tex: Comment displayed. % Warning 21 ^ Message 21 in Test.tex: This command might not be intended. \LaTeX\ is an extension of \TeX\. Right? ^^ Message 22 in Test.tex: Comment displayed. % Warning 23 ^ Message 23 in Test.tex: Either `\,`` or ``\,` will look better. ```Hello', I heard him said'', she remembered. ^^^ Message 22 in Test.tex: Comment displayed. % Warning 24 ^ Message 24 in Test.tex: Delete this space to maintain correct pagereferences. Indexing text \index{text} is fun! ^ Message 22 in Test.tex: Comment displayed. Indexing text% ^ Message 30 in Test.tex: Multiple spaces detected in input. \index{text} is fun! ^^^^ Message 24 in Test.tex: Delete this space to maintain correct pagereferences. \index{text} is fun! ^ Message 22 in Test.tex: Comment displayed. % Warning 25 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $5\cdot10^10$ ^^^^^^^^^^^^^ Message 25 in Test.tex: You might wish to put this between a pair of `{}' $5\cdot10^10$ ^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $5\cdot10^{10}$ ^^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 26 ^ Message 26 in Test.tex: You ought to remove spaces in front of punctuation. Do you understand ? ^ Message 22 in Test.tex: Comment displayed. % Warning 27 ^ Message 1 in input.tex: Command terminated with space. \this is a test of whether the file is actually inputted... ^ Message 11 in input.tex: You should use \ldots to achieve an ellipsis. \this is a test of whether the file is actually inputted... ^^^ Message 1 in input.tex: Command terminated with space. \this is a test of whether the file is actually inputted... ^ Message 11 in input.tex: You should use \ldots to achieve an ellipsis. \this is a test of whether the file is actually inputted... ^^^ Message 22 in Test.tex: Comment displayed. % Warning 29 ^ Message 29 in Test.tex: $\times$ may look prettier here. The program opens a screen sized 640x200 pixels ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. The program opens a screen sized $640\times200$ pixels ^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 30 ^ Message 30 in Test.tex: Multiple spaces detected in input. White is a beautiful colour. ^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 31 ^ Message 31 in Test.tex: This text may be ignored. \end{verbatim} foo bar ^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 32-34 ^ Message 32 in Test.tex: Use ` to begin quotation, not '. This is either an 'example`, an ''example`` or an `"`example'`'. ^ Message 33 in Test.tex: Use ' to end quotation, not `. This is either an 'example`, an ''example`` or an `"`example'`'. ^ Message 32 in Test.tex: Use ` to begin quotation, not '. This is either an 'example`, an ''example`` or an `"`example'`'. ^^ Message 33 in Test.tex: Use ' to end quotation, not `. This is either an 'example`, an ''example`` or an `"`example'`'. ^^ Message 34 in Test.tex: Don't mix quotes. This is either an 'example`, an ''example`` or an `"`example'`'. ^^^ Message 34 in Test.tex: Don't mix quotes. This is either an 'example`, an ''example`` or an `"`example'`'. ^^^ Message 22 in Test.tex: Comment displayed. % Warning 35 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $sin^2 + cos^2 = 1$ ^^^^^^^^^^^^^^^^^^^ Message 35 in Test.tex: You should perhaps use `\sin' instead. $sin^2 + cos^2 = 1$ ^^^ Message 35 in Test.tex: You should perhaps use `\cos' instead. $sin^2 + cos^2 = 1$ ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $\sin^2 + \cos^2 = 1$ ^^^^^^^^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 36-37 ^ Message 36 in Test.tex: You should put a space in front of parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 37 in Test.tex: You should avoid spaces after parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 36 in Test.tex: You should put a space in front of parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 37 in Test.tex: You should avoid spaces after parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 37 in Test.tex: You should avoid spaces in front of parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 36 in Test.tex: You should put a space in front of parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 37 in Test.tex: You should avoid spaces after parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 37 in Test.tex: You should avoid spaces in front of parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 36 in Test.tex: You should put a space after parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 22 in Test.tex: Comment displayed. % Warning 38 ^ Message 38 in Test.tex: You should not use punctuation in front of quotes. ``An example,'' he said, ``would be great.'' ^ Message 22 in Test.tex: Comment displayed. % Warning 39 ^ Message 39 in Test.tex: Double space found. For output codes, see table ~\ref{tab:fmtout}. ^ Message 22 in Test.tex: Comment displayed. % Warning 40 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $\this,$ and $$this$$. ^^^^^^^^ Message 40 in Test.tex: You should put punctuation outside inner math mode. $\this,$ and $$this$$. ^ Message 45 in Test.tex: Use \[ ... \] instead of $$ ... $$. $\this,$ and $$this$$. ^^^^^^^^ Message 40 in Test.tex: You should put punctuation inside display math mode. $\this,$ and $$this$$. ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $\this$, and $$this.$$ ^^^^^^^ Message 45 in Test.tex: Use \[ ... \] instead of $$ ... $$. $\this$, and $$this.$$ ^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 41 ^ Message 1 in Test.tex: Command terminated with space. foo \above qux ^ Message 41 in Test.tex: You ought to not use primitive TeX in LaTeX code. foo \above qux ^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 42 ^ Message 42 in Test.tex: You should remove spaces in front of `\footnote' This is a footnote \footnote{foo}. ^ Message 22 in Test.tex: Comment displayed. % Warning 43 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Here is a mistake $\left{x\right}$. ^^^^^^^^^^^^^^^^ Message 43 in Test.tex: `\left' is normally not followed by `{'. Here is a mistake $\left{x\right}$. ^^^^^ Message 43 in Test.tex: `\right' is normally not followed by `}'. Here is a mistake $\left{x\right}$. ^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. This one triggers warning 22 $\left\{x\right\}$. ^^^^^^^^^^^^^^^^^^ Message 21 in Test.tex: This command might not be intended. This one triggers warning 22 $\left\{x\right\}$. ^^ Message 21 in Test.tex: This command might not be intended. This one triggers warning 22 $\left\{x\right\}$. ^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Here \chktex\ doesn't complain $\left\lbrace x\right\rbrace$. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 44 -- user regex -- default message ^ Message 22 in Test.tex: Comment displayed. % Warning 44 -- user regex -- user message ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. For every $p\not|n$ you have an ugly prime which doesn't divide $n$. ^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. For every $p\not|n$ you have an ugly prime which doesn't divide $n$. ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. For every $p\nmid n$ you have a cute prime which doesn't divide $n$. ^^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. For every $p\nmid n$ you have a cute prime which doesn't divide $n$. ^^^ Message 22 in Test.tex: Comment displayed. % Math mode check ^ Message 35 in Test.tex: You should perhaps use `\sin' instead. \ensuremath{sin x\text{is not the same as sin x, but is the same as $sin x$}} ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. \ensuremath{sin x\text{is not the same as sin x, but is the same as $sin x$}} ^^^^^^^ Message 35 in Test.tex: You should perhaps use `\sin' instead. \ensuremath{sin x\text{is not the same as sin x, but is the same as $sin x$}} ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Also, $x(3)\text{ is not x(3) but it is $x(3)$}$ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Message 36 in Test.tex: You should put a space in front of parenthesis. Also, $x(3)\text{ is not x(3) but it is $x(3)$}$ ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Also, $x(3)\text{ is not x(3) but it is $x(3)$}$ ^^^^^^ Message 22 in Test.tex: Comment displayed. This is\\% a comment. Nothing here should be checked(right)? ^ Message 36 in Test.tex: You should put a space in front of parenthesis. But this is not a \% comment, so we should find this error(right)? ^ Message 22 in Test.tex: Comment displayed. Here(on this line only)is a warning $sin(x)$ suppressed. % chktex 36 chktex 35 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Here(on this line only)is a warning $sin(x)$ suppressed. % chktex 36 chktex 35 ^^^^^^^^ Message 22 in Test.tex: Comment displayed. Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36 ^ Message 36 in Test.tex: You should put a space in front of parenthesis. Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36 ^ Message 36 in Test.tex: You should put a space after parenthesis. Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36 ^^^^^^^^ Message 22 in Test.tex: Comment displayed. In section~\ref{sec:4} it is suppressed. % chktex -1 ^ Message 22 in Test.tex: Comment displayed. % In section~\ref{sec:5} we don't have a warning. ^ Message 22 in Test.tex: Comment displayed. % Verb check ^ Message 14 in Test.tex: Could not find argument for command. \verb# ^^^^^ Message 31 in Test.tex: This text may be ignored. \end{verbatim} FOO ^^^ Message 22 in Test.tex: Comment displayed. % Warning 16,15 ^ Message 45 in Test.tex: Use \[ ... \] instead of $$ ... $$. $$( ^^^^^^^ Message 22 in Test.tex: Comment displayed. % Local Variables: ^ Message 22 in Test.tex: Comment displayed. % require-final-newline: nil ^ Message 22 in Test.tex: Comment displayed. % End: ^ Message 22 in Test.tex: Comment displayed. % There should be no newline at the end of this file to test bug #46539 ^ Message 16 in Test.tex: Mathmode still on at end of LaTeX file. Message 17 in Test.tex: Number of `(' doesn't match the number of `)'! Message 17 in Test.tex: Number of `[' doesn't match the number of `]'! Message 17 in Test.tex: Number of `{' doesn't match the number of `}'! chktex-1.7.6/Test.pcre.out000644 000765 000024 00000063157 12654040132 016234 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 9 in Test.tex: `section' expected, found `text'. \stoptext ^^^^ Message 22 in Test.tex: Comment displayed. % Warning 2 ^ Message 2 in Test.tex: Non-breaking space (`~') should have been used. This is a faulty reference to \ref{foo} ^ Message 22 in Test.tex: Comment displayed. % Warning 3 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $[(ab)^{-1}]^{-2}$ is not beautiful ^^^^^^^^^^^^^^^^^^ Message 3 in Test.tex: You should enclose the previous parenthesis with `{}'. $[(ab)^{-1}]^{-2}$ is not beautiful ^ Message 3 in Test.tex: You should enclose the previous parenthesis with `{}'. $[(ab)^{-1}]^{-2}$ is not beautiful ^ Message 30 in Test.tex: Multiple spaces detected in input. $[(ab)^{-1}]^{-2}$ is not beautiful ^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. ${{[{(ab)}^{-1}]}}^{-2}$ is beautiful ^^^^^^^^^^^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 4-6, 28 ^ Message 6 in Test.tex: No italic correction (`\/') found. Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^ Message 42 in Test.tex: You should remove spaces in front of `\/' Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^^ Message 28 in Test.tex: Don't use \/ in front of small punctuation. Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^^ Message 42 in Test.tex: You should remove spaces in front of `\/' Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^ Message 5 in Test.tex: Italic correction (`\/') found more than once. Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^^ Message 22 in Test.tex: Comment displayed. % LaTeX2e ^ Message 42 in Test.tex: You should remove spaces in front of `\/' Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^^ Message 42 in Test.tex: You should remove spaces in front of `\/' Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing \textem{italic\/} in this \textit{sentence}, as \textem{you see}. ^^ Message 22 in Test.tex: Comment displayed. % Warning 7 ^ Message 7 in Test.tex: Accent command `\'' needs use of `\i'. This \'is a test of $\hat{j}$ accents. ^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. This \'is a test of $\hat{j}$ accents. ^^^^^^^^^ Message 7 in Test.tex: Accent command `\hat' needs use of `\jmath'. This \'is a test of $\hat{j}$ accents. ^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. This \'{\i}s a test of $\hat{\jmath}$ accents. ^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 8 ^ Message 8 in Test.tex: Wrong length of dash may have been used. It wasn't anything - just a 2---3 star--shots. ^ Message 8 in Test.tex: Wrong length of dash may have been used. It wasn't anything - just a 2---3 star--shots. ^^^ Message 8 in Test.tex: Wrong length of dash may have been used. It wasn't anything - just a 2---3 star--shots. ^^ Message 22 in Test.tex: Comment displayed. % From Knuths TeXbook Chapter 14 ^ Message 22 in Test.tex: Comment displayed. % "How TeX Breaks Paragraphs into Lines", fourth paragraph: ^ Message 22 in Test.tex: Comment displayed. % Using DashExcpt ^ Message 8 in Test.tex: Wrong length of dash may have been used. The Birch--Swinnerton--Dyer conjecture is not correct. ^^ Message 8 in Test.tex: Wrong length of dash may have been used. The Birch--Swinnerton--Dyer conjecture is not correct. ^^ Message 22 in Test.tex: Comment displayed. % Warning 9-10 ^ Message 22 in Test.tex: Comment displayed. % Brackets: ^ Message 10 in Test.tex: Solo `)' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `}' found. )}{[])} }}}]]]))) ^ Message 9 in Test.tex: `}' expected, found `)'. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `}' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `}' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `}' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `}' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `]' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `]' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `]' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `)' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `)' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `)' found. )}{[])} }}}]]]))) ^ Message 22 in Test.tex: Comment displayed. % Envs: ^ Message 9 in Test.tex: `baz' expected, found `quux'. \begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo} ^^^^ Message 9 in Test.tex: `quux' expected, found `baz'. \begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo} ^^^^ Message 10 in Test.tex: Solo `asoi' found. \begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo} ^^^^ Message 22 in Test.tex: Comment displayed. % Warning 11 ^ Message 11 in Test.tex: You should use \ldots to achieve an ellipsis. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^^^^ Message 11 in Test.tex: You should use \ldots to achieve an ellipsis. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^^^^ Message 11 in Test.tex: You should use \cdots to achieve an ellipsis. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^^^^^^^ Message 11 in Test.tex: You should use \ldots to achieve an ellipsis. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^^^^^^^^^^^^^^^ Message 11 in Test.tex: You should use \cdots to achieve an ellipsis. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$. ^^^^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$. ^^^^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$. ^^^^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$. ^^^^^^^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 12 ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 22 in Test.tex: Comment displayed. % Warning 13 ^ Message 13 in Test.tex: Intersentence spacing (`\@') should perhaps be used. Look at THIS! It's an error. ^ Message 22 in Test.tex: Comment displayed. % Warning 14 ^ Message 1 in Test.tex: Command terminated with space. \hat ^ Message 14 in Test.tex: Could not find argument for command. \hat ^^^^ Message 22 in Test.tex: Comment displayed. % Warning 18,19 ^ Message 18 in Test.tex: Use either `` or '' as an alternative to `"'. Is this an "example", or is it an ŽexampleŽ. ^ Message 18 in Test.tex: Use either `` or '' as an alternative to `"'. Is this an "example", or is it an ŽexampleŽ. ^ Message 19 in Test.tex: Use "'" (ASCII 39) instead of "Ž" (ASCII 180). Is this an "example", or is it an ŽexampleŽ. ^ Message 19 in Test.tex: Use "'" (ASCII 39) instead of "Ž" (ASCII 180). Is this an "example", or is it an ŽexampleŽ. ^ Message 22 in Test.tex: Comment displayed. % Warning 20 ^ Message 20 in Test.tex: User-specified pattern found: \unknown. That bug is \unknown\ to me. ^^^^^^^^ Message 22 in Test.tex: Comment displayed. % That bug is \unknown\ to me. ^ Message 22 in Test.tex: Comment displayed. % Warning 21 ^ Message 21 in Test.tex: This command might not be intended. \LaTeX\ is an extension of \TeX\. Right? ^^ Message 22 in Test.tex: Comment displayed. % Warning 23 ^ Message 23 in Test.tex: Either `\,`` or ``\,` will look better. ```Hello', I heard him said'', she remembered. ^^^ Message 22 in Test.tex: Comment displayed. % Warning 24 ^ Message 24 in Test.tex: Delete this space to maintain correct pagereferences. Indexing text \index{text} is fun! ^ Message 22 in Test.tex: Comment displayed. Indexing text% ^ Message 30 in Test.tex: Multiple spaces detected in input. \index{text} is fun! ^^^^ Message 24 in Test.tex: Delete this space to maintain correct pagereferences. \index{text} is fun! ^ Message 22 in Test.tex: Comment displayed. % Warning 25 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $5\cdot10^10$ ^^^^^^^^^^^^^ Message 25 in Test.tex: You might wish to put this between a pair of `{}' $5\cdot10^10$ ^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $5\cdot10^{10}$ ^^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 26 ^ Message 26 in Test.tex: You ought to remove spaces in front of punctuation. Do you understand ? ^ Message 22 in Test.tex: Comment displayed. % Warning 27 ^ Message 1 in input.tex: Command terminated with space. \this is a test of whether the file is actually inputted... ^ Message 11 in input.tex: You should use \ldots to achieve an ellipsis. \this is a test of whether the file is actually inputted... ^^^ Message 1 in input.tex: Command terminated with space. \this is a test of whether the file is actually inputted... ^ Message 11 in input.tex: You should use \ldots to achieve an ellipsis. \this is a test of whether the file is actually inputted... ^^^ Message 22 in Test.tex: Comment displayed. % Warning 29 ^ Message 29 in Test.tex: $\times$ may look prettier here. The program opens a screen sized 640x200 pixels ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. The program opens a screen sized $640\times200$ pixels ^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 30 ^ Message 30 in Test.tex: Multiple spaces detected in input. White is a beautiful colour. ^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 31 ^ Message 31 in Test.tex: This text may be ignored. \end{verbatim} foo bar ^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 32-34 ^ Message 32 in Test.tex: Use ` to begin quotation, not '. This is either an 'example`, an ''example`` or an `"`example'`'. ^ Message 33 in Test.tex: Use ' to end quotation, not `. This is either an 'example`, an ''example`` or an `"`example'`'. ^ Message 32 in Test.tex: Use ` to begin quotation, not '. This is either an 'example`, an ''example`` or an `"`example'`'. ^^ Message 33 in Test.tex: Use ' to end quotation, not `. This is either an 'example`, an ''example`` or an `"`example'`'. ^^ Message 34 in Test.tex: Don't mix quotes. This is either an 'example`, an ''example`` or an `"`example'`'. ^^^ Message 34 in Test.tex: Don't mix quotes. This is either an 'example`, an ''example`` or an `"`example'`'. ^^^ Message 22 in Test.tex: Comment displayed. % Warning 35 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $sin^2 + cos^2 = 1$ ^^^^^^^^^^^^^^^^^^^ Message 35 in Test.tex: You should perhaps use `\sin' instead. $sin^2 + cos^2 = 1$ ^^^ Message 35 in Test.tex: You should perhaps use `\cos' instead. $sin^2 + cos^2 = 1$ ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $\sin^2 + \cos^2 = 1$ ^^^^^^^^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 36-37 ^ Message 36 in Test.tex: You should put a space in front of parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 37 in Test.tex: You should avoid spaces after parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 36 in Test.tex: You should put a space in front of parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 37 in Test.tex: You should avoid spaces after parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 37 in Test.tex: You should avoid spaces in front of parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 36 in Test.tex: You should put a space in front of parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 37 in Test.tex: You should avoid spaces after parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 37 in Test.tex: You should avoid spaces in front of parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 36 in Test.tex: You should put a space after parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 22 in Test.tex: Comment displayed. % Warning 38 ^ Message 38 in Test.tex: You should not use punctuation in front of quotes. ``An example,'' he said, ``would be great.'' ^ Message 22 in Test.tex: Comment displayed. % Warning 39 ^ Message 39 in Test.tex: Double space found. For output codes, see table ~\ref{tab:fmtout}. ^ Message 22 in Test.tex: Comment displayed. % Warning 40 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $\this,$ and $$this$$. ^^^^^^^^ Message 40 in Test.tex: You should put punctuation outside inner math mode. $\this,$ and $$this$$. ^ Message 45 in Test.tex: Use \[ ... \] instead of $$ ... $$. $\this,$ and $$this$$. ^^^^^^^^ Message 40 in Test.tex: You should put punctuation inside display math mode. $\this,$ and $$this$$. ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $\this$, and $$this.$$ ^^^^^^^ Message 45 in Test.tex: Use \[ ... \] instead of $$ ... $$. $\this$, and $$this.$$ ^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 41 ^ Message 1 in Test.tex: Command terminated with space. foo \above qux ^ Message 41 in Test.tex: You ought to not use primitive TeX in LaTeX code. foo \above qux ^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 42 ^ Message 42 in Test.tex: You should remove spaces in front of `\footnote' This is a footnote \footnote{foo}. ^ Message 22 in Test.tex: Comment displayed. % Warning 43 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Here is a mistake $\left{x\right}$. ^^^^^^^^^^^^^^^^ Message 43 in Test.tex: `\left' is normally not followed by `{'. Here is a mistake $\left{x\right}$. ^^^^^ Message 43 in Test.tex: `\right' is normally not followed by `}'. Here is a mistake $\left{x\right}$. ^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. This one triggers warning 22 $\left\{x\right\}$. ^^^^^^^^^^^^^^^^^^ Message 21 in Test.tex: This command might not be intended. This one triggers warning 22 $\left\{x\right\}$. ^^ Message 21 in Test.tex: This command might not be intended. This one triggers warning 22 $\left\{x\right\}$. ^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Here \chktex\ doesn't complain $\left\lbrace x\right\rbrace$. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 44 -- user regex -- default message ^ Message 22 in Test.tex: Comment displayed. % Warning 44 -- user regex -- user message ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. For every $p\not|n$ you have an ugly prime which doesn't divide $n$. ^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. For every $p\not|n$ you have an ugly prime which doesn't divide $n$. ^^^ Message 44 in Test.tex: User Regex: Always use \nmid. For every $p\not|n$ you have an ugly prime which doesn't divide $n$. ^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. For every $p\nmid n$ you have a cute prime which doesn't divide $n$. ^^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. For every $p\nmid n$ you have a cute prime which doesn't divide $n$. ^^^ Message 22 in Test.tex: Comment displayed. % Math mode check ^ Message 35 in Test.tex: You should perhaps use `\sin' instead. \ensuremath{sin x\text{is not the same as sin x, but is the same as $sin x$}} ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. \ensuremath{sin x\text{is not the same as sin x, but is the same as $sin x$}} ^^^^^^^ Message 35 in Test.tex: You should perhaps use `\sin' instead. \ensuremath{sin x\text{is not the same as sin x, but is the same as $sin x$}} ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Also, $x(3)\text{ is not x(3) but it is $x(3)$}$ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Message 36 in Test.tex: You should put a space in front of parenthesis. Also, $x(3)\text{ is not x(3) but it is $x(3)$}$ ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Also, $x(3)\text{ is not x(3) but it is $x(3)$}$ ^^^^^^ Message 22 in Test.tex: Comment displayed. This is\\% a comment. Nothing here should be checked(right)? ^ Message 36 in Test.tex: You should put a space in front of parenthesis. But this is not a \% comment, so we should find this error(right)? ^ Message 22 in Test.tex: Comment displayed. Here(on this line only)is a warning $sin(x)$ suppressed. % chktex 36 chktex 35 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Here(on this line only)is a warning $sin(x)$ suppressed. % chktex 36 chktex 35 ^^^^^^^^ Message 22 in Test.tex: Comment displayed. Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36 ^ Message 36 in Test.tex: You should put a space in front of parenthesis. Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36 ^ Message 36 in Test.tex: You should put a space after parenthesis. Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36 ^^^^^^^^ Message 44 in Test.tex: User Regex: -1:Capitalize before references. In section~\ref{sec:3} we have a warning. ^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. In section~\ref{sec:4} it is suppressed. % chktex -1 ^ Message 22 in Test.tex: Comment displayed. % In section~\ref{sec:5} we don't have a warning. ^ Message 44 in Test.tex: User Regex: -2:Vertical rules in tables are ugly. \begin{tabular*}{1.0\linewidth}[h]{|c|cc|} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Message 44 in Test.tex: User Regex: -2:Use \toprule, midrule, or \bottomrule from booktabs. \hline ^^^^^^ Message 22 in Test.tex: Comment displayed. % Verb check ^ Message 14 in Test.tex: Could not find argument for command. \verb# ^^^^^ Message 31 in Test.tex: This text may be ignored. \end{verbatim} FOO ^^^ Message 22 in Test.tex: Comment displayed. % Warning 16,15 ^ Message 45 in Test.tex: Use \[ ... \] instead of $$ ... $$. $$( ^^^^^^^ Message 22 in Test.tex: Comment displayed. % Local Variables: ^ Message 22 in Test.tex: Comment displayed. % require-final-newline: nil ^ Message 22 in Test.tex: Comment displayed. % End: ^ Message 22 in Test.tex: Comment displayed. % There should be no newline at the end of this file to test bug #46539 ^ Message 16 in Test.tex: Mathmode still on at end of LaTeX file. Message 17 in Test.tex: Number of `(' doesn't match the number of `)'! Message 17 in Test.tex: Number of `[' doesn't match the number of `]'! Message 17 in Test.tex: Number of `{' doesn't match the number of `}'! chktex-1.7.6/Test.posix-ere.out000644 000765 000024 00000063156 12654040132 017215 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 9 in Test.tex: `section' expected, found `text'. \stoptext ^^^^ Message 22 in Test.tex: Comment displayed. % Warning 2 ^ Message 2 in Test.tex: Non-breaking space (`~') should have been used. This is a faulty reference to \ref{foo} ^ Message 22 in Test.tex: Comment displayed. % Warning 3 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $[(ab)^{-1}]^{-2}$ is not beautiful ^^^^^^^^^^^^^^^^^^ Message 3 in Test.tex: You should enclose the previous parenthesis with `{}'. $[(ab)^{-1}]^{-2}$ is not beautiful ^ Message 3 in Test.tex: You should enclose the previous parenthesis with `{}'. $[(ab)^{-1}]^{-2}$ is not beautiful ^ Message 30 in Test.tex: Multiple spaces detected in input. $[(ab)^{-1}]^{-2}$ is not beautiful ^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. ${{[{(ab)}^{-1}]}}^{-2}$ is beautiful ^^^^^^^^^^^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 4-6, 28 ^ Message 6 in Test.tex: No italic correction (`\/') found. Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^ Message 42 in Test.tex: You should remove spaces in front of `\/' Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^^ Message 28 in Test.tex: Don't use \/ in front of small punctuation. Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^^ Message 42 in Test.tex: You should remove spaces in front of `\/' Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^ Message 5 in Test.tex: Italic correction (`\/') found more than once. Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. ^^ Message 22 in Test.tex: Comment displayed. % LaTeX2e ^ Message 42 in Test.tex: You should remove spaces in front of `\/' Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^^ Message 42 in Test.tex: You should remove spaces in front of `\/' Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. ^^ Message 4 in Test.tex: Italic correction (`\/') found in non-italic buffer. Testing \textem{italic\/} in this \textit{sentence}, as \textem{you see}. ^^ Message 22 in Test.tex: Comment displayed. % Warning 7 ^ Message 7 in Test.tex: Accent command `\'' needs use of `\i'. This \'is a test of $\hat{j}$ accents. ^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. This \'is a test of $\hat{j}$ accents. ^^^^^^^^^ Message 7 in Test.tex: Accent command `\hat' needs use of `\jmath'. This \'is a test of $\hat{j}$ accents. ^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. This \'{\i}s a test of $\hat{\jmath}$ accents. ^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 8 ^ Message 8 in Test.tex: Wrong length of dash may have been used. It wasn't anything - just a 2---3 star--shots. ^ Message 8 in Test.tex: Wrong length of dash may have been used. It wasn't anything - just a 2---3 star--shots. ^^^ Message 8 in Test.tex: Wrong length of dash may have been used. It wasn't anything - just a 2---3 star--shots. ^^ Message 22 in Test.tex: Comment displayed. % From Knuths TeXbook Chapter 14 ^ Message 22 in Test.tex: Comment displayed. % "How TeX Breaks Paragraphs into Lines", fourth paragraph: ^ Message 22 in Test.tex: Comment displayed. % Using DashExcpt ^ Message 8 in Test.tex: Wrong length of dash may have been used. The Birch--Swinnerton--Dyer conjecture is not correct. ^^ Message 8 in Test.tex: Wrong length of dash may have been used. The Birch--Swinnerton--Dyer conjecture is not correct. ^^ Message 22 in Test.tex: Comment displayed. % Warning 9-10 ^ Message 22 in Test.tex: Comment displayed. % Brackets: ^ Message 10 in Test.tex: Solo `)' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `}' found. )}{[])} }}}]]]))) ^ Message 9 in Test.tex: `}' expected, found `)'. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `}' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `}' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `}' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `}' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `]' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `]' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `]' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `)' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `)' found. )}{[])} }}}]]]))) ^ Message 10 in Test.tex: Solo `)' found. )}{[])} }}}]]]))) ^ Message 22 in Test.tex: Comment displayed. % Envs: ^ Message 9 in Test.tex: `baz' expected, found `quux'. \begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo} ^^^^ Message 9 in Test.tex: `quux' expected, found `baz'. \begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo} ^^^^ Message 10 in Test.tex: Solo `asoi' found. \begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo} ^^^^ Message 22 in Test.tex: Comment displayed. % Warning 11 ^ Message 11 in Test.tex: You should use \ldots to achieve an ellipsis. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^^^^ Message 11 in Test.tex: You should use \ldots to achieve an ellipsis. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^^^^ Message 11 in Test.tex: You should use \cdots to achieve an ellipsis. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^^^^^^^ Message 11 in Test.tex: You should use \ldots to achieve an ellipsis. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^^^^^^^^^^^^^^^ Message 11 in Test.tex: You should use \cdots to achieve an ellipsis. Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. ^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$. ^^^^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$. ^^^^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$. ^^^^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$. ^^^^^^^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 12 ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 12 in Test.tex: Interword spacing (`\ ') should perhaps be used. 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george ^ Message 22 in Test.tex: Comment displayed. % Warning 13 ^ Message 13 in Test.tex: Intersentence spacing (`\@') should perhaps be used. Look at THIS! It's an error. ^ Message 22 in Test.tex: Comment displayed. % Warning 14 ^ Message 1 in Test.tex: Command terminated with space. \hat ^ Message 14 in Test.tex: Could not find argument for command. \hat ^^^^ Message 22 in Test.tex: Comment displayed. % Warning 18,19 ^ Message 18 in Test.tex: Use either `` or '' as an alternative to `"'. Is this an "example", or is it an ŽexampleŽ. ^ Message 18 in Test.tex: Use either `` or '' as an alternative to `"'. Is this an "example", or is it an ŽexampleŽ. ^ Message 19 in Test.tex: Use "'" (ASCII 39) instead of "Ž" (ASCII 180). Is this an "example", or is it an ŽexampleŽ. ^ Message 19 in Test.tex: Use "'" (ASCII 39) instead of "Ž" (ASCII 180). Is this an "example", or is it an ŽexampleŽ. ^ Message 22 in Test.tex: Comment displayed. % Warning 20 ^ Message 20 in Test.tex: User-specified pattern found: \unknown. That bug is \unknown\ to me. ^^^^^^^^ Message 22 in Test.tex: Comment displayed. % That bug is \unknown\ to me. ^ Message 22 in Test.tex: Comment displayed. % Warning 21 ^ Message 21 in Test.tex: This command might not be intended. \LaTeX\ is an extension of \TeX\. Right? ^^ Message 22 in Test.tex: Comment displayed. % Warning 23 ^ Message 23 in Test.tex: Either `\,`` or ``\,` will look better. ```Hello', I heard him said'', she remembered. ^^^ Message 22 in Test.tex: Comment displayed. % Warning 24 ^ Message 24 in Test.tex: Delete this space to maintain correct pagereferences. Indexing text \index{text} is fun! ^ Message 22 in Test.tex: Comment displayed. Indexing text% ^ Message 30 in Test.tex: Multiple spaces detected in input. \index{text} is fun! ^^^^ Message 24 in Test.tex: Delete this space to maintain correct pagereferences. \index{text} is fun! ^ Message 22 in Test.tex: Comment displayed. % Warning 25 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $5\cdot10^10$ ^^^^^^^^^^^^^ Message 25 in Test.tex: You might wish to put this between a pair of `{}' $5\cdot10^10$ ^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $5\cdot10^{10}$ ^^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 26 ^ Message 26 in Test.tex: You ought to remove spaces in front of punctuation. Do you understand ? ^ Message 22 in Test.tex: Comment displayed. % Warning 27 ^ Message 1 in input.tex: Command terminated with space. \this is a test of whether the file is actually inputted... ^ Message 11 in input.tex: You should use \ldots to achieve an ellipsis. \this is a test of whether the file is actually inputted... ^^^ Message 1 in input.tex: Command terminated with space. \this is a test of whether the file is actually inputted... ^ Message 11 in input.tex: You should use \ldots to achieve an ellipsis. \this is a test of whether the file is actually inputted... ^^^ Message 22 in Test.tex: Comment displayed. % Warning 29 ^ Message 29 in Test.tex: $\times$ may look prettier here. The program opens a screen sized 640x200 pixels ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. The program opens a screen sized $640\times200$ pixels ^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 30 ^ Message 30 in Test.tex: Multiple spaces detected in input. White is a beautiful colour. ^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 31 ^ Message 31 in Test.tex: This text may be ignored. \end{verbatim} foo bar ^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 32-34 ^ Message 32 in Test.tex: Use ` to begin quotation, not '. This is either an 'example`, an ''example`` or an `"`example'`'. ^ Message 33 in Test.tex: Use ' to end quotation, not `. This is either an 'example`, an ''example`` or an `"`example'`'. ^ Message 32 in Test.tex: Use ` to begin quotation, not '. This is either an 'example`, an ''example`` or an `"`example'`'. ^^ Message 33 in Test.tex: Use ' to end quotation, not `. This is either an 'example`, an ''example`` or an `"`example'`'. ^^ Message 34 in Test.tex: Don't mix quotes. This is either an 'example`, an ''example`` or an `"`example'`'. ^^^ Message 34 in Test.tex: Don't mix quotes. This is either an 'example`, an ''example`` or an `"`example'`'. ^^^ Message 22 in Test.tex: Comment displayed. % Warning 35 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $sin^2 + cos^2 = 1$ ^^^^^^^^^^^^^^^^^^^ Message 35 in Test.tex: You should perhaps use `\sin' instead. $sin^2 + cos^2 = 1$ ^^^ Message 35 in Test.tex: You should perhaps use `\cos' instead. $sin^2 + cos^2 = 1$ ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $\sin^2 + \cos^2 = 1$ ^^^^^^^^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 36-37 ^ Message 36 in Test.tex: You should put a space in front of parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 37 in Test.tex: You should avoid spaces after parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 36 in Test.tex: You should put a space in front of parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 37 in Test.tex: You should avoid spaces after parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 37 in Test.tex: You should avoid spaces in front of parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 36 in Test.tex: You should put a space in front of parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 37 in Test.tex: You should avoid spaces after parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 37 in Test.tex: You should avoid spaces in front of parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 36 in Test.tex: You should put a space after parenthesis. This( an example( Nuff said )), illustrates( ``my'' )point. ^ Message 22 in Test.tex: Comment displayed. % Warning 38 ^ Message 38 in Test.tex: You should not use punctuation in front of quotes. ``An example,'' he said, ``would be great.'' ^ Message 22 in Test.tex: Comment displayed. % Warning 39 ^ Message 39 in Test.tex: Double space found. For output codes, see table ~\ref{tab:fmtout}. ^ Message 22 in Test.tex: Comment displayed. % Warning 40 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $\this,$ and $$this$$. ^^^^^^^^ Message 40 in Test.tex: You should put punctuation outside inner math mode. $\this,$ and $$this$$. ^ Message 45 in Test.tex: Use \[ ... \] instead of $$ ... $$. $\this,$ and $$this$$. ^^^^^^^^ Message 40 in Test.tex: You should put punctuation inside display math mode. $\this,$ and $$this$$. ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. $\this$, and $$this.$$ ^^^^^^^ Message 45 in Test.tex: Use \[ ... \] instead of $$ ... $$. $\this$, and $$this.$$ ^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 41 ^ Message 1 in Test.tex: Command terminated with space. foo \above qux ^ Message 41 in Test.tex: You ought to not use primitive TeX in LaTeX code. foo \above qux ^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 42 ^ Message 42 in Test.tex: You should remove spaces in front of `\footnote' This is a footnote \footnote{foo}. ^ Message 22 in Test.tex: Comment displayed. % Warning 43 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Here is a mistake $\left{x\right}$. ^^^^^^^^^^^^^^^^ Message 43 in Test.tex: `\left' is normally not followed by `{'. Here is a mistake $\left{x\right}$. ^^^^^ Message 43 in Test.tex: `\right' is normally not followed by `}'. Here is a mistake $\left{x\right}$. ^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. This one triggers warning 22 $\left\{x\right\}$. ^^^^^^^^^^^^^^^^^^ Message 21 in Test.tex: This command might not be intended. This one triggers warning 22 $\left\{x\right\}$. ^^ Message 21 in Test.tex: This command might not be intended. This one triggers warning 22 $\left\{x\right\}$. ^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Here \chktex\ doesn't complain $\left\lbrace x\right\rbrace$. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. % Warning 44 -- user regex -- default message ^ Message 22 in Test.tex: Comment displayed. % Warning 44 -- user regex -- user message ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. For every $p\not|n$ you have an ugly prime which doesn't divide $n$. ^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. For every $p\not|n$ you have an ugly prime which doesn't divide $n$. ^^^ Message 44 in Test.tex: User Regex: Always use \nmid. For every $p\not|n$ you have an ugly prime which doesn't divide $n$. ^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. For every $p\nmid n$ you have a cute prime which doesn't divide $n$. ^^^^^^^^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. For every $p\nmid n$ you have a cute prime which doesn't divide $n$. ^^^ Message 22 in Test.tex: Comment displayed. % Math mode check ^ Message 35 in Test.tex: You should perhaps use `\sin' instead. \ensuremath{sin x\text{is not the same as sin x, but is the same as $sin x$}} ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. \ensuremath{sin x\text{is not the same as sin x, but is the same as $sin x$}} ^^^^^^^ Message 35 in Test.tex: You should perhaps use `\sin' instead. \ensuremath{sin x\text{is not the same as sin x, but is the same as $sin x$}} ^^^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Also, $x(3)\text{ is not x(3) but it is $x(3)$}$ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Message 36 in Test.tex: You should put a space in front of parenthesis. Also, $x(3)\text{ is not x(3) but it is $x(3)$}$ ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Also, $x(3)\text{ is not x(3) but it is $x(3)$}$ ^^^^^^ Message 22 in Test.tex: Comment displayed. This is\\% a comment. Nothing here should be checked(right)? ^ Message 36 in Test.tex: You should put a space in front of parenthesis. But this is not a \% comment, so we should find this error(right)? ^ Message 22 in Test.tex: Comment displayed. Here(on this line only)is a warning $sin(x)$ suppressed. % chktex 36 chktex 35 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Here(on this line only)is a warning $sin(x)$ suppressed. % chktex 36 chktex 35 ^^^^^^^^ Message 22 in Test.tex: Comment displayed. Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36 ^ Message 36 in Test.tex: You should put a space in front of parenthesis. Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36 ^ Message 36 in Test.tex: You should put a space after parenthesis. Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36 ^ Message 46 in Test.tex: Use \( ... \) instead of $ ... $. Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36 ^^^^^^^^ Message 44 in Test.tex: User Regex: 1:Capitalize before references. In section~\ref{sec:3} we have a warning. ^^^^^^^^^^^^^ Message 22 in Test.tex: Comment displayed. In section~\ref{sec:4} it is suppressed. % chktex -1 ^ Message 22 in Test.tex: Comment displayed. % In section~\ref{sec:5} we don't have a warning. ^ Message 44 in Test.tex: User Regex: -2:Vertical rules in tables are ugly. \begin{tabular*}{1.0\linewidth}[h]{|c|cc|} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Message 44 in Test.tex: User Regex: -2:Use \toprule, midrule, or \bottomrule from booktabs. \hline ^^^^^^ Message 22 in Test.tex: Comment displayed. % Verb check ^ Message 14 in Test.tex: Could not find argument for command. \verb# ^^^^^ Message 31 in Test.tex: This text may be ignored. \end{verbatim} FOO ^^^ Message 22 in Test.tex: Comment displayed. % Warning 16,15 ^ Message 45 in Test.tex: Use \[ ... \] instead of $$ ... $$. $$( ^^^^^^^ Message 22 in Test.tex: Comment displayed. % Local Variables: ^ Message 22 in Test.tex: Comment displayed. % require-final-newline: nil ^ Message 22 in Test.tex: Comment displayed. % End: ^ Message 22 in Test.tex: Comment displayed. % There should be no newline at the end of this file to test bug #46539 ^ Message 16 in Test.tex: Mathmode still on at end of LaTeX file. Message 17 in Test.tex: Number of `(' doesn't match the number of `)'! Message 17 in Test.tex: Number of `[' doesn't match the number of `]'! Message 17 in Test.tex: Number of `{' doesn't match the number of `}'! chktex-1.7.6/Test.tex000644 000765 000024 00000012455 12631460461 015276 0ustar00iandrusstaff000000 000000 Note: This file was written with only two purposes in mind: o To test the program upon it o To show off some of the features Most of the file does thus consist of lots of pseudo-commands, which are nonsense in a TeXnical manner. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Warning 1 \foo This is an error. So is this \foo \smallskip This is a not. $\foo Neither$ is this. \startsection[title={Testing ConTeXt}] These should now be an error. \stoptext % Warning 2 This is a faulty reference to \ref{foo} This is not a faulty reference to~\ref{foo} % Warning 3 $[(ab)^{-1}]^{-2}$ is not beautiful ${{[{(ab)}^{-1}]}}^{-2}$ is beautiful % Warning 4-6, 28 Testing {\it italic} in \/ this {\em sentence\/}, as {\em you \/ see\/}. Testing {\it italic\/} in this {\em sentence,} as {\em you see}. % LaTeX2e Testing \textem{italic} in \/ this \textit{sentence\/}, as \textem{you \/ see\/}. Testing \textem{italic\/} in this \textit{sentence}, as \textem{you see}. % Warning 7 This \'is a test of $\hat{j}$ accents. This \'{\i}s a test of $\hat{\jmath}$ accents. % Warning 8 It wasn't anything - just a 2---3 star--shots. It wasn't anything --- just a 2--3 star-shots. It's just a start-shot. is also used to send cross-calls (xc) and cross-traps (xt) to other % From Knuths TeXbook Chapter 14 % "How TeX Breaks Paragraphs into Lines", fourth paragraph: in plain TeX---are the key % Using DashExcpt The Birch--Swinnerton-Dyer conjecture is correct. The Birch--Swinnerton--Dyer conjecture is not correct. The Birch-Swinnerton-Dyer conjecture is not correct (but not caught). % Warning 9-10 % Brackets: )}{[])} }}}]]]))) {[]} ((([[[{{{}}}]]]))) % Envs: \begin{quux} \begin{baz} \end{quux} \end{baz} \end{asoi} \begin{dobedo} \begin{foo} \begin{bar} \end{bar}\end{foo} % Warning 11 Foo...bar. $1,...,3$. $1+...+3$. $1,\cdots,3$. $1\cdot\ldots\cdot3$. Foo\dots bar. $1,\ldots,3$. $1+\cdots+3$. $1,\ldots,3$. $1\cdot\cdots\cdot3$. % Warning 12 1st. Foo Inc. Ab.cd. foo ab.cd. Foo. bar baz., billy.; bob.: joe.! frank.? james.. george 1st.\ foo Inc.\ ab.cd.\ foo ab.cd.\ Foo.\ bar baz., billy.; bob.:\ joe.!\ frank.?\ james..\ george % Warning 13 Look at THIS! It's an error. Look at THIS\@! It's an error. D. E. Knuth. % Warning 14 \hat \hat{a} % Warning 18,19 Is this an "example", or is it an ŽexampleŽ. Is this an `example', or is it an `example'. % Warning 20 That bug is \unknown\ to me. % That bug is \unknown\ to me. % Warning 21 \LaTeX\ is an extension of \TeX\. Right? \LaTeX\ is an extension of \TeX. Right? % Warning 23 ```Hello', I heard him said'', she remembered. ``\,`Hello', I heard him said'', she remembered. % Warning 24 Indexing text \index{text} is fun! Indexing text\index{text} is fun! Indexing text% \index{text} is fun! Indexing text \index{text} is fun! % Warning 25 $5\cdot10^10$ $5\cdot10^{10}$ % Warning 26 Do you understand ? Do you understand? % Warning 27 \input input.tex \input input % Warning 29 The program opens a screen sized 640x200 pixels The program opens a screen sized $640\times200$ pixels % Warning 30 White is a beautiful colour. White is a beautiful colour. % Warning 31 \begin{verbatim} \this is \end{verbatim} foo bar % Warning 32-34 This is either an 'example`, an ''example`` or an `"`example'`'. This is either an `example', an ``example'' or an ``example''. % Warning 35 $sin^2 + cos^2 = 1$ $\sin^2 + \cos^2 = 1$ % Warning 36-37 This( an example( Nuff said )), illustrates( ``my'' )point. This (an example (Nuff said)), illustrates (``my'') point. % Warning 38 ``An example,'' he said, ``would be great.'' ``An example'', he said, ``would be great''. % Warning 39 For output codes, see table ~\ref{tab:fmtout}. For output codes, see table~\ref{tab:fmtout}. % Warning 40 $\this,$ and $$this$$. $\this$, and $$this.$$ % Warning 41 foo \above qux \frac{foo}{qux} % Warning 42 This is a footnote \footnote{foo}. This is a footnote\footnote{foo}. % Warning 43 Here is a mistake $\left{x\right}$. This one triggers warning 22 $\left\{x\right\}$. Here \chktex\ doesn't complain $\left\lbrace x\right\rbrace$. % Warning 44 -- user regex -- default message You should always write a good intro. You should always write a good introduction. % Warning 44 -- user regex -- user message For every $p\not|n$ you have an ugly prime which doesn't divide $n$. For every $p\nmid n$ you have a cute prime which doesn't divide $n$. % Math mode check \ensuremath{sin x\text{is not the same as sin x, but is the same as $sin x$}} Also, $x(3)\text{ is not x(3) but it is $x(3)$}$ This is\\% a comment. Nothing here should be checked(right)? a broken line. But this is not a \% comment, so we should find this error(right)? Here(on this line only)is a warning $sin(x)$ suppressed. % chktex 36 chktex 35 Here(on this line only)is a warning $sin(x)$ suppressed. % CHKTEX 35 36 In section~\ref{sec:3} we have a warning. In section~\ref{sec:4} it is suppressed. % chktex -1 % In section~\ref{sec:5} we don't have a warning. \begin{tabular*}{1.0\linewidth}[h]{|c|cc|} a & b \\ \hline c & d \end{tabular*} % Verb check \verb@\this is )() lots of errors, etc. Or what?@ \verb# \begin{verbatim} \this is \end{verbatim} FOO % Warning 16,15 $$( % Local Variables: % require-final-newline: nil % End: % There should be no newline at the end of this file to test bug #46539chktex-1.7.6/types.h000644 000765 000024 00000000371 10033367455 015147 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.6/Utility.c000644 000765 000024 00000047310 12764705172 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 return (Retval); } /* * 'Safe' memset() replacement. * Just tries to check the parameters, so that the risk of killing * innocent memory is lowered. * Please note that the `n' parameter now is an signed longword, not * an size_t. Won't permit that `n' exceeds BUFLEN, nor negative sizes. * Returns `to' if some memset()'ing was done, NULL if not. */ void *sfmemset(void *to, int c, long n) { if (to && (n > 0)) { n = min(n, BUFSIZ); return (memset(to, c, (size_t) n)); } return (NULL); } /* * Quick replace function * Replaces every occurrence of a character in a string with another one. */ void strrep(char *String, /* String to replace within. */ const char From, /* Character to search for. */ const char To) /* Character to put instead. */ { register int c; while ((c = *String++)) { if (c == From) String[-1] = To; } } /* * Replaces every char not in Prot with To in Buf */ void strxrep(char *Buf, const char *Prot, const char To) { int c; while ((c = *Buf)) { if (!strchr(Prot, c)) *Buf = To; Buf++; } } /* * Strips tail and/or front of a string * Kills trailing/leading spaces. The macro/function LATEX_SPACE(char c) * is used to decide whether a space should be skipped. This function * should return TRUE if the character should be skipped, FALSE if not. * Returns the string which was passed onto it. */ char *strip(char *str, /* String to strip */ const enum Strip flags) /* One of the following: */ /* STRP_LFT - Strips leading blanks */ /* STRP_RGT - Strips trailing blanks */ /* STRP_BTH - Strips on both sides */ { char *bufptr = str; char *nlptr; char c; if (bufptr && (c = *bufptr)) { if (flags & STRP_LFT) { if (LATEX_SPACE(c) && c) { do { c = *++bufptr; } while (LATEX_SPACE(c) && c); } } if (flags & STRP_RGT) { if (c && *bufptr) { nlptr = bufptr; while (*++nlptr) ; do { *nlptr = 0; c = *--nlptr; } while (LATEX_SPACE(c) && c && (nlptr > bufptr)); } else *bufptr = 0; } } return (bufptr); } /* * Converts all the chars in the string passed into lowercase. */ #ifndef HAVE_STRLWR char *strlwr(char *String) { char *Bufptr; char TmpC; for (Bufptr = String; (TmpC = *Bufptr); Bufptr++) *Bufptr = tolower((unsigned char)TmpC); return (String); } #endif /* * Returns a duplicate of the string passed. */ #ifndef HAVE_STRDUP char *strdup(const char *String) { char *Retval = NULL; size_t Len; if (String) { Len = strlen(String) + 1; if ((Retval = malloc(Len))) memcpy(Retval, String, Len); } return (Retval); } #endif /* * Does the same as strdup, but adds a zero-filled padding, length extra bytes. */ char *strdupx(const char *String, int Extra) { char *Retval = NULL; size_t Len; if (String) { Len = strlen(String) + 1 + Extra; if ((Retval = malloc(Len))) strncpy(Retval, String, Len); } return (Retval); } /* * Case-insensitive comparison of two strings. */ #ifndef HAVE_STRCASECMP int strcasecmp(const char *a, const char *b) { int aa, bb; do { aa = *a++; bb = *b++; } while (aa && (tolower((unsigned char)aa) == tolower((unsigned char)bb))); /* bb != 0 is implicit */ return (tolower((unsigned char)aa) - tolower((unsigned char)bb)); } #endif /* * Not all reallocs are intelligent enough to handle NULL's as * parameters. This fixes this. */ void *saferealloc(void *b, size_t n) { void *Retval = NULL; if (b) { if (n) Retval = realloc(b, n); else free(b); } else Retval = malloc(n); return (Retval); } /* * Repeatedly writes the From string over To so that we overwrite Len bytes. * Does nothing if passed empty/NULL string. */ void strwrite(char *To, const char *From, unsigned long Len) { unsigned long i, j; unsigned long FromLen = strlen(From); Len = min(Len, BUFSIZ); if (To && From) { switch (FromLen) { case 0: break; case 1: memset(To, *From, Len); break; default: for (i = j = 0; i < Len; i++, j++) { if (j >= FromLen) j = 0; To[i] = From[j]; } } } } /* * Checks whether Cmp comes after Str. * */ int strafter(const char *Str, const char *Cmp) { return (strncmp(Str, Cmp, strlen(Cmp))); } /* * Checks whether Cmp comes before Str. Returns 0 if so, non-zero if not. * */ int strinfront(const char *Str, const char *Cmp) { int CmpLen; if ((CmpLen = strlen(Cmp))) { Cmp += CmpLen; Str++; while ((*--Cmp == *--Str) && (--CmpLen > 0)) ; return (CmpLen); } else return (1); } /*************************** HASH INDEX **************************/ /* * Hashes a string. The string ought be rather short. * * The algorithm was designed by Peter Weinberger. This version was * adapted from Dr Dobb's Journal April 1996 page 26. */ static unsigned long HashWord(const char *str) { register unsigned long h = 0, hbit, c; while ((c = *str++)) { h = (h << 4) ^ c; if ((hbit = h & 0xf0000000)) h ^= hbit >> 24; h &= ~hbit; } return (h); } /* * Inserts a string into a hash index. Note: You'll have to * duplicate the string yourself. */ void InsertHash(char *a, struct Hash *h) { struct HashEntry **he, *newhe; if (!h->Index) { if (!((h->Index = calloc(HASH_SIZE, sizeof(struct HashEntry *))))) PrintPrgErr(pmWordListErr); } he = &h->Index[HashWord(a) % HASH_SIZE]; if ((newhe = malloc(sizeof(struct HashEntry)))) { newhe->Next = *he; newhe->Str = a; *he = newhe; } else PrintPrgErr(pmWordListErr); } /* * Checks whether a string previously has been registered in a * hash index. */ char *HasHash(const char *a, const struct Hash *h) { struct HashEntry *he; HASH_TYPE i; /* Special magic to optimize SAS/C */ /* Do we have a hash? */ if (!h->Index) return NULL; /* Find entry in hash */ i = HashWord(a); i %= HASH_SIZE; he = h->Index[i]; /* Search in the entry for the item */ while (he) { if (!strcmp(he->Str, a)) return (he->Str); else he = he->Next; } return (NULL); } /* * Clears a hash table. */ void ClearHash(struct Hash *h) { int i; struct HashEntry *he, *next; if (h && h->Index) { /* Free all the memory */ for ( i = 0; i < HASH_SIZE; ++i ) { he = h->Index[i]; while ( he ) { next = he->Next; free( he ); he = next; } } /* Reset the hash table */ memset(h->Index, '\0', HASH_SIZE * sizeof(struct HashEntry *)); } } /* * Rehashes a wordlist. If you change any of the elem's, you must * call this. * */ static void ReHash(struct WordList *WL) { unsigned long i = 0; ClearHash(&WL->Hash); FORWL(i, *WL) InsertHash(WL->Stack.Data[i], &WL->Hash); } /*************************** WORDLIST HANDLING **************************/ /* * Inserts a duplicate of `Word' into the `Wordlist' structure. You do thus * not need to make a duplicate of `Word' yourself. */ int InsertWord(const char *Word, struct WordList *WL) { char *WrdCpy; unsigned long Len; if ((WrdCpy = strdupx(Word, WALLBYTES))) { if (StkPush(WrdCpy, &WL->Stack)) { Len = strlen(Word); if (WL->MaxLen < Len) WL->MaxLen = Len; InsertHash(WrdCpy, &WL->Hash); return (TRUE); } free(WrdCpy); } return (FALSE); } /* * Clears a WordList; removing all items. */ void ClearWord(struct WordList *WL) { char *Word; if (WL) { while ( (Word = StkPop( &WL->Stack )) ) { free(Word); } WL->Stack.Used = 0; WL->MaxLen = 0; ClearHash(&WL->Hash); if (WL->NonEmpty) InsertWord("", WL); } } /* * Query whether a `Word' is previously InsertWord()'ed into the WL * structure. Does case-sensitive comparison. * * Returns the data in the list. */ char *HasWord(const char *Word, struct WordList *WL) { return HasHash(Word, &WL->Hash); } /* * Make all the words in a list lower case for later case-insensitive * comparison. */ void MakeLower(struct WordList *wl) { unsigned long i; FORWL(i, *wl) strlwr(wl->Stack.Data[i]); ReHash(wl); } /* * Calls strrep on each argument in a list. */ void ListRep(struct WordList *wl, const char From, const char To) { unsigned long i; FORWL(i, *wl) strrep(wl->Stack.Data[i], From, To); ReHash(wl); } /************************** GENERIC STACK ******************************/ /* * Push something onto a stack. Returns TRUE if successful, else FALSE. * Note: You can not push a NULL Data element. */ int StkPush(void *Data, struct Stack *Stack) { unsigned long NewSize; void **NewBuf; if (Data && Stack) { if (Stack->Used >= Stack->Size) { NewSize = Stack->Size + MINPUDDLE; if ((NewBuf = saferealloc(Stack->Data, (size_t) NewSize * sizeof(void *)))) { Stack->Size = NewSize; Stack->Data = NewBuf; } else return (FALSE); } Stack->Data[Stack->Used++] = Data; return (TRUE); } return (FALSE); } /* * Pops an element from the stack. * */ void *StkPop(struct Stack *Stack) { void *Retval = NULL; if (Stack && (Stack->Used > 0)) { Retval = Stack->Data[--Stack->Used]; #ifdef NO_DIRTY_TRICKS { void **NewBuf; if (Stack->Used < (Stack->Size / 2)) { unsigned long NewSize; NewSize = Stack->Size - MINPUDDLE; NewSize = max(NewSize, MINPUDDLE); if (NewBuf = saferealloc(Stack->Data, (size_t) NewSize * sizeof(void *))) { Stack->Size = NewSize; Stack->Data = NewBuf; } } } #endif } return (Retval); } /* * Returns the topmost element of the stack. */ void *StkTop(struct Stack *Stack) { if (Stack && (Stack->Used > 0)) return (Stack->Data[Stack->Used - 1]); else return (NULL); } /****************************** INPUT STACK *****************************/ int PushFileName(const char *Name, struct Stack *stack) { FILE *fh = NULL; static char NameBuf[BUFSIZ]; if (Name && stack) { if (LocateFile(Name, NameBuf, ".tex", &TeXInputs)) { if ((fh = fopen(NameBuf, "r"))) { return (PushFile(NameBuf, fh, stack)); } } PrintPrgErr(pmNoTeXOpen, Name); } return (FALSE); } int PushFile(const char *Name, FILE * fh, struct Stack *stack) { struct FileNode *fn; if (Name && fh && stack) { if ((fn = malloc(sizeof(struct FileNode)))) { if ((fn->Name = strdup(Name))) { fn->fh = fh; fn->Line = 0L; if (StkPush(fn, stack)) return (TRUE); free(fn->Name); } free(fn); } PrintPrgErr(pmNoStackMem); } return (FALSE); } char *FGetsStk(char *Dest, unsigned long len, struct Stack *stack) { static short HasSeenLong = 0; struct FileNode *fn; char *Retval = NULL; size_t Retlen = 0; if ((fn = StkTop(stack))) { do { Retval = fgets(Dest, (int)len, fn->fh); if (Retval) { Retlen = strlen(Retval); if (Retval[Retlen-1] == '\n' || Retlen < len-1) fn->Line++; /* We only want the long lines warning once per file */ else if (!HasSeenLong) { PrintPrgErr(pmLongLines, len-2); HasSeenLong = 1; } break; } fn = StkPop(stack); fclose(fn->fh); if ( fn->Name != NULL ) free(fn->Name); free(fn); HasSeenLong = 0; } while (!Retval && (fn = StkTop(stack))); } return (Retval); } const char *CurStkName(struct Stack *stack) { struct FileNode *fn; static const char *LastName = ""; if (PseudoInName && (stack->Used <= 1)) return (PseudoInName); else { if ((fn = StkTop(stack))) { if ( stack->Used == 1 && strlen(LastName) == 0 && fn->Name ) { LastName = strdup(fn->Name); } return (fn->Name); } else return (LastName); } } FILE *CurStkFile(struct Stack * stack) { struct FileNode *fn; if ((fn = StkTop(stack))) return (fn->fh); else return (NULL); } unsigned long CurStkLine(struct Stack *stack) { struct FileNode *fn; static unsigned long LastLine = 0L; if ((fn = StkTop(stack))) return (LastLine = fn->Line); else return (LastLine); } /************************** CHARACTER STACK ******************************/ /* * Pushes the character on the stack. */ struct ErrInfo *PushChar(const char c, const unsigned long Line, const unsigned long Column, struct Stack *Stk, const char *LineCpy) { char Buf[2]; Buf[0] = c; Buf[1] = 0; return (PushErr(Buf, Line, Column, 1, LineCpy, Stk)); } struct ErrInfo *PushErr(const char *Data, const unsigned long Line, const unsigned long Column, const unsigned long ErrLen, const char *LineCpy, struct Stack *Stk) { struct ErrInfo *ci; if ((ci = malloc(sizeof(struct ErrInfo)))) { if ((ci->Data = strdup(Data))) { if ((ci->File = strdup(CurStkName(&InputStack)))) { if ((ci->LineBuf = strdup(LineCpy))) { ci->Line = Line; ci->ErrLen = ErrLen; ci->Column = Column; ci->Flags = efNone; if (StkPush(ci, Stk)) return (ci); free(ci->LineBuf); } else PrintPrgErr(pmStrDupErr); free(ci->File); } else PrintPrgErr(pmStrDupErr); free(ci->Data); } else PrintPrgErr(pmStrDupErr); free(ci); } return (NULL); } /* * Finds the uppermost entry in the stack with a data matching * String. */ struct ErrInfo *TopMatch(struct Stack *Stack, char *String) { int i; struct ErrInfo *retval = NULL; if (Stack && String) { for (i = Stack->Used - 1; i >= 0; i--) { if (!strcmp(String, ((struct ErrInfo *) Stack->Data[i])->Data)) { retval = (struct ErrInfo *) Stack->Data[i]; break; } } } return (retval); } /* * Returns and removes a character from the stack, returns NULL if * the stack is empty. */ struct ErrInfo *PopErr(struct Stack *Stack) { return ((struct ErrInfo *) StkPop(Stack)); } /* * Same as PopChar(), but lets the error alone on the stack. */ struct ErrInfo *TopErr(struct Stack *Stack) { return ((struct ErrInfo *) StkTop(Stack)); } /* * Free all resources associated with a struct FreeInfo. */ void FreeErrInfo(struct ErrInfo *ei) { if (ei) { if (ei->Data) free(ei->Data); if (ei->File) free(ei->File); if (ei->LineBuf) free(ei->LineBuf); free(ei); } } /************************* OPEN/CLOSE COUNTING **************************/ /* * Returns the index a given bracket (`()[]{}') character has in the * BrOrder array. Returns ~0 if the character was not a bracket. */ long BrackIndex(const char c) { switch (c) { case '(': return (0); case ')': return (1); case '[': return (2); case ']': return (3); case '{': return (4); case '}': return (5); default: return (~0L); } } /* * Counts brackets for you. Give it a bracket, and it will update the * corresponding counter. */ void AddBracket(const char c) { long Index; if ((Index = BrackIndex(c)) != -1) Brackets[Index]++; } /* * Returns the character that matches the given bracket, NULL if `c' * wasn't a bracket character. */ char MatchBracket(const char c) { unsigned long Index; char Char = 0; if ((Index = BrackIndex(c)) != ~0UL) Char = BrOrder[Index ^ 1]; return (Char); } chktex-1.7.6/Utility.h000644 000765 000024 00000011662 12042737224 015450 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; }; /* Rotates x n bits left (should be an int, long, etc.) */ #define ROTATEL(x,n) ((x<>((CHAR_BIT*sizeof(x)) - n))) /* Rotates x n bits right (should be an int, long, etc.) */ #define ROTATER(x,n) ((x>>n) | (x<<((CHAR_BIT*sizeof(x)) - n))) /* Subtract 1 because sizeof includes the null terminator. * WARNING: To use this on a variable, the type should be char[] * rather than char*, since for some versions of gcc these give * different values. */ #define STRLEN(x) (sizeof(x)/sizeof(x[0]) - 1) int fexists(const char *Filename); void *sfmemset(void *to, int c, long n); void *saferealloc(void *old, size_t newsize); int strafter(const char *Str, const char *Cmp); void strrep(char *String, const char From, const char To); void strxrep(char *Buf, const char *Prot, const char To); char *strip(char *String, const enum Strip What); void strwrite(char *To, const char *From, unsigned long Len); int strinfront(const char *Str, const char *Cmp); char *strdupx(const char *String, int Extra); void strmove(char *a, const char *b); void ClearHash(struct Hash *h); void InsertHash(char *a, struct Hash *h); char *HasHash(const char *a, const struct Hash *h); int InsertWord(const char *Word, struct WordList *WL); char *HasWord(const char *Word, struct WordList *WL); void MakeLower(struct WordList *wl); void ListRep(struct WordList *wl, const char From, const char To); void ClearWord(struct WordList *WL); int StkPush(void *Data, struct Stack *Stack); void *StkPop(struct Stack *Stack); void *StkTop(struct Stack *Stack); FILE *CurStkFile(struct Stack *stack); const char *CurStkName(struct Stack *stack); unsigned long CurStkLine(struct Stack *stack); char *FGetsStk(char *Dest, unsigned long len, struct Stack *stack); int PushFileName(const char *Name, struct Stack *stack); int PushFile(const char *, FILE *, struct Stack *); void FreeErrInfo(struct ErrInfo *ei); struct ErrInfo *PushChar(const char c, const unsigned long Line, const unsigned long Column, struct Stack *Stk, const char *LineCpy); struct ErrInfo *PushErr(const char *Data, const unsigned long Line, const unsigned long Column, const unsigned long ErrLen, const char *LineCpy, struct Stack *Stk); struct ErrInfo *TopChar(struct Stack *Stack); struct ErrInfo *TopErr(struct Stack *Stack); struct ErrInfo *PopErr(struct Stack *Stack); struct ErrInfo *TopMatch(struct Stack *Stack, char *String); long BrackIndex(const char c); void AddBracket(const char c); char MatchBracket(const char c); short substring(const char *source, char *dest, unsigned long pos, long len); #ifndef HAVE_STRLWR # define strlwr mystrlwr char *mystrlwr(char *String); #endif #ifndef HAVE_STRDUP # define strdup mystrdup char *mystrdup(const char *String); #endif #ifndef HAVE_STRCASECMP int strcasecmp(char *a, char *b); #endif #if !(defined HAVE_DECL_STPCPY && HAVE_DECL_STPCPY) static inline char * stpcpy(char *dest, const char *src) { return strcpy(dest, src) + strlen(src); } #endif #endif /* UTILITY_H */ chktex-1.7.6/m4/ax_cflags_strict_prototypes.m4000644 000765 000024 00000015341 11037350453 022241 0ustar00iandrusstaff000000 000000 # =========================================================================== # http://autoconf-archive.cryp.to/ax_cflags_strict_prototypes.html # =========================================================================== # # SYNOPSIS # # AX_CFLAGS_STRICT_PROTOTYPES [(shellvar [,default, [A/NA]] # # DESCRIPTION # # Try to find a compiler option that requires strict prototypes. # # The sanity check is done by looking at sys/signal.h which has a set of # macro-definitions SIG_DFL and SIG_IGN that are cast to the local # signal-handler type. If that signal-handler type is not fully qualified # then the system headers are not seen as strictly prototype clean. # # For the GNU CC compiler it will be -fstrict-prototypes # -Wstrict-prototypes The result is added to the shellvar being CFLAGS by # default. # # DEFAULTS: # # - $1 shell-variable-to-add-to : CFLAGS # - $2 add-value-if-not-found : nothing # - $3 action-if-found : add value to shellvariable # - $4 action-if-not-found : nothing # # LAST MODIFICATION # # 2008-04-12 # # COPYLEFT # # Copyright (c) 2008 Guido U. Draheim # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; either version 2 of the License, or (at your # option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General # Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # As a special exception, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Macro Archive. When you make and # distribute a modified version of the Autoconf Macro, you may extend this # special exception to the GPL to apply to your modified version as well. AC_DEFUN([AX_CFLAGS_STRICT_PROTOTYPES],[dnl AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl AS_VAR_PUSHDEF([VAR],[ac_cv_cflags_strict_prototypes])dnl AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for strict prototypes], VAR,[VAR="no, unknown" AC_LANG_SAVE AC_LANG_C ac_save_[]FLAGS="$[]FLAGS" for ac_arg dnl in "-pedantic % -fstrict-prototypes -Wstrict-prototypes" dnl GCC "-pedantic % -Wstrict-prototypes" dnl try to warn atleast "-pedantic % -Wmissing-prototypes" dnl or another warning "-pedantic % -Werror-implicit-function-declaration" dnl "-pedantic % -Wimplicit-function-declaration" dnl # do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` AC_TRY_COMPILE([],[return 0;], [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break]) done case ".$VAR" in .|.no|.no,*) ;; *) # sanity check with signal() from sys/signal.h cp config.log config.tmp AC_TRY_COMPILE([#include ],[ if (signal (SIGINT, SIG_IGN) == SIG_DFL) return 1; if (signal (SIGINT, SIG_IGN) != SIG_DFL) return 2;], dnl the original did use test -n `$CC testprogram.c` [if test `diff config.log config.tmp | grep -i warning | wc -l` != 0 then if test `diff config.log config.tmp | grep -i warning | wc -l` != 1 then VAR="no, suppressed, signal.h," ; fi ; fi], [VAR="no, suppressed, signal.h"]) rm config.tmp ;; esac FLAGS="$ac_save_[]FLAGS" AC_LANG_RESTORE ]) case ".$VAR" in .ok|.ok,*) m4_ifvaln($3,$3) ;; .|.no|.no,*) m4_ifvaln($4,$4,[m4_ifval($2,[ AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"]) m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"])]) ;; *) m4_ifvaln($3,$3,[ if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $VAR " 2>&1 >/dev/null then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $VAR]) else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"]) m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR" fi ]) ;; esac AS_VAR_POPDEF([VAR])dnl AS_VAR_POPDEF([FLAGS])dnl ]) dnl the only difference - the LANG selection... and the default FLAGS AC_DEFUN([AX_CXXFLAGS_STRICT_PROTOTYPES],[dnl AS_VAR_PUSHDEF([FLAGS],[CXXFLAGS])dnl AS_VAR_PUSHDEF([VAR],[ac_cv_cxxflags_strict_prototypes])dnl AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for strict prototypes], VAR,[VAR="no, unknown" AC_LANG_SAVE AC_LANG_CPLUSPLUS ac_save_[]FLAGS="$[]FLAGS" for ac_arg dnl in "-pedantic -Werror % -fstrict-prototypes -Wstrict-prototypes" dnl GCC "-pedantic -Werror % -Wstrict-prototypes" dnl try to warn atleast "-pedantic -Werror % -Wmissing-prototypes" dnl try to warn atleast "-pedantic -Werror % -Werror-implicit-function-declaration" dnl "-pedantic -Werror % -Wimplicit-function-declaration" dnl "-pedantic % -Wstrict-prototypes %% no, unsupported in C++" dnl oops # do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` AC_TRY_COMPILE([],[return 0;], [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break]) done case ".$VAR" in .|.no|.no,*) ;; *) # sanity check with signal() from sys/signal.h cp config.log config.tmp AC_TRY_COMPILE([#include ],[ if (signal (SIGINT, SIG_IGN) == SIG_DFL) return 1; if (signal (SIGINT, SIG_IGN) != SIG_DFL) return 2;], dnl the original did use test -n `$CC testprogram.c` [if test `diff config.log config.tmp | grep -i warning | wc -l` != 0 then if test `diff config.log config.tmp | grep -i warning | wc -l` != 1 then VAR="no, suppressed, signal.h," ; fi ; fi], [VAR="no, suppressed, signal.h"]) rm config.tmp ;; esac FLAGS="$ac_save_[]FLAGS" AC_LANG_RESTORE ]) case ".$VAR" in .ok|.ok,*) m4_ifvaln($3,$3) ;; .|.no|.no,*) m4_ifvaln($4,$4,[m4_ifval($2,[ AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"]) m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $2"])]) ;; *) m4_ifvaln($3,$3,[ if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $VAR " 2>&1 >/dev/null then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $VAR]) else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"]) m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR" fi ]) ;; esac AS_VAR_POPDEF([VAR])dnl AS_VAR_POPDEF([FLAGS])dnl ]) chktex-1.7.6/m4/vl_prog_cc_warnings.m4000644 000765 000024 00000007504 07654705031 020447 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