📄 cedtdocanal.cpp
字号:
#include "stdafx.h"
#include "cedtHeader.h"
// temporary variables
static TCHAR _buffer[MAX_WORD_LENGTH+1];
static ANALYZEDWORDINFO _words[MAX_WORDS_COUNT+1];
// global settings
static CMap<CString, LPCTSTR, SHORT, SHORT &> * _pKEY;
static CMap<CString, LPCTSTR, SHORT, SHORT &> * _pDIC;
static BOOL _bCASESENSITIVE, _bDICLOADED;
// language specification
static TCHAR ESC, QU1, QU2, QU3;
static UCHAR rngQU1, rngLC1, rngBC1;
static LPCTSTR LF1, LF2, LC1, LC2, C1B, C1E, C2B, C2E;
static LPCTSTR SDB, SDE, HLB, HLE, R1B, R1E, R2B, R2E;
static LPCTSTR DEL, PRE, VAR, VEB, SVC, HEX;
static INT lenLF1, lenLF2, lenLC1, lenLC2, lenC1B, lenC1E, lenC2B, lenC2E;
static INT lenSDB, lenSDE, lenHLB, lenHLE, lenR1B, lenR1E, lenR2B, lenR2E;
static INT lenHEX;
static BOOL _KeyLookup(UCHAR & cType, UCHAR & cRange, TCHAR * pWord, SHORT sLength)
{
if( sLength > MAX_WORD_LENGTH ) return FALSE;
strncpy(_buffer, pWord, sLength); _buffer[sLength] = '\0';
if( ! _bCASESENSITIVE ) _strlwr(_buffer);
BOOL bFound; SHORT sValue = 0x00;
bFound = _pKEY->Lookup(_buffer, sValue);
cType = LOBYTE((WORD)sValue); cRange = HIBYTE((WORD)sValue);
return bFound;
}
static BOOL _DicLookup(TCHAR * pWord, SHORT sLength)
{
if( sLength > MAX_WORD_LENGTH ) return FALSE;
strncpy(_buffer, pWord, sLength); _buffer[sLength] = '\0';
_strlwr(_buffer);
BOOL bFound; SHORT sValue = 0x00;
bFound = _pDIC->Lookup(_buffer, sValue);
return bFound;
}
static void _WordFound(SHORT windex, UCHAR cType, UCHAR cRange, SHORT sIndex, SHORT sLength)
{
_words[windex].m_cType = cType;
_words[windex].m_cRange = cRange;
_words[windex].m_sIndex = sIndex;
_words[windex].m_sLength = sLength;
// TRACE2("Word Found: %d, %d\n", windex, sLength);
}
static void _FinishLine(SHORT wcount, BOOL bOverflow, CAnalyzedString & rLine)
{
delete [] rLine.m_pWordInfo;
rLine.m_pWordInfo = new ANALYZEDWORDINFO[wcount];
memcpy(rLine.m_pWordInfo, _words, wcount * sizeof(ANALYZEDWORDINFO));
rLine.m_sWordCount = wcount;
rLine.m_sInfoFlags = rLine.m_sInfoFlags & LT_HASBOOKMARK;
if( bOverflow ) rLine.m_sInfoFlags |= LT_LINEOVERFLOW;
for(SHORT i = 0; i < wcount; i++) {
switch( _words[i].m_cType ) {
case WT_RANGE1BEG: case WT_RANGE1END: case WT_RANGE2BEG: case WT_RANGE2END:
rLine.m_sInfoFlags |= LT_HASRANGE; break;
case WT_LINECOMMENT: case WT_COMMENTON: case WT_COMMENTOFF:
rLine.m_sInfoFlags |= LT_HASCOMMENT; break;
case WT_SHADOWON: case WT_SHADOWOFF: case WT_HIGHLIGHTON: case WT_HIGHLIGHTOFF:
rLine.m_sInfoFlags |= LT_HASHIGHLIGHT; break;
case WT_QUOTATION1: case WT_QUOTATION2: case WT_QUOTATION3:
rLine.m_sInfoFlags |= LT_HASQUOTATION; break;
}
}
}
#define _NEXT_WORD(addr) { beg = fwd; state = (addr); }
#define _ROLL_BACK(addr) { fwd = beg; state = (addr); }
#define _JUMP_ADDR(addr) { state = (addr); }
#define _CHCK_DBCS(ptr) ( bDBCS && IsDBCSLeadByte(* ptr) )
#define _CHCK_SIZE(ptr, len) ( ptr - str < MAX_STRING_SIZE - (len) )
static void _AnalyzeLine(CAnalyzedString & rLine, BOOL bDBCS)
{
INT is_finished = 0, state = 0; SHORT wcount = 0;
UCHAR type, range; TCHAR * str, * beg, * fwd;
str = beg = fwd = (TCHAR *)(LPCTSTR)rLine;
while( ! is_finished ) {
switch( state ) {
case 0x0000: // CHECK EOS, OVERFLOW AND WHITE SPACE
if( * fwd == '\0' ) {
// end of line
_WordFound(wcount++, WT_RETURN, RT_GLOBAL, beg-str, fwd-beg);
is_finished = 1;
} else if( fwd - str >= MAX_STRING_SIZE-1 ) {
// line overflow
_WordFound(wcount++, WT_RETURN, RT_GLOBAL, beg-str, fwd-beg);
is_finished = -1;
} else if( * fwd == '\t' && _CHCK_SIZE(fwd, 1) ) {
fwd++;
_WordFound(wcount++, WT_TAB, RT_GLOBAL, beg-str, fwd-beg);
_NEXT_WORD(0x0000);
} else if( * fwd == ' ' && _CHCK_SIZE(fwd, 1) ) {
fwd++; while( * fwd && * fwd == ' ' && _CHCK_SIZE(fwd, 1) ) fwd++;
_WordFound(wcount++, WT_SPACE, RT_GLOBAL, beg-str, fwd-beg);
_NEXT_WORD(0x0000);
} else {
_ROLL_BACK(0x0100);
}
break;
case 0x0100: // CHECK DOUBLE BYTE CHARACTERS AND ESCAPE CHARACTERS
if( bDBCS && IsDBCSLeadByte(* fwd) && * (fwd+1) && _CHCK_SIZE(fwd, 2) ) {
fwd += 2;
_WordFound(wcount++, WT_DBCHAR, RT_GLOBAL, beg-str, fwd-beg);
_NEXT_WORD(0x0000);
} else if( ESC && * fwd == ESC && * (fwd+1) && * (fwd+1) != '\t' && * (fwd+1) != ' ' && _CHCK_SIZE(fwd, 2) ) {
fwd += 2;
_WordFound(wcount++, WT_CONSTANT, RT_GLOBAL, beg-str, fwd-beg);
_NEXT_WORD(0x0000);
} else {
_ROLL_BACK(0x0200);
}
break;
case 0x0200: // CHECK QUOTATION MARK
if( QU1 && * fwd == QU1 && _CHCK_SIZE(fwd, 1) ) {
fwd++;
_WordFound(wcount++, WT_QUOTATION1, rngQU1, beg-str, fwd-beg);
_NEXT_WORD(0x0000);
} else if( QU2 && * fwd == QU2 && _CHCK_SIZE(fwd, 1) ) {
fwd++;
_WordFound(wcount++, WT_QUOTATION2, rngQU1, beg-str, fwd-beg);
_NEXT_WORD(0x0000);
} else if( QU3 && * fwd == QU3 && _CHCK_SIZE(fwd, 1) ) {
fwd++;
_WordFound(wcount++, WT_QUOTATION3, rngQU1, beg-str, fwd-beg);
_NEXT_WORD(0x0000);
} else {
_ROLL_BACK(0x0300);
}
break;
case 0x0300: // CHECK VARIOUS DELIMITERS
// block comment delimiters
if( C1B[0] && ! _strnicmp(fwd, C1B, lenC1B) && _CHCK_SIZE(fwd, lenC1B) ) {
fwd += lenC1B;
_WordFound(wcount++, WT_COMMENTON, rngBC1, beg-str, fwd-beg);
_NEXT_WORD(0x0000);
} else if( C1E[0] && ! _strnicmp(fwd, C1E, lenC1E) && _CHCK_SIZE(fwd, lenC1E) ) {
fwd += lenC1E;
_WordFound(wcount++, WT_COMMENTOFF, rngBC1, beg-str, fwd-beg);
_NEXT_WORD(0x0000);
} else if( C2B[0] && ! _strnicmp(fwd, C2B, lenC2B) && _CHCK_SIZE(fwd, lenC2B) ) {
fwd += lenC2B;
_WordFound(wcount++, WT_COMMENTON, rngBC1, beg-str, fwd-beg);
_NEXT_WORD(0x0000);
} else if( C2E[0] && ! _strnicmp(fwd, C2E, lenC2E) && _CHCK_SIZE(fwd, lenC2E) ) {
fwd += lenC2E;
_WordFound(wcount++, WT_COMMENTOFF, rngBC1, beg-str, fwd-beg);
_NEXT_WORD(0x0000);
// line comment delimiters
} else if( LC1[0] && isalpha(LC1[0]) && ! _strnicmp(fwd, LC1, lenLC1) && ! isalpha(fwd[lenLC1]) && _CHCK_SIZE(fwd, lenLC1) ) {
fwd += lenLC1;
_WordFound(wcount++, WT_LINECOMMENT, rngLC1, beg-str, fwd-beg);
_NEXT_WORD(0x0000);
} else if( LC1[0] && ! isalpha(LC1[0]) && ! _strnicmp(fwd, LC1, lenLC1) && _CHCK_SIZE(fwd, lenLC1) ) {
fwd += lenLC1;
_WordFound(wcount++, WT_LINECOMMENT, rngLC1, beg-str, fwd-beg);
_NEXT_WORD(0x0000);
} else if( LC2[0] && isalpha(LC2[0]) && ! _strnicmp(fwd, LC2, lenLC2) && ! isalpha(fwd[lenLC2]) && _CHCK_SIZE(fwd, lenLC2) ) {
fwd += lenLC2;
_WordFound(wcount++, WT_LINECOMMENT, rngLC1, beg-str, fwd-beg);
_NEXT_WORD(0x0000);
} else if( LC2[0] && ! isalpha(LC2[0]) && ! _strnicmp(fwd, LC2, lenLC2) && _CHCK_SIZE(fwd, lenLC2) ) {
fwd += lenLC2;
_WordFound(wcount++, WT_LINECOMMENT, rngLC1, beg-str, fwd-beg);
_NEXT_WORD(0x0000);
} else if( LF1[0] && fwd == str && ! _strnicmp(fwd, LF1, lenLF1) && _CHCK_SIZE(fwd, lenLF1) ) {
fwd += lenLF1;
_WordFound(wcount++, WT_LINECOMMENT, rngLC1, beg-str, fwd-beg);
_NEXT_WORD(0x0000);
} else if( LF2[0] && fwd == str && ! _strnicmp(fwd, LF2, lenLF2) && _CHCK_SIZE(fwd, lenLF2) ) {
fwd += lenLF2;
_WordFound(wcount++, WT_LINECOMMENT, rngLC1, beg-str, fwd-beg);
_NEXT_WORD(0x0000);
// highlight & shadow delimiters
} else if( HLB[0] && ! _strnicmp(fwd, HLB, lenHLB) && _CHCK_SIZE(fwd, lenHLB) ) {
fwd += lenHLB;
_WordFound(wcount++, WT_HIGHLIGHTON, RT_GLOBAL, beg-str, fwd-beg);
_NEXT_WORD(0x0000);
} else if( HLE[0] && ! _strnicmp(fwd, HLE, lenHLE) && _CHCK_SIZE(fwd, lenHLE) ) {
fwd += lenHLE;
_WordFound(wcount++, WT_HIGHLIGHTOFF, RT_GLOBAL, beg-str, fwd-beg);
_NEXT_WORD(0x0000);
} else if( SDB[0] && ! _strnicmp(fwd, SDB, lenSDB) && _CHCK_SIZE(fwd, lenSDB) ) {
fwd += lenSDB;
_WordFound(wcount++, WT_SHADOWON, RT_GLOBAL, beg-str, fwd-beg);
_NEXT_WORD(0x0000);
} else if( SDE[0] && ! _strnicmp(fwd, SDE, lenSDE) && _CHCK_SIZE(fwd, lenSDE) ) {
fwd += lenSDE;
_WordFound(wcount++, WT_SHADOWOFF, RT_GLOBAL, beg-str, fwd-beg);
_NEXT_WORD(0x0000);
// range delimiters
} else if( R1B[0] && ! _strnicmp(fwd, R1B, lenR1B) && _CHCK_SIZE(fwd, lenR1B) ) {
fwd += lenR1B;
_WordFound(wcount++, WT_RANGE1BEG, RT_GLOBAL, beg-str, fwd-beg);
_NEXT_WORD(0x0000);
} else if( R1E[0] && ! _strnicmp(fwd, R1E, lenR1E) && _CHCK_SIZE(fwd, lenR1E) ) {
fwd += lenR1E;
_WordFound(wcount++, WT_RANGE1END, RT_GLOBAL, beg-str, fwd-beg);
_NEXT_WORD(0x0000);
} else if( R2B[0] && ! _strnicmp(fwd, R2B, lenR2B) && _CHCK_SIZE(fwd, lenR2B) ) {
fwd += lenR2B;
_WordFound(wcount++, WT_RANGE2BEG, RT_GLOBAL, beg-str, fwd-beg);
_NEXT_WORD(0x0000);
} else if( R2E[0] && ! _strnicmp(fwd, R2E, lenR2E) && _CHCK_SIZE(fwd, lenR2E) ) {
fwd += lenR2E;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -