Added '_' checking that warns of the use of "_" or "\_" in the wrong places

Added syntax checking for common documenting problems that tex2rtf does not handle properly (like \begin{verbatim} and others needing to be on a line by themselves)
Syntax checking and curley brace matching can be turned on via the commandline, or the new OPTIONS menu choice if using a GUI.  Both are OFF by default to match current behavior
Compilation again possible now if wxUSE_DEBUG_CONTEXT is set to 0 in setup.h
Various GUI glitches fixed


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10309 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
George Tasker
2001-05-24 16:54:19 +00:00
parent a217777fb3
commit fad535eea3
4 changed files with 231 additions and 71 deletions

View File

@@ -72,6 +72,26 @@ int hugeFont1 = 20;
int HugeFont2 = 24;
int HUGEFont3 = 28;
// All of these tokens MUST be found on a line by themselves (no other
// text) and must start at the first character of the line, or tex2rtf
// will fail to process them correctly (a limitation of tex2rtf, not TeX)
wxString syntaxTokens[] =
{ "\\begin{verbatim}",
"\\begin{toocomplex}",
"\\end{verbatim}",
"\\end{toocomplex}",
"\\verb",
"\\begin{comment}",
"\\end{comment}",
"\\verbatiminput",
"\\par",
"\\input",
"\\helpinput",
"\\include",
wxEmptyString
};
/*
* USER-ADJUSTABLE SETTINGS
*
@@ -88,6 +108,8 @@ bool winHelp = FALSE; // Output in Windows Help format if TRUE, line
bool isInteractive = FALSE;
bool runTwice = FALSE;
int convertMode = TEX_RTF;
bool checkCurleyBraces = FALSE;
bool checkSyntax = FALSE;
bool headerRule = FALSE;
bool footerRule = FALSE;
bool compatibilityMode = FALSE; // If TRUE, maximum Latex compatibility
@@ -395,7 +417,7 @@ bool readInVerbatim = FALSE; // Within a verbatim, but not nec. verbatiminput
// Switched this off because e.g. \verb${$ causes it to fail. There is no
// detection of \verb yet.
#define CHECK_BRACES 1
// #define CHECK_BRACES 1
unsigned long leftCurly = 0;
unsigned long rightCurly = 0;
@@ -408,7 +430,7 @@ bool read_a_line(char *buf)
buf[0] = 0;
return FALSE;
}
int ch = -2;
int bufIndex = 0;
buf[0] = 0;
@@ -430,24 +452,25 @@ bool read_a_line(char *buf)
ch = getc(Inputs[CurrentInputIndex]);
#if CHECK_BRACES
if (ch == '{' && !readInVerbatim)
leftCurly++;
if (ch == '}' && !readInVerbatim)
if (checkCurleyBraces)
{
rightCurly++;
if (rightCurly > leftCurly)
{
wxString errBuf;
errBuf.Printf("An extra right curly brace ('}') was detected at line %lu inside file %s",LineNumbers[CurrentInputIndex], (const char*) currentFileName.c_str());
OnError((char *)errBuf.c_str());
if (ch == '{' && !readInVerbatim)
leftCurly++;
if (ch == '}' && !readInVerbatim)
{
rightCurly++;
if (rightCurly > leftCurly)
{
wxString errBuf;
errBuf.Printf("An extra right curly brace ('}') was detected at line %lu inside file %s",LineNumbers[CurrentInputIndex], (const char*) currentFileName.c_str());
OnError((char *)errBuf.c_str());
// Reduce the count of right curly braces, so the mismatched count
// isn't reported on every line that has a '}' after the first mismatch
rightCurly--;
}
// Reduce the count of right curly braces, so the mismatched count
// isn't reported on every line that has a '}' after the first mismatch
rightCurly--;
}
}
}
#endif
if (ch != EOF)
{
@@ -496,14 +519,14 @@ bool read_a_line(char *buf)
{
// Convert embedded characters to RTF equivalents
switch(ch)
{
case 0xf6: // <20>
case 0xe4: // <20>
case 0xfc: // <20>
case 0xd6: // <20>
case 0xc4: // <20>
case 0xdc: // <20>
switch(ch)
{
case 0xf6: // <20>
case 0xe4: // <20>
case 0xfc: // <20>
case 0xd6: // <20>
case 0xc4: // <20>
case 0xdc: // <20>
if (bufIndex+5 >= MAX_LINE_BUFFER_SIZE)
{
wxString errBuf;
@@ -512,21 +535,21 @@ bool read_a_line(char *buf)
OnError((char *)errBuf.c_str());
return FALSE;
}
buf[bufIndex++]='\\';
buf[bufIndex++]='"';
buf[bufIndex++]='{';
switch(ch)
{
case 0xf6:buf[bufIndex++]='o';break; // <20>
case 0xe4:buf[bufIndex++]='a';break; // <20>
case 0xfc:buf[bufIndex++]='u';break; // <20>
case 0xd6:buf[bufIndex++]='O';break; // <20>
case 0xc4:buf[bufIndex++]='A';break; // <20>
case 0xdc:buf[bufIndex++]='U';break; // <20>
}
buf[bufIndex++]='}';
break;
case 0xdf: // <20>
buf[bufIndex++]='\\';
buf[bufIndex++]='"';
buf[bufIndex++]='{';
switch(ch)
{
case 0xf6:buf[bufIndex++]='o';break; // <20>
case 0xe4:buf[bufIndex++]='a';break; // <20>
case 0xfc:buf[bufIndex++]='u';break; // <20>
case 0xd6:buf[bufIndex++]='O';break; // <20>
case 0xc4:buf[bufIndex++]='A';break; // <20>
case 0xdc:buf[bufIndex++]='U';break; // <20>
}
buf[bufIndex++]='}';
break;
case 0xdf: // <20>
if (bufIndex+5 >= MAX_LINE_BUFFER_SIZE)
{
wxString errBuf;
@@ -535,13 +558,13 @@ bool read_a_line(char *buf)
OnError((char *)errBuf.c_str());
return FALSE;
}
buf[bufIndex++]='\\';
buf[bufIndex++]='s';
buf[bufIndex++]='s';
buf[bufIndex++]='\\';
buf[bufIndex++]='s';
buf[bufIndex++]='s';
buf[bufIndex++]='\\';
buf[bufIndex++]='/';
break;
default:
break;
default:
if (bufIndex >= MAX_LINE_BUFFER_SIZE)
{
wxString errBuf;
@@ -550,8 +573,42 @@ bool read_a_line(char *buf)
OnError((char *)errBuf.c_str());
return FALSE;
}
buf[bufIndex++] = ch;
break;
// If the current character read in is a '_', we need to check
// whether there should be a '\' before it or not
if (ch != '_')
{
buf[bufIndex++] = ch;
break;
}
if (readInVerbatim)
{
// There should NOT be a '\' before the '_'
if ((bufIndex > 0 && (buf[bufIndex-1] == '\\')) && (buf[0] != '%'))
{
wxString errBuf;
errBuf.Printf("An underscore ('_') was detected at line %lu inside file %s that should NOT have a '\\' before it.",LineNumbers[CurrentInputIndex], (const char*) currentFileName.c_str());
OnError((char *)errBuf.c_str());
}
}
else
{
// There should be a '\' before the '_'
if (bufIndex == 0)
{
wxString errBuf;
errBuf.Printf("An underscore ('_') was detected at line %lu inside file %s that may need a '\\' before it.",LineNumbers[CurrentInputIndex], (const char*) currentFileName.c_str());
OnError((char *)errBuf.c_str());
}
else if ((buf[bufIndex-1] != '\\') && (buf[0] != '%')) // If it is a comment line, then no warnings
{
wxString errBuf;
errBuf.Printf("An underscore ('_') was detected at line %lu inside file %s that may need a '\\' before it.",LineNumbers[CurrentInputIndex], (const char*) currentFileName.c_str());
OnError((char *)errBuf.c_str());
}
}
buf[bufIndex++] = ch;
break;
} // switch
} // else
}
@@ -563,16 +620,19 @@ bool read_a_line(char *buf)
if (CurrentInputIndex > 0)
ch = ' '; // No real end of file
CurrentInputIndex --;
#if CHECK_BRACES
if (leftCurly != rightCurly)
if (checkCurleyBraces)
{
wxString errBuf;
errBuf.Printf("Curly braces do not match inside file %s\n%lu opens, %lu closes", (const char*) currentFileName.c_str(),leftCurly,rightCurly);
OnError((char *)errBuf.c_str());
if (leftCurly != rightCurly)
{
wxString errBuf;
errBuf.Printf("Curly braces do not match inside file %s\n%lu opens, %lu closes", (const char*) currentFileName.c_str(),leftCurly,rightCurly);
OnError((char *)errBuf.c_str());
}
leftCurly = 0;
rightCurly = 0;
}
leftCurly = 0;
rightCurly = 0;
#endif
if (readingVerbatim)
{
readingVerbatim = FALSE;
@@ -730,6 +790,37 @@ bool read_a_line(char *buf)
bool succ = read_a_line(buf);
return succ;
}
if (checkSyntax)
{
wxString bufStr = buf;
int index = 0;
size_t pos = 0;
for (index=0; syntaxTokens[index] != wxEmptyString; index++)
{
pos = bufStr.find(syntaxTokens[index]);
if (pos != wxString::npos && pos != 0)
{
size_t commentStart = bufStr.find("%");
if (commentStart == wxString::npos || commentStart > pos)
{
wxString errBuf;
if (syntaxTokens[index] == "\\verb")
{
errBuf.Printf("'%s$....$' was detected at line %lu inside file %s. Please replace this form with \\tt{....}",
syntaxTokens[index], LineNumbers[CurrentInputIndex], (const char*) currentFileName.c_str());
}
else
{
errBuf.Printf("'%s' was detected at line %lu inside file %s that is not the only text on the line, starting at column one.",
syntaxTokens[index], LineNumbers[CurrentInputIndex], (const char*) currentFileName.c_str());
}
OnError((char *)errBuf.c_str());
}
}
}
} // checkSyntax
if (strncmp(buf, "\\begin{verbatim}", 16) == 0 ||
strncmp(buf, "\\begin{toocomplex}", 18) == 0)
readInVerbatim = TRUE;
@@ -737,14 +828,15 @@ bool read_a_line(char *buf)
strncmp(buf, "\\end{toocomplex}", 16) == 0)
readInVerbatim = FALSE;
#if CHECK_BRACES
if (ch == EOF && leftCurly != rightCurly)
if (checkCurleyBraces)
{
wxString errBuf;
errBuf.Printf("Curly braces do not match inside file %s\n%lu opens, %lu closes", (const char*) currentFileName.c_str(),leftCurly,rightCurly);
OnError((char *)errBuf.c_str());
if (ch == EOF && leftCurly != rightCurly)
{
wxString errBuf;
errBuf.Printf("Curly braces do not match inside file %s\n%lu opens, %lu closes", (const char*) currentFileName.c_str(),leftCurly,rightCurly);
OnError((char *)errBuf.c_str());
}
}
#endif
return (ch == EOF);
} // read_a_line
@@ -921,6 +1013,9 @@ int ParseArg(TexChunk *thisArg, wxList& children, char *buffer, int pos, char *e
pos = 0;
len = strlen(buffer);
// Check for verbatim (or toocomplex, which comes to the same thing)
wxString bufStr = buffer;
// if (bufStr.find("\\begin{verbatim}") != wxString::npos ||
// bufStr.find("\\begin{toocomplex}") != wxString::npos)
if (strncmp(buffer, "\\begin{verbatim}", 16) == 0 ||
strncmp(buffer, "\\begin{toocomplex}", 18) == 0)
{
@@ -1007,7 +1102,6 @@ int ParseArg(TexChunk *thisArg, wxList& children, char *buffer, int pos, char *e
}
pos ++;
// Try matching \end{environment}
if (environment && FindEndEnvironment(buffer, &pos, environment))
{
@@ -1139,8 +1233,8 @@ int ParseArg(TexChunk *thisArg, wxList& children, char *buffer, int pos, char *e
children.Append((wxObject *)chunk);
}
else
{
else
{
char *env = NULL;
bool tmpParseToBrace = TRUE;
TexMacroDef *def = MatchMacro(buffer, &pos, &env, &tmpParseToBrace);
@@ -1237,7 +1331,7 @@ int ParseArg(TexChunk *thisArg, wxList& children, char *buffer, int pos, char *e
}
// delete chunk; // Might delete children
}
}
}
else
{
@@ -1245,7 +1339,7 @@ int ParseArg(TexChunk *thisArg, wxList& children, char *buffer, int pos, char *e
}
}
else
{
{
/*
* If all else fails, we assume that we have
* a pair of braces on their own, so return a `dummy' macro
@@ -1278,7 +1372,7 @@ int ParseArg(TexChunk *thisArg, wxList& children, char *buffer, int pos, char *e
arg->macroId = chunk->macroId;
pos = ParseArg(arg, arg->children, buffer, pos, NULL, TRUE, customMacroArgs);
}
}
break;
}
case '$':