⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cedtdocanal.cpp

📁 Crimson编辑器的英文版,完成从韩文版变成英文版的移植,并且附带可执行文件和注册表文件,无需原先的安装包,是改写编辑器的最理想选择.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -