OSDN Git Service

PATCH: [ 1058142 ] update coloring of batch file
authorKimmo Varis <kimmov@gmail.com>
Sat, 20 Nov 2004 18:29:58 +0000 (18:29 +0000)
committerKimmo Varis <kimmov@gmail.com>
Sat, 20 Nov 2004 18:29:58 +0000 (18:29 +0000)
 - submitted by Andre Arpin

Src/editlib/batch.cpp
Src/readme.txt

index 761f075..ac73ee4 100644 (file)
@@ -26,20 +26,39 @@ static char THIS_FILE[] = __FILE__;
 //  C++ keywords (MSVC5.0 + POET5.0)
 static LPTSTR s_apszBatKeywordList[] =
   {
+    _T (".AND."),
+    _T (".OR."),
+    _T (".XOR."),
     _T ("?"),
+    _T ("ACTIVATE"),
+    _T ("ALIAS"),
+    _T ("ASSOC"),
+    _T ("ATTRIB"),
+    _T ("BATCOMP"),
+    _T ("BDEBUGGER"),
+    _T ("BEEP"),
+    _T ("BREAK"),
+    _T ("BY"),
     _T ("CALL"),
+    _T ("CANCEL"),
+    _T ("CASE"),
     _T ("CD"),
     _T ("CDD"),
     _T ("CHCP"),
+    _T ("CHDIR"),
     _T ("CLS"),
     _T ("COLOR"),
     _T ("COPY"),
     _T ("CTTY"),
     _T ("DATE"),
+    _T ("DEFAULT"),
+    _T ("DEFINED"),
     _T ("DEL"),
     _T ("DELAY"),
     _T ("DESCRIBE"),
+    _T ("DETACH"),
     _T ("DIR"),
+    _T ("DIREXIST"),
     _T ("DIRHISTORY"),
     _T ("DIRS"),
     _T ("DO"),
@@ -50,74 +69,139 @@ static LPTSTR s_apszBatKeywordList[] =
     _T ("ECHOERR"),
     _T ("ECHOS"),
     _T ("ECHOSERR"),
+    _T ("ELSE"),
+    _T ("ELSEIFF"),
+    _T ("ENDDO"),
+    _T ("ENDIFF"),
     _T ("ENDLOCAL"),
+    _T ("ENDSWITCH"),
+    _T ("ENDTEXT"),
+    _T ("EQ"),
+    _T ("EQL"),
+    _T ("EQU"),
     _T ("ERASE"),
+    _T ("ERROR"),
+    _T ("ERRORLEVEL"),
+    _T ("ERRORMSG"),
     _T ("ESET"),
+    _T ("EVENTLOG"),
     _T ("EXCEPT"),
+    _T ("EXIST"),
     _T ("EXIT"),
     _T ("FFIND"),
     _T ("FOR"),
+    _T ("FOREVER"),
     _T ("FREE"),
+    _T ("FTYPE"),
+    _T ("FUNCTION"),
+    _T ("GE"),
+    _T ("GEQ"),
     _T ("GLOBAL"),
     _T ("GOSUB"),
     _T ("GOTO"),
+    _T ("GT"),
+    _T ("GTR"),
+    _T ("HEAD"),
     _T ("HELP"),
     _T ("HISTORY"),
     _T ("IF"),
     _T ("IFF"),
+    _T ("IFTP"),
+    _T ("IN"),
     _T ("INKEY"),
     _T ("INPUT"),
+    _T ("ISALIAS"),
+    _T ("ISAPP"),
+    _T ("ISDIR"),
+    _T ("ISFUNCTION"),
+    _T ("ISINTERNAL"),
+    _T ("ISLABEL"),
+    _T ("ISWINDOW"),
+    _T ("ITERATE"),
     _T ("KEYBD"),
+    _T ("KEYS"),
     _T ("KEYSTACK"),
+    _T ("LE"),
+    _T ("LEAVE"),
+    _T ("LEQ"),
     _T ("LH"),
-    _T ("LOADHIGH"),
     _T ("LIST"),
     _T ("LOADBTM"),
+    _T ("LOADHIGH"),
     _T ("LOCK"),
     _T ("LOG"),
+    _T ("LSS"),
+    _T ("LT"),
     _T ("MD"),
-    _T ("MKDIR"),
     _T ("MEMORY"),
+    _T ("MKDIR"),
+    _T ("MKLNK"),
     _T ("MOVE"),
+    _T ("MSGBOX"),
+    _T ("NE"),
+    _T ("NEQ"),
+    _T ("NOT"),
     _T ("ON"),
     _T ("OPTION"),
     _T ("PATH"),
     _T ("PAUSE"),
+    _T ("PDIR"),
+    _T ("PLAYAVI"),
+    _T ("PLAYSOUND"),
     _T ("POPD"),
+    _T ("PRINT"),
     _T ("PROMPT"),
     _T ("PUSHD"),
+    _T ("QUERYBOX"),
     _T ("QUIT"),
     _T ("RD"),
     _T ("REBOOT"),
+    _T ("RECYCLE"),
     _T ("REM"),
     _T ("REN"),
     _T ("RENAME"),
     _T ("RETURN"),
+    _T ("RMDIR"),
     _T ("SCREEN"),
     _T ("SCRPUT"),
     _T ("SELECT"),
+    _T ("SENDMAIL"),
     _T ("SET"),
     _T ("SETDOS"),
     _T ("SETLOCAL"),
     _T ("SHIFT"),
+    _T ("SHORTCUT"),
+    _T ("SHRALIAS"),
+    _T ("SMPP"),
+    _T ("SNPP"),
     _T ("START"),
     _T ("SWAPPING"),
     _T ("SWITCH"),
+    _T ("TAIL"),
+    _T ("TASKEND"),
+    _T ("TASKLIST"),
     _T ("TEE"),
     _T ("TEXT"),
+    _T ("THEN"),
     _T ("TIME"),
     _T ("TIMER"),
+    _T ("TITLE"),
     _T ("TOUCH"),
     _T ("TREE"),
     _T ("TRUENAME"),
     _T ("TYPE"),
     _T ("UNALIAS"),
+    _T ("UNFUNCTION"),
     _T ("UNLOCK"),
     _T ("UNSET"),
+    _T ("UNTIL"),
     _T ("VER"),
     _T ("VERIFY"),
     _T ("VOL"),
     _T ("VSCRPUT"),
+    _T ("WHICH"),
+    _T ("WHILE"),
+    _T ("WINDOW"),
     _T ("Y"),
     NULL
   };
