OSDN Git Service

RFE: [ 897975 ] Syntax highlighting for INI files - patch submitted by Tim Gerundt
authorKimmo Varis <kimmov@gmail.com>
Thu, 19 Feb 2004 22:45:53 +0000 (22:45 +0000)
committerKimmo Varis <kimmov@gmail.com>
Thu, 19 Feb 2004 22:45:53 +0000 (22:45 +0000)
Src/Merge.dsp
Src/editlib/ccrystaltextview.cpp
Src/editlib/ccrystaltextview.h
Src/editlib/ini.cpp [new file with mode: 0644]
Src/readme.txt

index 2517ee2..47c55aa 100644 (file)
@@ -2058,6 +2058,10 @@ SOURCE=.\editlib\html.cpp
 # End Source File
 # Begin Source File
 
+SOURCE=.\editlib\ini.cpp
+# End Source File
+# Begin Source File
+
 SOURCE=.\editlib\is.cpp
 # End Source File
 # Begin Source File
index e9cc483..3dfb547 100644 (file)
@@ -252,6 +252,7 @@ CCrystalTextView::TextDefinition CCrystalTextView::m_SourceDefs[] =
     CCrystalTextView::SRC_DCL, _T ("DCL"), _T ("dcl,dcc"), CCrystalTextView::ParseLineDcl, SRCOPT_AUTOINDENT|SRCOPT_BRACEGNU, 2, _T ("/*"), _T ("*/"), _T ("//"), (DWORD)-1,
     CCrystalTextView::SRC_FORTRAN, _T ("Fortran"), _T ("f,f90,f9p,fpp,for,f77"), CCrystalTextView::ParseLineFortran, SRCOPT_INSERTTABS|SRCOPT_AUTOINDENT, 8, _T (""), _T (""), _T ("!"), (DWORD)-1,
     CCrystalTextView::SRC_HTML, _T ("HTML"), _T ("html,htm,shtml,ihtml,ssi,phtml,stm,stml"), CCrystalTextView::ParseLineHtml, SRCOPT_AUTOINDENT|SRCOPT_BRACEANSI, 2, _T ("<!--"), _T ("-->"), _T (""), (DWORD)-1,
+    CCrystalTextView::SRC_INI, _T ("INI"), _T ("ini,reg"), CCrystalTextView::ParseLineIni, SRCOPT_AUTOINDENT|SRCOPT_BRACEGNU|SRCOPT_EOLNUNIX, 2, _T (""), _T (""), _T (";"), (DWORD)-1,
     CCrystalTextView::SRC_INSTALLSHIELD, _T ("InstallShield"), _T ("rul"), CCrystalTextView::ParseLineIS, SRCOPT_AUTOINDENT|SRCOPT_BRACEANSI, 2, _T ("/*"), _T ("*/"), _T ("//"), (DWORD)-1,
     CCrystalTextView::SRC_JAVA, _T ("Java"), _T ("java,jav,js"), CCrystalTextView::ParseLineJava, SRCOPT_AUTOINDENT|SRCOPT_BRACEGNU, 2, _T ("/*"), _T ("*/"), _T ("//"), (DWORD)-1,
     CCrystalTextView::SRC_LISP, _T ("AutoLISP"), _T ("lsp"), CCrystalTextView::ParseLineLisp, SRCOPT_AUTOINDENT|SRCOPT_BRACEANSI, 2, _T (";|"), _T ("|;"), _T (";"), (DWORD)-1,
index 43aa955..d618d76 100644 (file)
@@ -596,6 +596,7 @@ public :
     DWORD ParseLineDcl (DWORD dwCookie, int nLineIndex, TEXTBLOCK * pBuf, int &nActualItems);
     DWORD ParseLineFortran (DWORD dwCookie, int nLineIndex, TEXTBLOCK * pBuf, int &nActualItems);
     DWORD ParseLineHtml (DWORD dwCookie, int nLineIndex, TEXTBLOCK * pBuf, int &nActualItems);
