]> git.saurik.com Git - wxWidgets.git/blobdiff - utils/tex2rtf/src/tex2any.cpp
unified wxFRAME_EX_CONTEXTHELP and wxDIALOG_EX_CONTEXTHELP in a single wxWS_EX_CONTEX...
[wxWidgets.git] / utils / tex2rtf / src / tex2any.cpp
index b7e06231a7fbe651097ac2a969dd4d181948f787..33466d1a935858375195c9665614f1350ace020a 100644 (file)
@@ -2,7 +2,7 @@
 // Name:        tex2any.cpp
 // Purpose:     Utilities for Latex conversion.
 // Author:      Julian Smart
-// Modified by: Wlodzimiez ABX Skiba 2003/2004 Unicode support
+// Modified by: Wlodzimierz ABX Skiba 2003/2004 Unicode support
 //              Ron Lee
 // Created:     01/01/99
 // RCS-ID:      $Id$
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
-#pragma implementation
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
@@ -38,7 +34,7 @@ static inline wxChar* copystring(const wxChar* s)
  * Variables accessible from clients
  *
  */
+
 TexChunk *      DocumentTitle = NULL;
 TexChunk *      DocumentAuthor = NULL;
 TexChunk *      DocumentDate = NULL;
@@ -109,15 +105,15 @@ int             subsectionFont = 12; // largeFont1;
 int             titleFont = LARGEFont3;
 int             authorFont = LargeFont2;
 int             mirrorMargins = true;
-bool            winHelp = false;  // Output in Windows Help format if TRUE, linear otherwise
+bool            winHelp = false;  // Output in Windows Help format if true, linear otherwise
 bool            isInteractive = false;
 bool            runTwice = false;
 int             convertMode = TEX_RTF;
-bool            checkCurleyBraces = false;
+bool            checkCurlyBraces = false;
 bool            checkSyntax = false;
 bool            headerRule = false;
 bool            footerRule = false;
-bool            compatibilityMode = false; // If TRUE, maximum Latex compatibility
+bool            compatibilityMode = false; // If true, maximum Latex compatibility
                                 // (Quality of RTF generation deteriorate)
 bool            generateHPJ; // Generate WinHelp Help Project file
 wxChar         *winHelpTitle = NULL; // Windows Help title
@@ -151,7 +147,7 @@ wxChar         *followedLinkColourString = NULL;
 bool            combineSubSections = false;
 bool            htmlWorkshopFiles = false;
 bool            ignoreBadRefs = false;
-wxChar                 *htmlFaceName = NULL;
+wxChar         *htmlFaceName = NULL;
 
 extern int passNumber;
 
@@ -181,7 +177,7 @@ wxChar *UpNameString = copystring(_T("Up"));
  * Section numbering
  *
  */
+
 int             chapterNo = 0;
 int             sectionNo = 0;
 int             subsectionNo = 0;
@@ -193,7 +189,7 @@ int             tableNo = 0;
  * Other variables
  *
  */
+
 FILE *CurrentOutput1 = NULL;
 FILE *CurrentOutput2 = NULL;
 FILE *Inputs[15];
@@ -204,12 +200,12 @@ int CurrentInputIndex = 0;
 wxChar *TexFileRoot = NULL;
 wxChar *TexBibName = NULL;         // Bibliography output file name
 wxChar *TexTmpBibName = NULL;      // Temporary bibliography output file name
-bool isSync = false;             // If TRUE, should not yield to other processes.
-bool stopRunning = false;        // If TRUE, should abort.
+bool isSync = false;             // If true, should not yield to other processes.
+bool stopRunning = false;        // If true, should abort.
 
 static int currentColumn = 0;
 wxChar *currentArgData = NULL;
-bool haveArgData = false; // If TRUE, we're simulating the data.
+bool haveArgData = false; // If true, we're simulating the data.
 TexChunk *currentArgument = NULL;
 TexChunk *nextChunk = NULL;
 bool isArgOptional = false;
@@ -227,7 +223,7 @@ TexMacroDef *VerbatimMacroDef = NULL;
 
 
 TexRef::TexRef(const wxChar *label, const wxChar *file,
-              const wxChar *section, const wxChar *sectionN)
+               const wxChar *section, const wxChar *sectionN)
 {
     refLabel = copystring(label);
     refFile = file ? copystring(file) : (wxChar*) NULL;
@@ -302,84 +298,87 @@ void ForbidWarning(TexMacroDef *def)
       break;
   }
 }