@@ -193,6 +277,279 @@ static LPTSTR s_apszUser1KeywordList[] =
     NULL
   };
 
+static LPTSTR s_apszUser2KeywordList[] =
+  {
+    _T ("@ABS"),
+    _T ("@AGEDATE"),
+    _T ("@ALIAS"),
+    _T ("@ALTNAME"),
+    _T ("@ASCII"),
+    _T ("@ATTRIB"),
+    _T ("@CAPS"),
+    _T ("@CDROM"),
+    _T ("@CEILING"),
+    _T ("@CHAR"),
+    _T ("@CLIP"),
+    _T ("@CLIPW"),
+    _T ("@COLOR"),
+    _T ("@COMMA"),
+    _T ("@CONSOLE"),
+    _T ("@CONVERT"),
+    _T ("@CRC32"),
+    _T ("@DATE"),
+    _T ("@DAY"),
+    _T ("@DEC"),
+    _T ("@DECIMAL"),
+    _T ("@DESCRIPT"),
+    _T ("@DEVICE"),
+    _T ("@DIGITS"),
+    _T ("@DIRSTACK"),
+    _T ("@DISKFREE"),
+    _T ("@DISKTOTAL"),
+    _T ("@DISKUSED"),
+    _T ("@DOSMEM"),
+    _T ("@DOW"),
+    _T ("@DOWF"),
+    _T ("@DOWI"),
+    _T ("@DOY"),
+    _T ("@EMS"),
+    _T ("@ENUMSERVERS"),
+    _T ("@ENUMSHARES"),
+    _T ("@ERRTEXT"),
+    _T ("@EVAL"),
+    _T ("@EXEC"),
+    _T ("@EXECSTR"),
+    _T ("@EXETYPE"),
+    _T ("@EXPAND"),
+    _T ("@EXT"),
+    _T ("@EXTENDED"),
+    _T ("@FIELD"),
+    _T ("@FIELDS"),
+    _T ("@FILEAGE"),
+    _T ("@FILECLOSE"),
+    _T ("@FILEDATE"),
+    _T ("@FILENAME"),
+    _T ("@FILEOPEN"),
+    _T ("@FILEREAD"),
+    _T ("@FILES"),
+    _T ("@FILESEEK"),
+    _T ("@FILESEEKL"),
+    _T ("@FILESIZE"),
+    _T ("@FILETIME"),
+    _T ("@FILEWRITE"),
+    _T ("@FILEWRITEB"),
+    _T ("@FINDCLOSE"),
+    _T ("@FINDFIRST"),
+    _T ("@FINDNEXT"),
+    _T ("@FLOOR"),
+    _T ("@FORMAT"),
+    _T ("@FORMATN"),
+    _T ("@FSTYPE"),
+    _T ("@FULL"),
+    _T ("@FUNCTION"),
+    _T ("@GETDIR"),
+    _T ("@GETFILE"),
+    _T ("@GETFOLDER"),
+    _T ("@HISTORY"),
+    _T ("@IDOW"),
+    _T ("@IDOWF"),
+    _T ("@IF"),
+    _T ("@INC"),
+    _T ("@INDEX"),
+    _T ("@INIREAD"),
+    _T ("@INIWRITE"),
+    _T ("@INSERT"),
+    _T ("@INSTR"),
+    _T ("@INT"),
+    _T ("@IPADDRESS"),
+    _T ("@IPNAME"),
+    _T ("@ISALNUM"),
+    _T ("@ISALPHA"),
+    _T ("@ISASCII"),
+    _T ("@ISCNTRL"),
+    _T ("@ISDIGIT"),
+    _T ("@ISPRINT"),
+    _T ("@ISPUNCT"),
+    _T ("@ISSPACE"),
+    _T ("@ISXDIGIT"),
+    _T ("@LABEL"),
+    _T ("@LEFT"),
+    _T ("@LEN"),
+    _T ("@LFN"),
+    _T ("@LINE"),
+    _T ("@LINES"),
+    _T ("@LOWER"),
+    _T ("@LPT"),
+    _T ("@LTRIM"),
+    _T ("@MAKEAGE"),
+    _T ("@MAKEDATE"),
+    _T ("@MAKETIME"),
+    _T ("@MASTER"),
+    _T ("@MAX"),
+    _T ("@MD5"),
+    _T ("@MIN"),
+    _T ("@MONTH"),
+    _T ("@NAME"),
+    _T ("@NUMERIC"),
+    _T ("@OPTION"),
+    _T ("@PATH"),
+    _T ("@RANDOM"),
+    _T ("@READSCR"),
+    _T ("@READY"),
+    _T ("@REGCREATE"),
+    _T ("@REGDELKEY"),
+    _T ("@REGEXIST"),
+    _T ("@REGQUERY"),
+    _T ("@REGSET"),
+    _T ("@REGSETENV"),
+    _T ("@REMOTE"),
+    _T ("@REMOVABLE"),
+    _T ("@REPEAT"),
+    _T ("@REPLACE"),
+    _T ("@REXX"),
+    _T ("@RIGHT"),
+    _T ("@RTRIM"),
+    _T ("@SEARCH"),
+    _T ("@SELECT"),
+    _T ("@SFN"),
+    _T ("@STRIP"),
+    _T ("@SUBST"),
+    _T ("@SUBSTR"),
+    _T ("@TIME"),
+    _T ("@TIMER"),
+    _T ("@TRIM"),
+    _T ("@TRUENAME"),
+    _T ("@UNC"),
+    _T ("@UNICODE"),
+    _T ("@UNIQUE"),
+    _T ("@UPPER"),
+    _T ("@VERINFO"),
+    _T ("@WATTRIB"),
+    _T ("@WILD"),
+    _T ("@WINCLASS"),
+    _T ("@WINEXENAME"),
+    _T ("@WININFO"),
+    _T ("@WINMEMORY"),
+    _T ("@WINMETRICS"),
+    _T ("@WINSTATE"),
+    _T ("@WINSYSTEM"),
+    _T ("@WORD"),
+    _T ("@WORDS"),
+    _T ("@XMS"),
+    _T ("@YEAR"),
+    _T ("_"),
+    _T ("_4VER"),
+    _T ("_ACSTATUS"),
+    _T ("_ALIAS"),
+    _T ("_ANSI"),
+    _T ("_APMAC"),
+    _T ("_APMBATT"),
+    _T ("_APMLIFE"),
+    _T ("_BATCH"),
+    _T ("_BATCHLINE"),
+    _T ("_BATCHNAME"),
+    _T ("_BATCHTYPE"),
+    _T ("_BATTERY"),
+    _T ("_BATTERYLIFE"),
+    _T ("_BATTERYPERCENT"),
+    _T ("_BG"),
+    _T ("_BOOT"),
+    _T ("_BUILD"),
+    _T ("_CAPSLOCK"),
+    _T ("_CHILDPID"),
+    _T ("_CI"),
+    _T ("_CMDPROC"),
+    _T ("_CO"),
+    _T ("_CODEPAGE"),
+    _T ("_COLUMN"),
+    _T ("_COLUMNS"),
+    _T ("_COUNTRY"),
+    _T ("_CPU"),
+    _T ("_CPUUSAGE"),
+    _T ("_CTRL"),
+    _T ("_CWD"),
+    _T ("_CWDS"),
+    _T ("_CWP"),
+    _T ("_CWPS"),
+    _T ("_DATE"),
+    _T ("_DAY"),
+    _T ("_DETACHPID"),
+    _T ("_DISK"),
+    _T ("_DNAME"),
+    _T ("_DOS"),
+    _T ("_DOSVER"),
+    _T ("_DOW"),
+    _T ("_DOWF"),
+    _T ("_DOWI"),
+    _T ("_DOY"),
+    _T ("_DPMI"),
+    _T ("_DV"),
+    _T ("_ECHO"),
+    _T ("_ENV"),
+    _T ("_FG"),
+    _T ("_FTPERROR"),
+    _T ("_HLOGFILE"),
+    _T ("_HOST"),
+    _T ("_HOUR"),
+    _T ("_HWPROFILE"),
+    _T ("_IDOW"),
+    _T ("_IDOWF"),
+    _T ("_IMONTH"),
+    _T ("_IMONTHF"),
+    _T ("_ININAME"),
+    _T ("_IP"),
+    _T ("_ISODATE"),
+    _T ("_KBHIT"),
+    _T ("_KSTACK"),
+    _T ("_LALT"),
+    _T ("_LASTDISK"),
+    _T ("_LCTRL"),
+    _T ("_LOGFILE"),
+    _T ("_LSHIFT"),
+    _T ("_MINUTE"),
+    _T ("_MONITOR"),
+    _T ("_MONTH"),
+    _T ("_MONTHF"),
+    _T ("_MOUSE"),
+    _T ("_NDP"),
+    _T ("_NUMLOCK"),
+    _T ("_PID"),
+    _T ("_PIPE"),
+    _T ("_PPID"),
+    _T ("_RALT"),
+    _T ("_RCTRL"),
+    _T ("_ROW"),
+    _T ("_ROWS"),
+    _T ("_RSHIFT"),
+    _T ("_SCROLLLOCK"),
+    _T ("_SECOND"),
+    _T ("_SELECTED"),
+    _T ("_SHELL"),
+    _T ("_SHIFT"),
+    _T ("_SHRALIAS"),
+    _T ("_STARTPATH"),
+    _T ("_STARTPID"),
+    _T ("_SWAPPING"),
+    _T ("_SYSERR"),
+    _T ("_TIME"),
+    _T ("_TRANSIENT"),
+    _T ("_UNICODE"),
+    _T ("_VIDEO"),
+    _T ("_WIN"),
+    _T ("_WINDIR"),
+    _T ("_WINFGWINDOW"),
+    _T ("_WINNAME"),
+    _T ("_WINSYSDIR"),
+    _T ("_WINTICKS"),
+    _T ("_WINTITLE"),
+    _T ("_WINUSER"),
+    _T ("_WINVER"),
+    _T ("_XPIXELS"),
+    _T ("_YEAR"),
+    _T ("_YPIXELS"),
+    NULL
+  };
+
 static BOOL
 IsBatKeyword (LPCTSTR pszChars, int nLength)
 {
@@ -230,6 +587,24 @@ IsUser1Keyword (LPCTSTR pszChars, int nLength)
 }
 
 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
+IsUser2Keyword (LPCTSTR pszChars, int nLength)
+{
+    return IsXKeyword (s_apszUser2KeywordList, pszChars, nLength);
+}
+
+static BOOL
 IsBatNumber (LPCTSTR pszChars, int nLength)
 {
   if (nLength > 2 && pszChars[0] == '0' && pszChars[1] == 'x')
@@ -282,6 +657,7 @@ ParseLineBatch (DWORD dwCookie, int nLineIndex, TEXTBLOCK * pBuf, int &nActualIt
   BOOL bFirstChar = (dwCookie & ~COOKIE_EXT_COMMENT) == 0;
   BOOL bRedefineBlock = TRUE;
   BOOL bDecIndex = FALSE;
+  BOOL bOneWord = TRUE;
   int nIdentBegin = -1;
   for (int I = 0;; I++)
     {
@@ -301,10 +677,12 @@ ParseLineBatch (DWORD dwCookie, int nLineIndex, TEXTBLOCK * pBuf, int &nActualIt
           else if (dwCookie & COOKIE_PREPROCESSOR)
             {
               DEFINE_BLOCK (nPos, COLORINDEX_PREPROCESSOR);
+              if (!bOneWord) dwCookie &= ~COOKIE_PREPROCESSOR;
+                bOneWord = FALSE;
             }
           else
             {
-              if (xisalnum (pszChars[nPos]) || pszChars[nPos] == '.')
+              if (pszChars[nPos] == _T ('_') || pszChars[nPos] == _T ('@') || xisalnum (pszChars[nPos]) || pszChars[nPos] == '.')
                 {
                   DEFINE_BLOCK (nPos, COLORINDEX_NORMALTEXT);
                 }
@@ -373,12 +751,20 @@ out:
 
       if (bFirstChar)
         {
-          if (pszChars[I] == ':')
+          if (nLength >= I + 4 &&!_tcsnicmp (pszChars + I, _T ("TEXT"), 4))
             {
-              DEFINE_BLOCK (I, COLORINDEX_PREPROCESSOR);
-              dwCookie |= COOKIE_PREPROCESSOR;
+              DEFINE_BLOCK (I, COLORINDEX_COMMENT);
+              dwCookie |= COOKIE_EXT_COMMENT;
+              continue;
+            }
+          if (nLength >= I + 7 &&!_tcsnicmp (pszChars + I, _T ("ENDTEXT"), 7))
+            {
+              DEFINE_BLOCK (I, COLORINDEX_COMMENT);
+              dwCookie &= ~COOKIE_EXT_COMMENT;
               continue;
             }
+          if (dwCookie & COOKIE_EXT_COMMENT)
+              continue;
           if (nLength >= I + 3 && !_tcsnicmp (pszChars + I, _T ("REM"), 3) && (_istspace (pszChars[I + 3]) || nLength == I + 3))
             {
               DEFINE_BLOCK (I, COLORINDEX_COMMENT);
@@ -386,6 +772,18 @@ out:
               break;
             }
 
+          if (pszChars[I] == ':')
+            {
+              if (nLength > I + 2 && !(xisalnum (pszChars[I+1]) || isspace (pszChars[I+1])))
+                {
+                  DEFINE_BLOCK (I, COLORINDEX_COMMENT);
+                  dwCookie |= COOKIE_COMMENT;
+                  break;
+                }
+              DEFINE_BLOCK (I, COLORINDEX_PREPROCESSOR);
+              dwCookie |= COOKIE_PREPROCESSOR;
+              continue;
+            }
           if (!_istspace (pszChars[I]))
             bFirstChar = FALSE;
         }
@@ -394,7 +792,7 @@ out:
         continue;               //  We don't need to extract keywords,
       //  for faster parsing skip the rest of loop
 
-      if (xisalnum (pszChars[I]) || pszChars[I] == '.')
+      if (pszChars[I] == _T ('_') || pszChars[I] == _T ('@') || xisalnum (pszChars[I]) || pszChars[I] == '.')
         {
           if (nIdentBegin == -1)
             nIdentBegin = I;
@@ -403,18 +801,39 @@ out:
         {
           if (nIdentBegin >= 0)
             {
-              if (IsBatKeyword (pszChars + nIdentBegin, I - nIdentBegin))
+              if ((dwCookie & COOKIE_PREPROCESSOR))
+                {
+                  DEFINE_BLOCK (nIdentBegin, COLORINDEX_PREPROCESSOR);
+                }
+              else 
+                {
+                  if (dwCookie & COOKIE_EXT_COMMENT)
+                    {
+                        DEFINE_BLOCK (nIdentBegin, COLORINDEX_COMMENT);
+                    }
+                  else if (IsBatKeyword (pszChars + nIdentBegin, I - nIdentBegin))
                 {
                   DEFINE_BLOCK (nIdentBegin, COLORINDEX_KEYWORD);
+                  if ((I - nIdentBegin ==4 && !_tcsnicmp (pszChars + nIdentBegin, _T ("GOTO"), 4)) ||
+                      (I - nIdentBegin ==5 && !_tcsnicmp (pszChars + nIdentBegin, _T ("GOSUB"), 5))
+                      )
+                    {
+                        dwCookie=COOKIE_PREPROCESSOR;
+                    }
                 }
               else if (IsUser1Keyword (pszChars + nIdentBegin, I - nIdentBegin))
                 {
                   DEFINE_BLOCK (nIdentBegin, COLORINDEX_USER1);
                 }
+                  else if (IsUser2Keyword (pszChars + nIdentBegin, I - nIdentBegin))
+                    {
+                      DEFINE_BLOCK (nIdentBegin, COLORINDEX_USER2);
+                    }
               else if (IsBatNumber (pszChars + nIdentBegin, I - nIdentBegin))
                 {
                   DEFINE_BLOCK (nIdentBegin, COLORINDEX_NUMBER);
                 }
+              }
               bRedefineBlock = TRUE;
               bDecIndex = TRUE;
               nIdentBegin = -1;
@@ -424,14 +843,28 @@ out:
 
   if (nIdentBegin >= 0)
     {
-      if (IsBatKeyword (pszChars + nIdentBegin, I - nIdentBegin))
+      if (dwCookie & COOKIE_EXT_COMMENT)
+        {
+          DEFINE_BLOCK (nIdentBegin, COLORINDEX_COMMENT);
+        }
+      else if (IsBatKeyword (pszChars + nIdentBegin, I - nIdentBegin))
         {
           DEFINE_BLOCK (nIdentBegin, COLORINDEX_KEYWORD);
+          if ((I - nIdentBegin ==4 && !_tcsnicmp (pszChars + nIdentBegin, _T ("GOTO"), 4)) ||
+                (I - nIdentBegin ==5 && !_tcsnicmp (pszChars + nIdentBegin, _T ("GOSUB"), 5))
+                )
+              {
+                dwCookie=COOKIE_PREPROCESSOR;
+              }
         }
       else if (IsUser1Keyword (pszChars + nIdentBegin, I - nIdentBegin))
         {
           DEFINE_BLOCK (nIdentBegin, COLORINDEX_USER1);
         }
+      else if (IsUser2Keyword (pszChars + nIdentBegin, I - nIdentBegin))
+        {
+          DEFINE_BLOCK (nIdentBegin, COLORINDEX_USER2);
+        }
       else if (IsBatNumber (pszChars + nIdentBegin, I - nIdentBegin))
         {
           DEFINE_BLOCK (nIdentBegin, COLORINDEX_NUMBER);
index 1ca5c39..c715c30 100644 (file)
@@ -1,3 +1,8 @@
+2004-11-20 Kimmo
+ PATCH: [ 1058142 ] update coloring of batch file
+  Submitted by Andre Arpin
+  Src/editlib: batch.cpp
+
 2004-11-17 Kimmo
  PATCH: [ 1067374 ] Norwegian translation for 2.2.0
   Submitted by Hans Fr. Nordhaug