+    DWORD ParseLineIni (DWORD dwCookie, int nLineIndex, TEXTBLOCK * pBuf, int &nActualItems);
     DWORD ParseLineIS (DWORD dwCookie, int nLineIndex, TEXTBLOCK * pBuf, int &nActualItems);
     DWORD ParseLineJava (DWORD dwCookie, int nLineIndex, TEXTBLOCK * pBuf, int &nActualItems);
     DWORD ParseLineLisp (DWORD dwCookie, int nLineIndex, TEXTBLOCK * pBuf, int &nActualItems);
@@ -666,6 +667,7 @@ public :
       SRC_DCL,
       SRC_FORTRAN,
       SRC_HTML,
+      SRC_INI,
       SRC_INSTALLSHIELD,
       SRC_JAVA,
       SRC_LISP,
diff --git a/Src/editlib/ini.cpp b/Src/editlib/ini.cpp
new file mode 100644 (file)
index 0000000..2f0a89f
--- /dev/null
@@ -0,0 +1,287 @@
+///////////////////////////////////////////////////////////////////////////
+//  File:    ini.cpp
+//  Version: 1.1.0.4
+//  Updated: 19-Jul-1998
+//
+//  Copyright:  Ferdinand Prantl, portions by Stcherbatchenko Andrei
+//  E-mail:     prantl@ff.cuni.cz
+//
+//  INI syntax highlighing definition
+//
+//  You are free to use or modify this code to the following restrictions:
+//  - Acknowledge me somewhere in your about box, simple "Parts of code by.."
+//  will be enough. If you can't (or don't want to), contact me personally.
+//  - LEAVE THIS HEADER INTACT
+////////////////////////////////////////////////////////////////////////////
+
+#include "stdafx.h"
+#include "ccrystaltextview.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#undef THIS_FILE
+static char THIS_FILE[] = __FILE__;
+#endif
+
+//  C++ keywords (MSVC5.0 + POET5.0)
+static LPTSTR s_apszIniKeywordList[] =
+  {
+    _T ("["),
+    _T ("]"),
+    _T ("="),
+    NULL
+  };
+
+static BOOL
+IsXKeyword (LPTSTR apszKeywords[], LPCTSTR pszChars, int nLength)
+{
+  for (int L = 0; apszKeywords[L] != NULL; L++)
+    {
+      if (_tcsnicmp (apszKeywords[L], pszChars, nLength) == 0
+            && apszKeywords[L][nLength] == 0)
+        return TRUE;
+    }
+  return FALSE;
+}
+
+static BOOL
+IsIniKeyword (LPCTSTR pszChars, int nLength)
+{
+  return IsXKeyword (s_apszIniKeywordList, pszChars, nLength);
+}
+
+static BOOL
+IsIniNumber (LPCTSTR pszChars, int nLength)
+{
+  if (nLength > 2 && pszChars[0] == '0' && pszChars[1] == 'x')
+    {
+      for (int I = 2; I < nLength; I++)
+        {
+          if (_istdigit (pszChars[I]) || (pszChars[I] >= 'A' && pszChars[I] <= 'F') ||
+                (pszChars[I] >= 'a' && pszChars[I] <= 'f'))
+            continue;
+          return FALSE;
+        }
+      return TRUE;
+    }
+  if (!_istdigit (pszChars[0]))
+    return FALSE;
+  for (int I = 1; I < nLength; I++)
+    {
+      if (!_istdigit (pszChars[I]) && pszChars[I] != '+' &&
+            pszChars[I] != '-' && pszChars[I] != '.' && pszChars[I] != 'e' &&
+            pszChars[I] != 'E')
+        return FALSE;
+    }
+  return TRUE;
+}
+
+#define DEFINE_BLOCK(pos, colorindex)   \
+ASSERT((pos) >= 0 && (pos) <= nLength);\
+if (pBuf != NULL)\
+  {\
+    if (nActualItems == 0 || pBuf[nActualItems - 1].m_nCharPos <= (pos)){\
+        pBuf[nActualItems].m_nCharPos = (pos);\
+        pBuf[nActualItems].m_nColorIndex = (colorindex);\
+        nActualItems ++;}\
+  }
+
+#define COOKIE_COMMENT          0x0001
+#define COOKIE_PREPROCESSOR     0x0002
+#define COOKIE_EXT_COMMENT      0x0004
+#define COOKIE_STRING           0x0008
+#define COOKIE_CHAR             0x0010
+
+DWORD CCrystalTextView::
+ParseLineIni (DWORD dwCookie, int nLineIndex, TEXTBLOCK * pBuf, int &nActualItems)
+{
+  int nLength = GetLineLength (nLineIndex);
+  if (nLength <= 1)
+    return dwCookie & COOKIE_EXT_COMMENT;
+
+  LPCTSTR pszChars = GetLineChars (nLineIndex);
+  BOOL bFirstChar = (dwCookie & ~COOKIE_EXT_COMMENT) == 0;
+  BOOL bRedefineBlock = TRUE;
+  BOOL bDecIndex = FALSE;
+  int nIdentBegin = -1;
+  for (int I = 0;; I++)
+    {
+      if (bRedefineBlock)
+        {
+          int nPos = I;
+          if (bDecIndex)
+            nPos--;
+          if (dwCookie & (COOKIE_COMMENT | COOKIE_EXT_COMMENT))
+            {
+              DEFINE_BLOCK (nPos, COLORINDEX_COMMENT);
+            }
+          else if (dwCookie & (COOKIE_CHAR | COOKIE_STRING))
+            {
+              DEFINE_BLOCK (nPos, COLORINDEX_STRING);
+            }
+          else
+            {
+              if (xisalnum (pszChars[nPos]) || pszChars[nPos] == '.' && nPos > 0 && (!xisalpha (pszChars[nPos - 1]) && !xisalpha (pszChars[nPos + 1])))
+                {
+                  DEFINE_BLOCK (nPos, COLORINDEX_NORMALTEXT);
+                }
+              else
+                {
+                  DEFINE_BLOCK (nPos, COLORINDEX_OPERATOR);
+                  bRedefineBlock = TRUE;
+                  bDecIndex = TRUE;
+                  goto out;
+                }
+            }
+          bRedefineBlock = FALSE;
+          bDecIndex = FALSE;
+        }
+out:
+
+      if (I == nLength)
+        break;
+
+      if (dwCookie & COOKIE_COMMENT)
+        {
+          DEFINE_BLOCK (I, COLORINDEX_COMMENT);
+          dwCookie |= COOKIE_COMMENT;
+          break;
+        }
+
+      //  String constant "...."
+      if (dwCookie & COOKIE_STRING)
+        {
+          if (pszChars[I] == '"' && (I == 0 || I == 1 && pszChars[I - 1] != '\\' || I >= 2 && (pszChars[I - 1] != '\\' || pszChars[I - 1] == '\\' && pszChars[I - 2] == '\\')))
+            {
+              dwCookie &= ~COOKIE_STRING;
+              bRedefineBlock = TRUE;
+            }
+          continue;
+        }
+
+      //  Char constant '..'
+      if (dwCookie & COOKIE_CHAR)
+        {
+          if (pszChars[I] == '\'' && (I == 0 || I == 1 && pszChars[I - 1] != '\\' || I >= 2 && (pszChars[I - 1] != '\\' || pszChars[I - 1] == '\\' && pszChars[I - 2] == '\\')))
+            {
+              dwCookie &= ~COOKIE_CHAR;
+              bRedefineBlock = TRUE;
+            }
+          continue;
+        }
+
+      if (pszChars[I] == ';')
+        {
+          DEFINE_BLOCK (I, COLORINDEX_COMMENT);
+          dwCookie |= COOKIE_COMMENT;
+          break;
+        }
+
+      //  Normal text
+      if (pszChars[I] == '"')
+        {
+          DEFINE_BLOCK (I, COLORINDEX_STRING);
+          dwCookie |= COOKIE_STRING;
+          continue;
+        }
+      if (pszChars[I] == '\'')
+        {
+          // if (I + 1 < nLength && pszChars[I + 1] == '\'' || I + 2 < nLength && pszChars[I + 1] != '\\' && pszChars[I + 2] == '\'' || I + 3 < nLength && pszChars[I + 1] == '\\' && pszChars[I + 3] == '\'')
+          if (!I || !xisalnum (pszChars[I - 1]))
+            {
+              DEFINE_BLOCK (I, COLORINDEX_STRING);
+              dwCookie |= COOKIE_CHAR;
+              continue;
+            }
+        }
+
+      if (bFirstChar)
+        {
+          if (!_istspace (pszChars[I]))
+            bFirstChar = FALSE;
+        }
+
+      if (pBuf == NULL)
+        continue;               //  We don't need to extract keywords,
+      //  for faster parsing skip the rest of loop
+
+      if (xisalnum (pszChars[I]) || pszChars[I] == '.' && I > 0 && (!xisalpha (pszChars[I - 1]) && !xisalpha (pszChars[I + 1])))
+        {
+          if (nIdentBegin == -1)
+            nIdentBegin = I;
+        }
+      else
+        {
+          if (nIdentBegin >= 0)
+            {
+              if (IsIniKeyword (pszChars + nIdentBegin, I - nIdentBegin))
+                {
+                  DEFINE_BLOCK (nIdentBegin, COLORINDEX_KEYWORD);
+                }
+              else if (IsIniNumber (pszChars + nIdentBegin, I - nIdentBegin))
+                {
+                  DEFINE_BLOCK (nIdentBegin, COLORINDEX_NUMBER);
+                }
+              else
+                {
+                  bool bFunction = FALSE;
+
+                  for (int j = I; j < nLength; j++)
+                    {
+                      if (!_istspace (pszChars[j]))
+                        {
+                          if (pszChars[j] == '(')
+                            {
+                              bFunction = TRUE;
+                            }
+                          break;
+                        }
+                    }
+                  if (bFunction)
+                    {
+                      DEFINE_BLOCK (nIdentBegin, COLORINDEX_FUNCNAME);
+                    }
+                }
+              bRedefineBlock = TRUE;
+              bDecIndex = TRUE;
+              nIdentBegin = -1;
+            }
+        }
+    }
+
+  if (nIdentBegin >= 0)
+    {
+      if (IsIniKeyword (pszChars + nIdentBegin, I - nIdentBegin))
+        {
+          DEFINE_BLOCK (nIdentBegin, COLORINDEX_KEYWORD);
+        }
+      else if (IsIniNumber (pszChars + nIdentBegin, I - nIdentBegin))
+        {
+          DEFINE_BLOCK (nIdentBegin, COLORINDEX_NUMBER);
+        }
+      else
+        {
+          bool bFunction = FALSE;
+
+          for (int j = I; j < nLength; j++)
+            {
+              if (!_istspace (pszChars[j]))
+                {
+                  if (pszChars[j] == '(')
+                    {
+                      bFunction = TRUE;
+                    }
+                  break;
+                }
+            }
+          if (bFunction)
+            {
+              DEFINE_BLOCK (nIdentBegin, COLORINDEX_FUNCNAME);
+            }
+        }
+    }
+
+  if (pszChars[nLength - 1] != '\\')
+    dwCookie &= COOKIE_EXT_COMMENT;
+  return dwCookie;
+}
index 9999e2c..647d323 100644 (file)
@@ -9,6 +9,11 @@
  BUG: [ 893410 ] Typo in IDS_DIFF_FILEOVERWRITE
   Src: Merge.rc
   Languages: *.rc
+ RFE: [ 897975 ] Syntax highlighting for INI files
+   Submitted by Tim Gerundt
+   Src: Merge.dsp
+   editlib: ccrystaltextview.cpp ccrystaltextview.h
+   editlib new file: ini.cpp
 
 2004-02-18 Jochen
  PATCH: [ 889357 ] Attempt to improve DirScan speed