+
 TexMacroDef *MatchMacro(wxChar *buffer, int *pos, wxChar **env, bool *parseToBrace)
 {
-  *parseToBrace = true;
-  int i = (*pos);
-  TexMacroDef *def = NULL;
-  wxChar macroBuf[40];
-
-  // First, try to find begin{thing}
-  if (wxStrncmp(buffer+i, _T("begin{"), 6) == 0)
-  {
-    i += 6;
+    *parseToBrace = true;
+    int i = (*pos);
+    TexMacroDef *def = NULL;
+    wxChar macroBuf[40];
 
-    int j = i;
-    while ((isalpha(buffer[j]) || buffer[j] == '*') && ((j - i) < 39))
+    // First, try to find begin{thing}
+    if (wxStrncmp(buffer+i, _T("begin{"), 6) == 0)
     {
-      macroBuf[j-i] = buffer[j];
-      j ++;
-    }
-    macroBuf[j-i] = 0;
-    def = (TexMacroDef *)MacroDefs.Get(macroBuf);
+        i += 6;
 
-    if (def)
-    {
-      *pos = j + 1;  // BUGBUG Should this be + 1???
-      *env = def->name;
-      ForbidWarning(def);
-      return def;
+        int j = i;
+        while ((isalpha(buffer[j]) || buffer[j] == '*') && ((j - i) < 39))
+        {
+              macroBuf[j-i] = buffer[j];
+              j ++;
+        }
+        macroBuf[j-i] = 0;
+        def = (TexMacroDef *)MacroDefs.Get(macroBuf);
+
+        if (def)
+        {
+            *pos = j + 1;  // BUGBUG Should this be + 1???
+            *env = def->name;
+            ForbidWarning(def);
+            return def;
+        }
+        else
+        {
+            return NULL;
+        }
     }
-    else return NULL;
-  }
 
-  // Failed, so try to find macro from definition list
-  int j = i;
+    // Failed, so try to find macro from definition list
+    int j = i;
 
-  // First try getting a one-character macro, but ONLY
-  // if these TWO characters are not both alphabetical (could
-  // be a longer macro)
-  if (!(isalpha(buffer[i]) && isalpha(buffer[i+1])))
-  {
-    macroBuf[0] = buffer[i];
-    macroBuf[1] = 0;
+    // First try getting a one-character macro, but ONLY
+    // if these TWO characters are not both alphabetical (could
+    // be a longer macro)
+    if (!(isalpha(buffer[i]) && isalpha(buffer[i+1])))
+    {
+        macroBuf[0] = buffer[i];
+        macroBuf[1] = 0;
 
-    def = (TexMacroDef *)MacroDefs.Get(macroBuf);
-    if (def) j ++;
-  }
+        def = (TexMacroDef *)MacroDefs.Get(macroBuf);
+        if (def) j ++;
+    }
 
-  if (!def)
-  {
-    while ((isalpha(buffer[j]) || buffer[j] == '*') && ((j - i) < 39))
+    if (!def)
     {
-      macroBuf[j-i] = buffer[j];
-      j ++;
+        while ((isalpha(buffer[j]) || buffer[j] == '*') && ((j - i) < 39))
+        {
+            macroBuf[j-i] = buffer[j];
+            j ++;
+        }
+        macroBuf[j-i] = 0;
+        def = (TexMacroDef *)MacroDefs.Get(macroBuf);
     }
-    macroBuf[j-i] = 0;
-    def = (TexMacroDef *)MacroDefs.Get(macroBuf);
-  }
-    
-  if (def)
-  {
-    i = j;
-    
-    // We want to check whether this is a space-consuming macro
-    // (e.g. {\bf word})
-    // No brace, e.g. \input thing.tex instead of \input{thing};
-    // or a numeric argument, such as \parindent0pt
-    if ((def->no_args > 0) && ((buffer[i] == 32) || (buffer[i] == '=') || (isdigit(buffer[i]))))
+
+    if (def)
     {
-      if ((buffer[i] == 32) || (buffer[i] == '='))
-        i ++;
+        i = j;
+
+        // We want to check whether this is a space-consuming macro
+        // (e.g. {\bf word})
+        // No brace, e.g. \input thing.tex instead of \input{thing};
+        // or a numeric argument, such as \parindent0pt
+        if ((def->no_args > 0) && ((buffer[i] == 32) || (buffer[i] == '=') || (isdigit(buffer[i]))))
+        {
+            if ((buffer[i] == 32) || (buffer[i] == '='))
+            i ++;
 
-      *parseToBrace = false;
+            *parseToBrace = false;
+        }
+        *pos = i;
+        ForbidWarning(def);
+        return def;
     }
-    *pos = i;
-    ForbidWarning(def);
-    return def;
-  }
-  return NULL;
+    return NULL;
 }
 
 void EatWhiteSpace(wxChar *buffer, int *pos)
@@ -428,9 +427,9 @@ bool readInVerbatim = false;  // Within a verbatim, but not nec. verbatiminput
 // detection of \verb yet.
 // #define CHECK_BRACES 1
 
-unsigned long leftCurley = 0;
-unsigned long rightCurley = 0;
-static wxString currentFileName = _T("");
+unsigned long leftCurly = 0;
+unsigned long rightCurly = 0;
+static wxString currentFileName = wxEmptyString;
 
 bool read_a_line(wxChar *buf)
 {
@@ -443,6 +442,7 @@ bool read_a_line(wxChar *buf)
   int ch = -2;
   unsigned long bufIndex = 0;
   buf[0] = 0;
+  int lastChar;
 
   while (ch != EOF && ch != 10)
   {
@@ -459,24 +459,25 @@ bool read_a_line(wxChar *buf)
          ((bufIndex == 16) && (wxStrncmp(buf, _T("\\end{toocomplex}"), 16) == 0)))
       readInVerbatim = false;
 
+    lastChar = ch;
     ch = getc(Inputs[CurrentInputIndex]);
 
-    if (checkCurleyBraces)
+    if (checkCurlyBraces)
     {
-        if (ch == '{' && !readInVerbatim)
-           leftCurley++;
-        if (ch == '}' && !readInVerbatim)
+        if (ch == '{' && !readInVerbatim && lastChar != _T('\\'))
+           leftCurly++;
+        if (ch == '}' && !readInVerbatim && lastChar != _T('\\'))
         {
-           rightCurley++;
-           if (rightCurley > leftCurley)
+           rightCurly++;
+           if (rightCurly > leftCurly)
            {
                wxString errBuf;
-               errBuf.Printf(_T("An extra right Curley brace ('}') was detected at line %lu inside file %s"), LineNumbers[CurrentInputIndex], (const wxChar*) currentFileName.c_str());
+               errBuf.Printf(_T("An extra right Curly brace ('}') was detected at line %lu inside file %s"), LineNumbers[CurrentInputIndex], (const wxChar*) currentFileName.c_str());
                OnError((wxChar *)errBuf.c_str());
 
-               // Reduce the count of right Curley braces, so the mismatched count
+               // Reduce the count of right Curly braces, so the mismatched count
                // isn't reported on every line that has a '}' after the first mismatch
-               rightCurley--;
+               rightCurly--;
            }
         }
     }
@@ -490,7 +491,7 @@ bool read_a_line(wxChar *buf)
         if ((ch1 == 10) || (ch1 == 13))
         {
           // Eliminate newline (10) following DOS linefeed
-          if (ch1 == 13) 
+          if (ch1 == 13)
             getc(Inputs[CurrentInputIndex]);
           buf[bufIndex] = 0;
           IncrementLineNumber();
@@ -520,7 +521,7 @@ bool read_a_line(wxChar *buf)
              return false;
           }
 
-          buf[bufIndex] = ch;
+          buf[bufIndex] = (wxChar)ch;
           bufIndex ++;
         }
       }
