CCrystalTextView::SRC_INSTALLSHIELD, _T ("InstallShield"), _T ("rul"), &CrystalLineParser::ParseLineIS, SRCOPT_AUTOINDENT|SRCOPT_BRACEANSI, /*2,*/ _T ("/*"), _T ("*/"), _T ("//"), (DWORD)-1,
CCrystalTextView::SRC_JAVA, _T ("Java"), _T ("java,jav,js"), &CrystalLineParser::ParseLineJava, SRCOPT_AUTOINDENT|SRCOPT_BRACEANSI, /*2,*/ _T ("/*"), _T ("*/"), _T ("//"), (DWORD)-1,
CCrystalTextView::SRC_LISP, _T ("AutoLISP"), _T ("lsp,dsl"), &CrystalLineParser::ParseLineLisp, SRCOPT_AUTOINDENT|SRCOPT_BRACEANSI, /*2,*/ _T (";|"), _T ("|;"), _T (";"), (DWORD)-1,
+ CCrystalTextView::SRC_LUA, _T ("Lua"), _T ("lua"), &CrystalLineParser::ParseLineLua, SRCOPT_AUTOINDENT|SRCOPT_BRACEANSI, /*2,*/ _T ("--[["), _T ("--]]"), _T ("--"), (DWORD)-1,
CCrystalTextView::SRC_NSIS, _T ("NSIS"), _T ("nsi,nsh"), &CrystalLineParser::ParseLineNsis, SRCOPT_AUTOINDENT|SRCOPT_BRACEANSI, /*2,*/ _T ("/*"), _T ("*/"), _T (";"), (DWORD)-1,
CCrystalTextView::SRC_PASCAL, _T ("Pascal"), _T ("pas"), &CrystalLineParser::ParseLinePascal, SRCOPT_AUTOINDENT|SRCOPT_BRACEANSI, /*2,*/ _T ("{"), _T ("}"), _T (""), (DWORD)-1,
CCrystalTextView::SRC_PERL, _T ("Perl"), _T ("pl,pm,plx"), &CrystalLineParser::ParseLinePerl, SRCOPT_AUTOINDENT|SRCOPT_EOLNUNIX, /*4,*/ _T (""), _T (""), _T ("#"), (DWORD)-1,
--- /dev/null
+///////////////////////////////////////////////////////////////////////////\r
+// File: lua.cpp\r
+// Version: 1.0.0.0\r
+// Created: 17-May-2019\r
+//\r
+// Copyright: Stcherbatchenko Andrei, portions by Takashi Sawanaka\r
+// E-mail: sdottaka@users.sourceforge.net\r
+//\r
+// Lua syntax highlighing definition\r
+//\r
+// You are free to use or modify this code to the following restrictions:\r
+// - Acknowledge me somewhere in your about box, simple "Parts of code by.."\r
+// will be enough. If you can't (or don't want to), contact me personally.\r
+// - LEAVE THIS HEADER INTACT\r
+////////////////////////////////////////////////////////////////////////////\r
+\r
+#include "StdAfx.h"\r
+#include "crystallineparser.h"\r
+#include "SyntaxColors.h"\r
+#include "string_util.h"\r
+#include <algorithm>\r
+\r
+#ifdef _DEBUG\r
+#define new DEBUG_NEW\r
+#endif\r
+\r
+// Lua keywords\r
+static LPCTSTR s_apszLuaKeywordList[] =\r
+ {\r
+_T ("and"),\r
+_T ("break"),\r
+_T ("do"),\r
+_T ("else"),\r
+_T ("elseif"),\r
+_T ("end"),\r
+_T ("false"),\r
+_T ("for"),\r
+_T ("function"),\r
+_T ("if"),\r
+_T ("in"),\r
+_T ("local"),\r
+_T ("nil"),\r
+_T ("not"),\r
+_T ("or"),\r
+_T ("repeat"),\r
+_T ("return"),\r
+_T ("then"),\r
+_T ("true"),\r
+_T ("until"),\r
+_T ("while"),\r
+ };\r
+\r
+static bool\r
+IsLuaKeyword (LPCTSTR pszChars, int nLength)\r
+{\r
+ return ISXKEYWORD (s_apszLuaKeywordList, pszChars, nLength);\r
+}\r
+\r
+static bool\r
+IsLuaNumber (LPCTSTR pszChars, int nLength)\r
+{\r
+ if (nLength > 2 && pszChars[0] == '0')\r
+ {\r
+ if (pszChars[1] == 'x')\r
+ {\r
+ for (int I = 2; I < nLength; I++)\r
+ {\r
+ if (_istdigit (pszChars[I]) || (pszChars[I] >= 'A' && pszChars[I] <= 'F') ||\r
+ (pszChars[I] >= 'a' && pszChars[I] <= 'f') || pszChars[I] == '_')\r
+ continue;\r
+ return false;\r
+ }\r
+ return true;\r
+ }\r
+ else if (pszChars[1] == 'o')\r
+ {\r
+ for (int I = 2; I < nLength; I++)\r
+ {\r
+ if ((pszChars[I] >= '0' && pszChars[I] <= '7') || pszChars[I] == '_')\r
+ continue;\r
+ return false;\r
+ }\r
+ return true;\r
+ }\r
+ else if (pszChars[1] == 'b')\r
+ {\r
+ for (int I = 2; I < nLength; I++)\r
+ {\r
+ if ((pszChars[I] >= '0' && pszChars[I] <= '1') || pszChars[I] == '_')\r
+ continue;\r
+ return false;\r
+ }\r
+ return true;\r
+ }\r
+ }\r
+ if (!_istdigit (pszChars[0]) && pszChars[0] != '.')\r
+ return false;\r
+ for (int I = 1; I < nLength; I++)\r
+ {\r
+ if (!_istdigit (pszChars[I]) && pszChars[I] != '+' &&\r
+ pszChars[I] != '-' && pszChars[I] != '.' && pszChars[I] != 'e' &&\r
+ pszChars[I] != 'E' && pszChars[I] != '_')\r
+ return false;\r
+ }\r
+ return true;\r
+}\r
+\r
+DWORD\r
+CrystalLineParser::ParseLineLua (DWORD dwCookie, const TCHAR *pszChars, int nLength, TEXTBLOCK * pBuf, int &nActualItems)\r
+{\r
+ if (nLength == 0)\r
+ return dwCookie & (COOKIE_EXT_COMMENT | COOKIE_RAWSTRING | 0xFF000000);\r
+\r
+ bool bRedefineBlock = true;\r
+ bool bDecIndex = false;\r
+ int nIdentBegin = -1;\r
+ int nPrevI = -1;\r
+ int I=0;\r
+ for (I = 0;; nPrevI = I, I = static_cast<int>(::CharNext(pszChars+I) - pszChars))\r
+ {\r
+ if (I == nPrevI)\r
+ {\r
+ // CharNext did not advance, so we're at the end of the string\r
+ // and we already handled this character, so stop\r
+ break;\r
+ }\r
+\r
+ if (bRedefineBlock)\r
+ {\r
+ int nPos = I;\r
+ if (bDecIndex)\r
+ nPos = nPrevI;\r
+ if (dwCookie & (COOKIE_COMMENT | COOKIE_EXT_COMMENT))\r
+ {\r
+ DEFINE_BLOCK (nPos, COLORINDEX_COMMENT);\r
+ }\r
+ else if (dwCookie & (COOKIE_CHAR | COOKIE_STRING | COOKIE_RAWSTRING))\r
+ {\r
+ DEFINE_BLOCK (nPos, COLORINDEX_STRING);\r
+ }\r
+ else\r
+ {\r
+ if (xisalnum (pszChars[nPos]) || pszChars[nPos] == '.' && nPos > 0 && (!xisalpha (*::CharPrev(pszChars, pszChars + nPos)) && !xisalpha (*::CharNext(pszChars + nPos))))\r
+ {\r
+ DEFINE_BLOCK (nPos, COLORINDEX_NORMALTEXT);\r
+ }\r
+ else\r
+ {\r
+ DEFINE_BLOCK (nPos, COLORINDEX_OPERATOR);\r
+ bRedefineBlock = true;\r
+ bDecIndex = true;\r
+ goto out;\r
+ }\r
+ }\r
+ bRedefineBlock = false;\r
+ bDecIndex = false;\r
+ }\r
+out:\r
+\r
+ // Can be bigger than length if there is binary data\r
+ // See bug #1474782 Crash when comparing SQL with with binary data\r
+ if (I >= nLength || pszChars[I] == 0)\r
+ break;\r
+\r
+ if (dwCookie & COOKIE_COMMENT)\r
+ {\r
+ DEFINE_BLOCK (I, COLORINDEX_COMMENT);\r
+ dwCookie |= COOKIE_COMMENT;\r
+ break;\r
+ }\r
+\r
+ // String constant "...."\r
+ if (dwCookie & COOKIE_STRING)\r
+ {\r
+ if (pszChars[I] == '"' && (I == 0 || I == 1 && pszChars[nPrevI] != '\\' || I >= 2 && (pszChars[nPrevI] != '\\' || pszChars[nPrevI] == '\\' && *::CharPrev(pszChars, pszChars + nPrevI) == '\\')))\r
+ {\r
+ dwCookie &= ~COOKIE_STRING;\r
+ bRedefineBlock = true;\r
+ }\r
+ continue;\r
+ }\r
+\r
+ // Char constant '..'\r
+ if (dwCookie & COOKIE_CHAR)\r
+ {\r
+ if (pszChars[I] == '\'' && (I == 0 || I == 1 && pszChars[nPrevI] != '\\' || I >= 2 && (pszChars[nPrevI] != '\\' || pszChars[nPrevI] == '\\' && *::CharPrev(pszChars, pszChars + nPrevI) == '\\')))\r
+ {\r
+ dwCookie &= ~COOKIE_CHAR;\r
+ bRedefineBlock = true;\r
+ }\r
+ continue;\r
+ }\r
+\r
+ // Raw string constant [[ ... ]], [=[ ... ]=], [==[ ... ]==], ...\r
+ if (dwCookie & COOKIE_RAWSTRING)\r
+ {\r
+ const int nEqualsSignCount = COOKIE_GET_LUA_EQUALS_SIGN_COUNT(dwCookie);\r
+ if (I >= nEqualsSignCount + 1 && pszChars[I] == ']' && pszChars[I - nEqualsSignCount - 1] == ']' && \r
+ std::all_of(pszChars + I - nEqualsSignCount, pszChars + I, [](const auto c) { return c == '='; }))\r
+ {\r
+ dwCookie &= ~COOKIE_RAWSTRING;\r
+ bRedefineBlock = true;\r
+ }\r
+ continue;\r
+ }\r
+\r
+ // Extended comment --[[ ... ]] , --[=[ ... ]=], --[==[ ... ]==], ...\r
+ if (dwCookie & COOKIE_EXT_COMMENT)\r
+ {\r
+ const int nEqualsSignCount = COOKIE_GET_LUA_EQUALS_SIGN_COUNT(dwCookie);\r
+ if (I >= nEqualsSignCount + 1 && pszChars[I] == ']' && pszChars[I - nEqualsSignCount - 1] == ']' && \r
+ std::all_of(pszChars + I - nEqualsSignCount, pszChars + I, [](const auto c) { return c == '='; }))\r
+ {\r
+ dwCookie &= ~COOKIE_EXT_COMMENT;\r
+ bRedefineBlock = true;\r
+ }\r
+ continue;\r
+ }\r
+\r
+ if (I > 0 && pszChars[I] == '-' && pszChars[nPrevI] == '-')\r
+ {\r
+ DEFINE_BLOCK (nPrevI, COLORINDEX_COMMENT);\r
+ dwCookie |= COOKIE_COMMENT;\r
+ break;\r
+ }\r
+\r
+ // Normal text\r
+ if (pszChars[I] == '"')\r
+ {\r
+ DEFINE_BLOCK (I, COLORINDEX_STRING);\r
+ dwCookie |= COOKIE_STRING;\r
+ continue;\r
+ }\r
+ if (pszChars[I] == '\'')\r
+ {\r
+ // 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] == '\'')\r
+ if (!I || !xisalnum (pszChars[nPrevI]))\r
+ {\r
+ DEFINE_BLOCK (I, COLORINDEX_STRING);\r
+ dwCookie |= COOKIE_CHAR;\r
+ continue;\r
+ }\r
+ }\r
+ // Raw string [[ ... ]], [=[ ... ]=], [==[ ... ]==], ...\r
+ if (pszChars[I] == '[' && I + 1 < nLength && (pszChars[I + 1] == '[' || pszChars[I + 1] == '='))\r
+ {\r
+ int nEqualsSignCount = 0;\r
+ while (I + 1 + nEqualsSignCount < nLength && pszChars[I + 1 + nEqualsSignCount] == '=')\r
+ ++nEqualsSignCount;\r
+ if (I + 1 + nEqualsSignCount < nLength && pszChars[I + 1 + nEqualsSignCount] == '[')\r
+ {\r
+ DEFINE_BLOCK (I, COLORINDEX_STRING);\r
+ dwCookie |= COOKIE_RAWSTRING;\r
+ COOKIE_SET_LUA_EQUALS_SIGN_COUNT(dwCookie, nEqualsSignCount);\r
+ continue;\r
+ }\r
+ }\r
+ // Extended comment [[ ... ]], [=[ ... ]=], [==[ ... ]==], ...\r
+ if (pszChars[I] == '-' && I + 3 < nLength && pszChars[I + 1] == '-' && pszChars[I + 2] == '[' && (pszChars[I + 3] == '[' || pszChars[I + 3] == '='))\r
+ {\r
+ int nEqualsSignCount = 0;\r
+ while (I + 3 + nEqualsSignCount < nLength && pszChars[I + 3 + nEqualsSignCount] == '=')\r
+ ++nEqualsSignCount;\r
+ if (I + 3 + nEqualsSignCount < nLength && pszChars[I + 3 + nEqualsSignCount] == '[')\r
+ {\r
+ DEFINE_BLOCK (I, COLORINDEX_COMMENT);\r
+ dwCookie |= COOKIE_EXT_COMMENT;\r
+ COOKIE_SET_LUA_EQUALS_SIGN_COUNT(dwCookie, nEqualsSignCount);\r
+ continue;\r
+ }\r
+ }\r
+\r
+ if (pBuf == nullptr)\r
+ continue; // We don't need to extract keywords,\r
+ // for faster parsing skip the rest of loop\r
+\r
+ if (xisalnum (pszChars[I]) || pszChars[I] == '.' && I > 0 && (!xisalpha (pszChars[nPrevI]) && !xisalpha (pszChars[I + 1])))\r
+ {\r
+ if (nIdentBegin == -1)\r
+ nIdentBegin = I;\r
+ }\r
+ else\r
+ {\r
+ if (nIdentBegin >= 0)\r
+ {\r
+ if (IsLuaKeyword (pszChars + nIdentBegin, I - nIdentBegin))\r
+ {\r
+ DEFINE_BLOCK (nIdentBegin, COLORINDEX_KEYWORD);\r
+ }\r
+ else if (IsLuaNumber (pszChars + nIdentBegin, I - nIdentBegin))\r
+ {\r
+ DEFINE_BLOCK (nIdentBegin, COLORINDEX_NUMBER);\r
+ }\r
+ else\r
+ {\r
+ bool bFunction = false;\r
+\r
+ for (int j = I; j < nLength; j++)\r
+ {\r
+ if (!xisspace (pszChars[j]))\r
+ {\r
+ if (pszChars[j] == '(')\r
+ {\r
+ bFunction = true;\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ if (bFunction)\r
+ {\r
+ DEFINE_BLOCK (nIdentBegin, COLORINDEX_FUNCNAME);\r
+ }\r
+ }\r
+ bRedefineBlock = true;\r
+ bDecIndex = true;\r
+ nIdentBegin = -1;\r
+ }\r
+ }\r
+ }\r
+\r
+ if (nIdentBegin >= 0)\r
+ {\r
+ if (IsLuaKeyword (pszChars + nIdentBegin, I - nIdentBegin))\r
+ {\r
+ DEFINE_BLOCK (nIdentBegin, COLORINDEX_KEYWORD);\r
+ }\r
+ else if (IsLuaNumber (pszChars + nIdentBegin, I - nIdentBegin))\r
+ {\r
+ DEFINE_BLOCK (nIdentBegin, COLORINDEX_NUMBER);\r
+ }\r
+ else\r
+ {\r
+ bool bFunction = false;\r
+\r
+ for (int j = I; j < nLength; j++)\r
+ {\r
+ if (!xisspace (pszChars[j]))\r
+ {\r
+ if (pszChars[j] == '(')\r
+ {\r
+ bFunction = true;\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ if (bFunction)\r
+ {\r
+ DEFINE_BLOCK (nIdentBegin, COLORINDEX_FUNCNAME);\r
+ }\r
+ }\r
+ }\r
+\r
+ dwCookie &= COOKIE_EXT_COMMENT | COOKIE_RAWSTRING | 0xFF000000;\r
+ return dwCookie;\r
+}\r
#define IDS_COLORSCHEME_INSTALLSHIELD 33165\r
#define IDS_COLORSCHEME_JAVA 33166\r
#define IDS_COLORSCHEME_LISP 33167\r
-#define IDS_COLORSCHEME_NSIS 33168\r
-#define IDS_COLORSCHEME_PASCAL 33169\r
-#define IDS_COLORSCHEME_PERL 33170\r
-#define IDS_COLORSCHEME_PHP 33171\r
-#define IDS_COLORSCHEME_PO 33172\r
-#define IDS_COLORSCHEME_POWERSHELL 33173\r
-#define IDS_COLORSCHEME_PYTHON 33174\r
-#define IDS_COLORSCHEME_REXX 33175\r
-#define IDS_COLORSCHEME_RSRC 33176\r
-#define IDS_COLORSCHEME_RUBY 33177\r
-#define IDS_COLORSCHEME_RUST 33178\r
-#define IDS_COLORSCHEME_SGML 33179\r
-#define IDS_COLORSCHEME_SH 33180\r
-#define IDS_COLORSCHEME_SIOD 33181\r
-#define IDS_COLORSCHEME_SQL 33182\r
-#define IDS_COLORSCHEME_TCL 33183\r
-#define IDS_COLORSCHEME_TEX 33184\r
-#define IDS_COLORSCHEME_VERILOG 33185\r
-#define IDS_COLORSCHEME_VHDL 33186\r
-#define IDS_COLORSCHEME_XML 33187\r
-#define ID_COLORSCHEME_LAST 33187 // = IDS_COLORSCHEME_XML\r
+#define IDS_COLORSCHEME_LUA 33168\r
+#define IDS_COLORSCHEME_NSIS 33169\r
+#define IDS_COLORSCHEME_PASCAL 33170\r
+#define IDS_COLORSCHEME_PERL 33171\r
+#define IDS_COLORSCHEME_PHP 33172\r
+#define IDS_COLORSCHEME_PO 33173\r
+#define IDS_COLORSCHEME_POWERSHELL 33174\r
+#define IDS_COLORSCHEME_PYTHON 33175\r
+#define IDS_COLORSCHEME_REXX 33176\r
+#define IDS_COLORSCHEME_RSRC 33177\r
+#define IDS_COLORSCHEME_RUBY 33178\r
+#define IDS_COLORSCHEME_RUST 33179\r
+#define IDS_COLORSCHEME_SGML 33180\r
+#define IDS_COLORSCHEME_SH 33181\r
+#define IDS_COLORSCHEME_SIOD 33182\r
+#define IDS_COLORSCHEME_SQL 33183\r
+#define IDS_COLORSCHEME_TCL 33184\r
+#define IDS_COLORSCHEME_TEX 33185\r
+#define IDS_COLORSCHEME_VERILOG 33186\r
+#define IDS_COLORSCHEME_VHDL 33187\r
+#define IDS_COLORSCHEME_XML 33188\r
+#define ID_COLORSCHEME_LAST 33188 // = IDS_COLORSCHEME_XML\r
#define ID_TOOLBAR_NONE 33194\r
#define ID_TOOLBAR_SMALL 33195\r
#define ID_TOOLBAR_BIG 33196\r