/*
*  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: <[email protected]>
*
*
*/

#ifndef FINDERRS_H
#define FINDERRS_H
#include "ChkTeX.h"


#undef ERRMSGS
#undef MSG

#define ERRMSGS \
MSG(emMinFault, etErr, iuOK, ctNone,\
    INTERNFAULT)\
MSG(emSpaceTerm, etWarn, iuOK, ctOutMath,\
    "Command terminated with space.")\
MSG(emNBSpace, etWarn, iuOK, ctNone,\
    "Non-breaking space (`~') should have been used.")\
MSG(emEnclosePar, etWarn, iuOK, ctInMath,\
    "You should enclose the previous parenthesis with `{}\'.")\
MSG(emItInNoIt, etWarn, iuOK, ctNone,\
    "Italic correction (`\\/') found in non-italic buffer.")\
MSG(emItDup, etWarn, iuOK, ctNone,\
    "Italic correction (`\\/') found more than once.")\
MSG(emNoItFound, etWarn, iuOK, ctNone,\
    "No italic correction (`\\/') found.")\
MSG(emAccent, etWarn, iuOK, ctNone,\
    "Accent command `%s' needs use of `\\%c%s'.")\
MSG(emWrongDash, etWarn, iuOK, ctOutMath,\
    "Wrong length of dash may have been used.")\
MSG(emExpectC, etWarn, iuOK, ctNone,\
    "`%s' expected, found `%s'.")\
MSG(emSoloC, etWarn, iuOK, ctNone,\
    "Solo `%s' found.")\
MSG(emEllipsis, etWarn, iuOK, ctNone,\
    "You should use %s to achieve an ellipsis.")\
MSG(emInterWord, etWarn, iuOK, ctOutMath,\
    "Interword spacing (`\\ ') should perhaps be used.")\
MSG(emInterSent, etWarn, iuOK, ctOutMath,\
    "Intersentence spacing (`\\@') should perhaps be used.")\
MSG(emNoArgFound, etErr, iuOK, ctNone,\
    "Could not find argument for command.")\
MSG(emNoMatchC, etWarn, iuOK, ctOutMath,\
    "No match found for `%s'.")\
MSG(emMathStillOn, etWarn, iuOK, ctNone,\
    "Mathmode still on at end of LaTeX file.")\
MSG(emNoMatchCC, etWarn, iuOK, ctNone,\
    "Number of `%c' doesn't match the number of `%c'!")\
MSG(emUseQuoteLiga, etWarn, iuOK, ctNone,\
    "Use either `` or '' as an alternative to `\"'.")\
MSG(emUseOtherQuote, etWarn, iuNotSys, ctNone,\
    "Use \"'\" (ASCII 39) instead  of \"\xB4\" (ASCII 180).")\
MSG(emUserWarn, etWarn, iuOK, ctNone,\
    "User-specified pattern found: %s.")\
MSG(emNotIntended, etWarn, iuNotSys, ctNone,\
    "This command might not be intended.")\
MSG(emComment, etMsg, iuNotSys, ctNone,\
    "Comment displayed.")\
MSG(emThreeQuotes, etWarn, iuOK, ctNone,\
    "Either %c\\,%c%c or %c%c\\,%c will look better.")\
MSG(emFalsePage, etWarn, iuOK, ctOutMath,\
    "Delete this space to maintain correct pagereferences.")\
MSG(emEmbrace, etWarn, iuOK, ctInMath,\
    "You might wish to put this between a pair of `{}'")\
MSG(emSpacePunct, etWarn, iuOK, ctOutMath,\
    "You ought to remove spaces in front of punctuation.")\
MSG(emNoCmdExec, etWarn, iuOK, ctNone,\
    "Could not execute LaTeX command.")\
MSG(emItPunct, etWarn, iuOK, ctNone,\
    "Don't use \\/ in front of small punctuation.")\
MSG(emUseTimes, etWarn, iuOK, ctNone,\
    "$\\times$ may look prettier here.")\
MSG(emMultiSpace, etWarn, iuNotSys, ctOutMath,\
    "Multiple spaces detected in input.")\
MSG(emIgnoreText, etWarn, iuOK, ctNone,\
   "This text may be ignored.")\
MSG(emBeginQ, etWarn, iuOK, ctOutMath,\
  "Use ` to begin quotation, not '.")\
MSG(emEndQ, etWarn, iuOK, ctOutMath,\
  "Use ' to end quotation, not `.")\
MSG(emQuoteMix, etWarn, iuOK, ctNone,\
    "Don't mix quotes.")\
MSG(emWordCommand, etWarn, iuOK, ctInMath,\
    "You should perhaps use `\\%s' instead.")\
MSG(emSpaceParen, etWarn, iuOK, ctOutMath,\
    "You should put a space %s parenthesis.")\
MSG(emNoSpaceParen, etWarn, iuOK, ctOutMath,\
    "You should avoid spaces %s parenthesis.")\
MSG(emQuoteStyle, etWarn, iuOK, ctOutMath,\
    "You should not use punctuation %s quotes.")\
MSG(emDblSpace, etWarn, iuOK, ctOutMath,\
    "Double space found.")\
MSG(emPunctMath, etWarn, iuOK, ctNone,\
    "You should put punctuation %s math mode.")\
MSG(emTeXPrim, etWarn, iuNotSys, ctNone,\
    "You ought to not use primitive TeX in LaTeX code.")\
MSG(emRemPSSpace, etWarn, iuOK, ctOutMath,\
    "You should remove spaces in front of `%s'") \
MSG(emNoCharMean, etWarn, iuOK, ctNone,\
    "`%s' is normally not followed by `%c'.")\
MSG(emUserWarnRegex, etWarn, iuOK, ctNone,\
    "User Regex: %.*s.") \
MSG(emDisplayMath, etWarn, iuOK, ctOutMath,\
    "Use \\[ ... \\] instead of $$ ... $$.")\
MSG(emInlineMath, etWarn, iuNotSys, ctOutMath,\
    "Use \\( ... \\) instead of $ ... $.")\
MSG(emExpectConTeXt, etWarn, iuOK, ctNone,\
    "`%s' expected, found `%s' (ConTeXt).")\
MSG(emNoMatchConTeXt, etWarn, iuOK, ctNone,\
    "No match found for `%s' (ConTeXt).") \
MSG(emMathModeConfusion, etWarn, iuOK, ctNone,\
    "Expected math mode to be %s here.")

#undef MSG
#define MSG(num, type, inuse, ctxt, text) num,

enum ErrNum
{
   ERRMSGS emMaxFault
};
#undef MSG

enum Context
{
   ctNone = 0x00,
   ctInMath = 0x01,
   ctOutMath = 0x02,
   ctInHead = 0x04,
   ctOutHead = 0x08
};

struct ErrMsg
{
   enum ErrNum Number;
   enum
   {
       etMsg,
       etWarn,
       etErr
   } Type;

   enum
   {
       iuNotSys,
       iuNotUser,
       iuOK
   } InUse;

   /* Requirements posed upon environment */
   enum Context Context;

   const char *Message;
};

enum ItState
{
   itOff,
   itOn,
   itCorrected
};


enum DotLevel
{
   dtUnknown = 0x0,
   dtCDots = 0x1,
   dtLDots = 0x2,
   dtDots = 0x4
};

extern struct ErrMsg LaTeXMsgs[emMaxFault + 1];

extern char *OutputFormat;

int CheckSilentRegex(void);
int FindErr(const char *, const unsigned long);
void PrintError(const enum ErrNum, const char *, const char *, const long,
               const long, const long,  ...);
void PrintStatus(unsigned long Lines);

#endif /* FINDERRS */