@@ -535,7 +536,7 @@ bool read_a_line(wxChar *buf)
         case 0xfc: // ü
         case 0xd6: // Ö
         case 0xc4: // Ä
-        case 0xdc: // Ü     
+        case 0xdc: // Ü
                 if (bufIndex+5 >= MAX_LINE_BUFFER_SIZE)
                 {
                    wxString errBuf;
@@ -554,11 +555,11 @@ bool read_a_line(wxChar *buf)
                     case 0xfc:buf[bufIndex++]='u';break; // ü
                     case 0xd6:buf[bufIndex++]='O';break; // Ö
                     case 0xc4:buf[bufIndex++]='A';break; // Ä
-                    case 0xdc:buf[bufIndex++]='U';break; // Ü                   
-                }               
+                    case 0xdc:buf[bufIndex++]='U';break; // Ü
+                }
                 buf[bufIndex++]='}';
                 break;
-        case 0xdf: // ß 
+        case 0xdf: // ß
             if (bufIndex+5 >= MAX_LINE_BUFFER_SIZE)
             {
               wxString errBuf;
@@ -572,7 +573,7 @@ bool read_a_line(wxChar *buf)
             buf[bufIndex++]='s';
             buf[bufIndex++]='\\';
             buf[bufIndex++]='/';
-            break;  
+            break;
         default:
             if (bufIndex >= MAX_LINE_BUFFER_SIZE)
             {
@@ -582,11 +583,11 @@ bool read_a_line(wxChar *buf)
               OnError((wxChar *)errBuf.c_str());
               return false;
             }
-            // If the current character read in is a '_', we need to check 
+            // 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;
+                buf[bufIndex++] = (wxChar)ch;
                 break;
             }
 
@@ -597,10 +598,10 @@ bool read_a_line(wxChar *buf)
                     // There should NOT be a '\' before the '_'
                     if ((bufIndex > 0 && (buf[bufIndex-1] == '\\')) && (buf[0] != '%'))
                     {
-                        wxString errBuf;
-                        errBuf.Printf(_T("An underscore ('_') was detected at line %lu inside file %s that should NOT have a '\\' before it."),
-                            LineNumbers[CurrentInputIndex], (const wxChar*) currentFileName.c_str());
-                        OnError((wxChar *)errBuf.c_str());
+//                        wxString errBuf;
+//                        errBuf.Printf(_T("An underscore ('_') was detected at line %lu inside file %s that should NOT have a '\\' before it."),
+//                            LineNumbers[CurrentInputIndex], (const wxChar*) currentFileName.c_str());
+//                        OnError((wxChar *)errBuf.c_str());
                     }
                 }
                 else
@@ -623,7 +624,7 @@ bool read_a_line(wxChar *buf)
                     }
                 }
             }
-            buf[bufIndex++] = ch;
+            buf[bufIndex++] = (wxChar)ch;
             break;
         }  // switch
       }  // else
@@ -633,21 +634,21 @@ bool read_a_line(wxChar *buf)
       buf[bufIndex] = 0;
       fclose(Inputs[CurrentInputIndex]);
       Inputs[CurrentInputIndex] = NULL;
-      if (CurrentInputIndex > 0) 
+      if (CurrentInputIndex > 0)
          ch = ' '; // No real end of file
       CurrentInputIndex --;
 
-      if (checkCurleyBraces)
+      if (checkCurlyBraces)
       {
-          if (leftCurley != rightCurley)
+          if (leftCurly != rightCurly)
           {
             wxString errBuf;
-            errBuf.Printf(_T("Curley braces do not match inside file %s\n%lu opens, %lu closes"),
-                          (const wxChar*) currentFileName.c_str(),leftCurley,rightCurley);
+            errBuf.Printf(_T("Curly braces do not match inside file %s\n%lu opens, %lu closes"),
+                          (const wxChar*) currentFileName.c_str(),leftCurly,rightCurly);
             OnError((wxChar *)errBuf.c_str());
           }
-          leftCurley = 0;
-          rightCurley = 0;
+          leftCurly = 0;
+          rightCurly = 0;
       }
 
       if (readingVerbatim)
@@ -685,13 +686,13 @@ bool read_a_line(wxChar *buf)
       j -= 5;
       buf[j] = 0;
     }
-    
+
     if (buf[j-1] == '}')
         buf[j-1] = 0; // Ignore final brace
 
     wxString actualFile = TexPathList.FindValidPath(fileName);
     currentFileName = actualFile;
-    if (actualFile == _T(""))
+    if (actualFile.empty())
     {
       wxString errBuf;
       errBuf.Printf(_T("Could not find file: %s"),fileName);
@@ -751,7 +752,7 @@ bool read_a_line(wxChar *buf)
       buf[j] = 0;
     }
 
-    if (buf[j-1] == _T('}')) 
+    if (buf[j-1] == _T('}'))
         buf[j-1] = 0; // Ignore final brace
 
     // Remove backslashes from name
@@ -765,7 +766,7 @@ bool read_a_line(wxChar *buf)
       return read_a_line(buf);
 
     wxString actualFile = TexPathList.FindValidPath(fileNameStr);
