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,
--- /dev/null
+///////////////////////////////////////////////////////////////////////////
+// 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;
+}