-    if (actualFile == _T(""))
+    if (actualFile.empty())
     {
       wxChar buf2[400];
       wxSnprintf(buf2, sizeof(buf2), _T("%s.tex"), fileNameStr.c_str());
@@ -773,7 +774,7 @@ bool read_a_line(wxChar *buf)
     }
     currentFileName = actualFile;
 
-    if (actualFile == _T(""))
+    if (actualFile.empty())
     {
       wxString errBuf;
       errBuf.Printf(_T("Could not find file: %s"),fileName);
@@ -811,7 +812,7 @@ bool read_a_line(wxChar *buf)
   if (checkSyntax)
   {
       wxString bufStr = buf;
-      for (int index=0; syntaxTokens[index] != wxEmptyString; index++)
+      for (int index=0; !syntaxTokens[index].empty(); index++)
       {
           size_t pos = bufStr.find(syntaxTokens[index]);
           if (pos != wxString::npos && pos != 0)
@@ -847,13 +848,13 @@ bool read_a_line(wxChar *buf)
            wxStrncmp(buf, _T("\\end{toocomplex}"), 16) == 0)
     readInVerbatim = false;
 
-  if (checkCurleyBraces)
+  if (checkCurlyBraces)
   {
-      if (ch == EOF && leftCurley != rightCurley)
+      if (ch == EOF && leftCurly != rightCurly)
       {
         wxString errBuf;
-        errBuf.Printf(_T("Curley braces do not match inside file %s\n%lu opens, %lu closes"),
-            (const wxChar*) currentFileName.c_str(),leftCurley,rightCurley);
+        errBuf.Printf(_T("Curly braces do not match inside file %s\n%lu opens, %lu closes"),
+            (const wxChar*) currentFileName.c_str(),leftCurly,rightCurly);
         OnError((wxChar *)errBuf.c_str());
       }
   }
@@ -899,7 +900,7 @@ bool ParseNewCommand(wxChar *buffer, int *pos)
     int braceCount = 0;
     while (!end)
     {
-      char ch = buffer[*pos];
+      wxChar ch = buffer[*pos];
       if (ch == _T('{'))
         braceCount ++;
       else if (ch == _T('}'))
@@ -940,7 +941,7 @@ void MacroError(wxChar *buffer)
   wxChar macroBuf[200];
   macroBuf[0] = '\\';
   int i = 1;
-  char ch;
+  wxChar ch;
   while (((ch = buffer[i-1]) != '\n') && (ch != 0))
   {
     macroBuf[i] = ch;
@@ -965,7 +966,7 @@ void MacroError(wxChar *buffer)
  * Parse an argument.
  * 'environment' specifies the name of the macro IFF if we're looking for the end
  * of an environment, e.g. \end{itemize}. Otherwise it's NULL.
- * 'parseToBrace' is TRUE if the argument should extend to the next right brace,
+ * 'parseToBrace' is true if the argument should extend to the next right brace,
  * e.g. in {\bf an argument} as opposed to \vskip 30pt
  *
  */
@@ -973,7 +974,7 @@ int ParseArg(TexChunk *thisArg, wxList& children, wxChar *buffer, int pos, wxCha
 {
   Tex2RTFYield();
   if (stopRunning) return pos;
-  
+
   bool eof = false;
   BigBuffer[0] = 0;
   int buf_ptr = 0;
@@ -1003,7 +1004,7 @@ int ParseArg(TexChunk *thisArg, wxList& children, wxChar *buffer, int pos, wxCha
     }
   }
 */
-    
+
   // If not parsing to brace, just read the next word
   // (e.g. \vskip 20pt)
   if (!parseToBrace)
@@ -1012,7 +1013,7 @@ int ParseArg(TexChunk *thisArg, wxList& children, wxChar *buffer, int pos, wxCha
     while (!eof && ch != 13 && ch != 32 && ch != 10 &&
            ch != 0 && ch != '{')
     {
-      BigBuffer[buf_ptr] = ch;
+      BigBuffer[buf_ptr] = (wxChar)ch;
       buf_ptr ++;
       pos ++;
       ch = buffer[pos];
@@ -1091,15 +1092,15 @@ int ParseArg(TexChunk *thisArg, wxList& children, wxChar *buffer, int pos, wxCha
       }
     }
 
-    char ch = buffer[pos];
+    wxChar wxCh = buffer[pos];
     // End of optional argument -- pretend it's right brace for simplicity
-    if (thisArg->optional && (ch == ']'))
-      ch = '}';
+    if (thisArg->optional && (wxCh == _T(']')))
+      wxCh = _T('}');
 
-    switch (ch)
+    switch (wxCh)
     {
       case 0:
-      case '}':  // End of argument
+      case _T('}'):  // End of argument
       {
         if (buf_ptr > 0)
         {
@@ -1108,10 +1109,10 @@ int ParseArg(TexChunk *thisArg, wxList& children, wxChar *buffer, int pos, wxCha
           chunk->value = copystring(BigBuffer);
           children.Append((wxObject *)chunk);
         }
-        if (ch == '}') pos ++;
+        if (wxCh == _T('}')) pos ++;
         return pos;
       }
-      case '\\':
+      case _T('\\'):
       {
         if (buf_ptr > 0)  // Finish off the string we've read so far
         {
@@ -1122,7 +1123,7 @@ int ParseArg(TexChunk *thisArg, wxList& children, wxChar *buffer, int pos, wxCha
           children.Append((wxObject *)chunk);
         }
         pos ++;
-        
+
         // Try matching \end{environment}
         if (environment && FindEndEnvironment(buffer, &pos, environment))
         {
@@ -1152,8 +1153,8 @@ int ParseArg(TexChunk *thisArg, wxList& children, wxChar *buffer, int pos, wxCha
           bool end = false;
           while (!end)
           {
-            int ch = buffer[pos];
-            if (ch == '}')
+            wxChar ch = buffer[pos];
+            if (ch == _T('}'))
             {
               noBraces --;
               if (noBraces == 0)
@@ -1163,26 +1164,26 @@ int ParseArg(TexChunk *thisArg, wxList& children, wxChar *buffer, int pos, wxCha
               }
               else
               {
-                wxTex2RTFBuffer[i] = '}';
+                wxTex2RTFBuffer[i] = _T('}');
                 i ++;
               }
               pos ++;
             }
-            else if (ch == '{')
+            else if (ch == _T('{'))
             {
-              wxTex2RTFBuffer[i] = '{';
+              wxTex2RTFBuffer[i] = _T('{');
               i ++;
               pos ++;
             }
-            else if (ch == '\\' && buffer[pos+1] == '}')
+            else if (ch == _T('\\') && buffer[pos+1] == _T('}'))
             {
-              wxTex2RTFBuffer[i] = '}';
+              wxTex2RTFBuffer[i] = _T('}');
               pos += 2;
               i++;
             }
-            else if (ch == '\\' && buffer[pos+1] == '{')
+            else if (ch == _T('\\') && buffer[pos+1] == _T('{'))
             {
-              wxTex2RTFBuffer[i] = '{';
+              wxTex2RTFBuffer[i] = _T('{');
               pos += 2;
               i++;
             }
@@ -1216,11 +1217,11 @@ int ParseArg(TexChunk *thisArg, wxList& children, wxChar *buffer, int pos, wxCha
         else if (wxStrncmp(buffer+pos, _T("verb"), 4) == 0)
         {
           pos += 4;
-          if (buffer[pos] == '*')
+          if (buffer[pos] == _T('*'))
             pos ++;
 
-          // Find the delimiter character         
-          int ch = buffer[pos];
+          // Find the delimiter character
+          wxChar ch = buffer[pos];
           pos ++;
           // Now at start of verbatim text
           int j = pos;
@@ -1254,8 +1255,8 @@ int ParseArg(TexChunk *thisArg, wxList& children, wxChar *buffer, int pos, wxCha
 
           children.Append((wxObject *)chunk);
         }
-    else
-    {
+        else
+        {
           wxChar *env = NULL;
           bool tmpParseToBrace = true;
           TexMacroDef *def = MatchMacro(buffer, &pos, &env, &tmpParseToBrace);
@@ -1273,16 +1274,20 @@ int ParseArg(TexChunk *thisArg, wxList& children, wxChar *buffer, int pos, wxCha
             children.Append((wxObject *)chunk);
 
           // Eliminate newline after a \begin{} or a \\ if possible
-          if (env || wxStrcmp(def->name, _T("\\")) == 0)
-            if (buffer[pos] == 13)
-            {
+          if ((env || wxStrcmp(def->name, _T("\\")) == 0) && (buffer[pos] == 13))
+          {
               pos ++;
               if (buffer[pos] == 10)
                 pos ++;
-            }
+          }
 
-          pos = ParseMacroBody(def->name, chunk, chunk->no_args,
-                     buffer, pos, env, tmpParseToBrace, customMacroArgs);
+          pos = ParseMacroBody(def->name,
+                               chunk, chunk->no_args,
+                               buffer,
+                               pos,
+                               env,
+                               tmpParseToBrace,
+                               customMacroArgs);
 
           // If custom macro, parse the body substituting the above found args.
           if (customMacro)
@@ -1295,7 +1300,7 @@ int ParseArg(TexChunk *thisArg, wxList& children, wxChar *buffer, int pos, wxCha
               wxStrcat(macroBuf, _T("}"));
               ParseArg(thisArg, children, macroBuf, 0, NULL, true, chunk);
             }
-            
+
 //            delete chunk; // Might delete children
           }
         }
@@ -1308,10 +1313,10 @@ int ParseArg(TexChunk *thisArg, wxList& children, wxChar *buffer, int pos, wxCha
       }
       // Parse constructs like {\bf thing} as if they were
       // \bf{thing}
-      case '{':
+      case _T('{'):
       {
         pos ++;
-        if (buffer[pos] == '\\')
+        if (buffer[pos] == _T('\\'))
         {
           if (buf_ptr > 0)
           {
@@ -1351,7 +1356,7 @@ int ParseArg(TexChunk *thisArg, wxList& children, wxChar *buffer, int pos, wxCha
                 wxStrcat(macroBuf, _T("}"));
                 ParseArg(thisArg, children, macroBuf, 0, NULL, true, chunk);
               }
-            
+
 //            delete chunk; // Might delete children
         }
           }
@@ -1361,7 +1366,7 @@ int ParseArg(TexChunk *thisArg, wxList& children, wxChar *buffer, int pos, wxCha
           }
         }
         else
-    {
+        {
          /*
           * If all else fails, we assume that we have
           * a pair of braces on their own, so return a `dummy' macro
@@ -1394,10 +1399,10 @@ int ParseArg(TexChunk *thisArg, wxList& children, wxChar *buffer, int pos, wxCha
           arg->macroId = chunk->macroId;
 
           pos = ParseArg(arg, arg->children, buffer, pos, NULL, true, customMacroArgs);
-    }
+        }
         break;
       }
-      case '$':
+      case _T('$'):
       {
         if (buf_ptr > 0)
         {
@@ -1410,7 +1415,7 @@ int ParseArg(TexChunk *thisArg, wxList& children, wxChar *buffer, int pos, wxCha
 
         pos ++;
 
-        if (buffer[pos] == '$')
+        if (buffer[pos] == _T('$'))
         {
           TexChunk *chunk = new TexChunk(CHUNK_TYPE_MACRO);
           chunk->no_args = 0;
@@ -1429,7 +1434,7 @@ int ParseArg(TexChunk *thisArg, wxList& children, wxChar *buffer, int pos, wxCha
         }
         break;
       }
-      case '~':
+      case _T('~'):
       {
         if (buf_ptr > 0)
         {
@@ -1448,7 +1453,7 @@ int ParseArg(TexChunk *thisArg, wxList& children, wxChar *buffer, int pos, wxCha
         children.Append((wxObject *)chunk);
         break;
       }
-      case '#': // Either treat as a special TeX character or as a macro arg
+      case _T('#'): // Either treat as a special TeX character or as a macro arg
       {
         if (buf_ptr > 0)
         {
@@ -1484,12 +1489,12 @@ int ParseArg(TexChunk *thisArg, wxList& children, wxChar *buffer, int pos, wxCha
         }
         break;
       }
-      case '&':
+      case _T('&'):
       {
         // Remove white space before and after the ampersand,
         // since this is probably a table column separator with
         // some convenient -- but useless -- white space in the text.
-        while ((buf_ptr > 0) && ((BigBuffer[buf_ptr-1] == ' ') || (BigBuffer[buf_ptr-1] == 9)))
+        while ((buf_ptr > 0) && ((BigBuffer[buf_ptr-1] == _T(' ')) || (BigBuffer[buf_ptr-1] == 9)))
           buf_ptr --;
 
         if (buf_ptr > 0)
@@ -1503,7 +1508,7 @@ int ParseArg(TexChunk *thisArg, wxList& children, wxChar *buffer, int pos, wxCha
 
         pos ++;
 
-        while (buffer[pos] == ' ' || buffer[pos] == 9)
+        while (buffer[pos] == _T(' ') || buffer[pos] == 9)
           pos ++;
 
         TexChunk *chunk = new TexChunk(CHUNK_TYPE_MACRO);
@@ -1514,13 +1519,13 @@ int ParseArg(TexChunk *thisArg, wxList& children, wxChar *buffer, int pos, wxCha
         break;
       }
       // Eliminate end-of-line comment
-      case '%':
+      case _T('%'):
       {
-        ch = buffer[pos];
-        while (ch != 10 && ch != 13 && ch != 0)
+        wxCh = buffer[pos];
+        while (wxCh != 10 && wxCh != 13 && wxCh != 0)
         {
           pos ++;
-          ch = buffer[pos];
+          wxCh = buffer[pos];
         }
         if (buffer[pos] == 10 || buffer[pos] == 13)
         {
@@ -1532,7 +1537,7 @@ int ParseArg(TexChunk *thisArg, wxList& children, wxChar *buffer, int pos, wxCha
       // Eliminate tab
       case 9:
       {
-        BigBuffer[buf_ptr] = ' ';
+        BigBuffer[buf_ptr] = _T(' ');
         BigBuffer[buf_ptr+1] = 0;
         buf_ptr ++;
         pos ++;
@@ -1540,7 +1545,7 @@ int ParseArg(TexChunk *thisArg, wxList& children, wxChar *buffer, int pos, wxCha
       }
       default:
       {
-        BigBuffer[buf_ptr] = ch;
+        BigBuffer[buf_ptr] = wxCh;
         BigBuffer[buf_ptr+1] = 0;
         buf_ptr ++;
         pos ++;
@@ -1555,7 +1560,7 @@ int ParseArg(TexChunk *thisArg, wxList& children, wxChar *buffer, int pos, wxCha
  * Consume as many arguments as the macro definition specifies
  *
  */
+
 int ParseMacroBody(const wxChar *WXUNUSED(macro_name), TexChunk *parent,
                    int no_args, wxChar *buffer, int pos,
                    wxChar *environment, bool parseToBrace,
@@ -1661,34 +1666,34 @@ int ParseMacroBody(const wxChar *WXUNUSED(macro_name), TexChunk *parent,
   return pos;
 }
 
-bool TexLoadFile(wxChar *filename)
+bool TexLoadFile(const wxString& filename)
 {
-  static wxChar *line_buffer;
-  stopRunning = false;
-  wxStrcpy(TexFileRoot, filename);
-  StripExtension(TexFileRoot);
-  wxSnprintf(TexBibName, 300, _T("%s.bb"), TexFileRoot);
-  wxSnprintf(TexTmpBibName, 300, _T("%s.bb1"), TexFileRoot);
-
-  TexPathList.EnsureFileAccessible(filename);
-
-  if (line_buffer) 
-      delete line_buffer;
-
-  line_buffer = new wxChar[MAX_LINE_BUFFER_SIZE];
-  
-  Inputs[0] = wxFopen(filename, _T("r"));
-  LineNumbers[0] = 1;
-  FileNames[0] = copystring(filename);
-  if (Inputs[0])
-  {
-    read_a_line(line_buffer);
-    ParseMacroBody(_T("toplevel"), TopLevel, 1, line_buffer, 0, NULL, true);
-    if (Inputs[0]) fclose(Inputs[0]);
-    return true;
-  }
+    static wxChar *line_buffer;
+    stopRunning = false;
+    wxStrcpy(TexFileRoot, filename);
+    StripExtension(TexFileRoot);
+    wxSnprintf(TexBibName, 300, _T("%s.bb"), TexFileRoot);
+    wxSnprintf(TexTmpBibName, 300, _T("%s.bb1"), TexFileRoot);
+
+    TexPathList.EnsureFileAccessible(filename);
 
-  return false;
+    if (line_buffer)
+        delete line_buffer;
+
+    line_buffer = new wxChar[MAX_LINE_BUFFER_SIZE];
+
+    Inputs[0] = wxFopen(filename, _T("r"));
+    LineNumbers[0] = 1;
+    FileNames[0] = copystring(filename);
+    if (Inputs[0])
+    {
+        read_a_line(line_buffer);
+        ParseMacroBody(_T("toplevel"), TopLevel, 1, line_buffer, 0, NULL, true);
+        if (Inputs[0]) fclose(Inputs[0]);
+        return true;
+    }
+
+    return false;
 }
 
 TexMacroDef::TexMacroDef(int the_id, const wxChar *the_name, int n, bool ig, bool forbidLevel)
@@ -1723,7 +1728,7 @@ TexChunk::TexChunk(TexChunk& toCopy)
   no_args = toCopy.no_args;
   argn = toCopy.argn;
   macroId = toCopy.macroId;
-  
+
 //  if (toCopy.name)
 //    name = copystring(toCopy.name);
 //  else
@@ -1734,7 +1739,7 @@ TexChunk::TexChunk(TexChunk& toCopy)
     value = copystring(toCopy.value);
   else
     value = NULL;
-  
+
   optional = toCopy.optional;
   wxNode *node = toCopy.children.GetFirst();
   while (node)
@@ -1774,7 +1779,7 @@ int GetNoArgs(void) // Number of args for this macro
  * only!)
  *
  */
+
 void GetArgData1(TexChunk *chunk)
 {
   switch (chunk->type)
@@ -2056,22 +2061,22 @@ void TexCleanUp(void)
   }
 /**/
   TexReferences.BeginFind();
-  wxNode *node = TexReferences.Next();
-  while (node)
+  wxHashTable::Node *refNode = TexReferences.Next();
+  while (refNode)
   {
-    TexRef *ref = (TexRef *)node->GetData();
+    TexRef *ref = (TexRef *)refNode->GetData();
     delete ref;
-    node = TexReferences.Next();
+    refNode = TexReferences.Next();
   }
   TexReferences.Clear();
-  
-  node = BibList.GetFirst();
-  while (node)
+
+  wxNode* bibNode = BibList.GetFirst();
+  while (bibNode)
   {
-    BibEntry *entry = (BibEntry *)node->GetData();
+    BibEntry *entry = (BibEntry *)bibNode->GetData();
     delete entry;
-    delete node;
-    node = BibList.GetFirst();
+    delete bibNode;
+    bibNode = BibList.GetFirst();
   }
   CitationList.Clear();
   ResetTopicCounter();
@@ -2504,7 +2509,7 @@ void DefineDefaultMacros(void)
   AddMacroDef(ltUPSHAPE,             _T("upshape"), 1);
   AddMacroDef(ltURLREF,              _T("urlref"), 2);
   AddMacroDef(ltUSEPACKAGE,          _T("usepackage"), 1);
-  
+
   AddMacroDef(ltVAREPSILON,          _T("varepsilon"), 0);
   AddMacroDef(ltVARPHI,              _T("varphi"), 0);
   AddMacroDef(ltVARPI,               _T("varpi"), 0);
@@ -2568,7 +2573,7 @@ void DefineDefaultMacros(void)
  * Default behaviour, should be called by client if can't match locally.
  *
  */
+
 // Called on start/end of macro examination
 void DefaultOnMacro(int macroId, int no_args, bool start)
 {
@@ -2618,11 +2623,21 @@ void DefaultOnMacro(int macroId, int no_args, bool start)
 
     case ltCINSERT:
       if (start)
-        TexOutput(_T("<<"), true);
+      {
+        if (convertMode == TEX_HTML)
+            TexOutput(_T("&lt;&lt;"));
+        else
+            TexOutput(_T("<<"), true);
+      }
       break;
     case ltCEXTRACT:
       if (start)
-        TexOutput(_T(">>"), true);
+      {
+        if (convertMode == TEX_HTML)
+            TexOutput(_T("&gt;&gt;"));
+        else
+            TexOutput(_T(">>"), true);
+      }
       break;
     case ltDESTRUCT:
       if (start)
@@ -2689,7 +2704,7 @@ void DefaultOnMacro(int macroId, int no_args, bool start)
         TexOutput(_T("(r)"), true);
       break;
     case ltBACKSLASH:
-      if (start)    
+      if (start)
         TexOutput(_T("\\"), true);
       break;
     case ltLDOTS:
@@ -2711,7 +2726,8 @@ void DefaultOnMacro(int macroId, int no_args, bool start)
       break;
     case ltPOUNDS:
       if (start)
-        TexOutput(_T("£"), true);
+        // FIXME: this is valid only if the output is iso-8859-1
+        TexOutput(wxString::FromAscii("£"), true);
       break;
     case ltSPECIALDOUBLEDOLLAR:  // Interpret as center
       OnMacro(ltCENTER, no_args, start);
@@ -2856,10 +2872,22 @@ void DefaultOnMacro(int macroId, int no_args, bool start)
     // Binary operation symbols
     case ltLE:
     case ltLEQ:
-      if (start) TexOutput(_T("<="));
+      if (start)
+      {
+        if (convertMode == TEX_HTML)
+            TexOutput(_T("&lt;="));
+        else
+            TexOutput(_T("<="));
+      }
       break;
     case ltLL:
-      if (start) TexOutput(_T("<<"));
+      if (start)
+      {
+        if (convertMode == TEX_HTML)
+            TexOutput(_T("&lt;&lt;"));
+        else
+            TexOutput(_T("<<"));
+      }
       break;
     case ltSUBSET:
       if (start) TexOutput(_T("SUBSET"));
@@ -2878,10 +2906,24 @@ void DefaultOnMacro(int macroId, int no_args, bool start)
       break;
     case ltGE:
     case ltGEQ:
-      if (start) TexOutput(_T(">="));
+    {
+      if (start)
+      {
+        if (convertMode == TEX_HTML)
+            TexOutput(_T("&gt;="));
+        else
+            TexOutput(_T(">="));
+      }
       break;
+    }
     case ltGG:
-      if (start) TexOutput(_T(">>"));
+      if (start)
+      {
+        if (convertMode == TEX_HTML)
+            TexOutput(_T("&gt;&gt;"));
+        else
+            TexOutput(_T(">>"));
+      }
       break;
     case ltSUPSET:
       if (start) TexOutput(_T("SUPSET"));
@@ -2963,22 +3005,58 @@ void DefaultOnMacro(int macroId, int no_args, bool start)
 
     // Arrows
     case ltLEFTARROW:
-      if (start) TexOutput(_T("<--"));
+      if (start)
+      {
+        if (convertMode == TEX_HTML)
+            TexOutput(_T("&lt;--"));
+        else
+            TexOutput(_T("<--"));
+      }
       break;
     case ltLEFTARROW2:
-      if (start) TexOutput(_T("<=="));
+      if (start)
+      {
+        if (convertMode == TEX_HTML)
+            TexOutput(_T("&lt;=="));
+        else
+            TexOutput(_T("<=="));
+      }
       break;
     case ltRIGHTARROW:
-      if (start) TexOutput(_T("-->"));
+      if (start)
+      {
+        if (convertMode == TEX_HTML)
+            TexOutput(_T("--&gt;"));
+        else
+            TexOutput(_T("-->"));
+      }
       break;
     case ltRIGHTARROW2:
-      if (start) TexOutput(_T("==>"));
+      if (start)
+      {
+        if (convertMode == TEX_HTML)
+            TexOutput(_T("==&gt;"));
+        else
+            TexOutput(_T("==>"));
+      }
       break;
     case ltLEFTRIGHTARROW:
-      if (start) TexOutput(_T("<-->"));
+      if (start)
+      {
+        if (convertMode == TEX_HTML)
+            TexOutput(_T("&lt;--&gt;"));
+        else
+            TexOutput(_T("<-->"));
+      }
       break;
     case ltLEFTRIGHTARROW2:
-      if (start) TexOutput(_T("<==>"));
+      if (start)
+      {
+        if (convertMode == TEX_HTML)
+            TexOutput(_T("&lt;==&gt;"));
+        else
+            TexOutput(_T("<==>"));
+      }
       break;
     case ltUPARROW:
       if (start) TexOutput(_T("UPARROW"));
@@ -3172,7 +3250,7 @@ bool DefaultOnArgument(int macroId, int arg_no, bool start)
         else
         {
            wxString informBuf;
-           informBuf.Printf(_T("Warning: unresolved reference '%s'"), refName); 
+           informBuf.Printf(_T("Warning: unresolved reference '%s'"), refName);
            OnInform((wxChar *)informBuf.c_str());
         }
       }
@@ -3220,7 +3298,7 @@ bool DefaultOnArgument(int macroId, int arg_no, bool start)
         DocumentStyle = LATEX_LETTER;
       else if (wxStrncmp(DocumentStyleString, _T("slides"), 6) == 0)
         DocumentStyle = LATEX_SLIDES;
-        
+
       if (StringMatch(_T("10"), DocumentStyleString))
         SetFontSizes(10);
       else if (StringMatch(_T("11"), DocumentStyleString))
@@ -3434,12 +3512,12 @@ bool DefaultOnArgument(int macroId, int arg_no, bool start)
       if (fd)
       {
         ch = getc(fd);
-        smallBuf[0] = ch;
+        smallBuf[0] = (wxChar)ch;
         while (ch != EOF)
         {
           TexOutput(smallBuf);
           ch = getc(fd);
-          smallBuf[0] = ch;
+          smallBuf[0] = (wxChar)ch;
         }
         fclose(fd);
       }
@@ -3457,12 +3535,12 @@ bool DefaultOnArgument(int macroId, int arg_no, bool start)
         wxChar fileBuf[300];
         wxStrcpy(fileBuf, bibFile);
         wxString actualFile = TexPathList.FindValidPath(fileBuf);
-        if (actualFile == _T(""))
+        if (actualFile.empty())
         {
           wxStrcat(fileBuf, _T(".bib"));
           actualFile = TexPathList.FindValidPath(fileBuf);
         }
-        if (actualFile != _T(""))
+        if (!actualFile.empty())
         {
           if (!ReadBib((wxChar*) (const wxChar*) actualFile))
           {
@@ -3513,7 +3591,7 @@ bool DefaultOnArgument(int macroId, int arg_no, bool start)
         wxChar *s1 = copystring(s);
         int i;
         for (i = 0; i < (int)wxStrlen(s); i++)
-          s1[i] = wxToupper(s[i]);
+          s1[i] = (wxChar)wxToupper(s[i]);
         TexOutput(s1);
         delete[] s1;
         return false;
@@ -3533,7 +3611,7 @@ bool DefaultOnArgument(int macroId, int arg_no, bool start)
         wxChar *s1 = copystring(s);
         int i;
         for (i = 0; i < (int)wxStrlen(s); i++)
-          s1[i] = wxTolower(s[i]);
+          s1[i] = (wxChar)wxTolower(s[i]);
         TexOutput(s1);
         delete[] s1;
         return false;
@@ -3553,7 +3631,7 @@ bool DefaultOnArgument(int macroId, int arg_no, bool start)
         wxChar *s1 = copystring(s);
         int i;
         for (i = 0; i < (int)wxStrlen(s); i++)
-          s1[i] = wxToupper(s[i]);
+          s1[i] = (wxChar)wxToupper(s[i]);
         TexOutput(s1);
         delete[] s1;
         return false;
@@ -3711,4 +3789,3 @@ bool DefaultOnArgument(int macroId, int arg_no, bool start)
   }
   return true;
 }
-