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

📄 textfilter.cpp

📁 奇迹世界公用文件源代码,研究网络游戏的朋友可以研究下
💻 CPP
字号:
#include "../ProgramCommon/Define.h"
#include "UtilityCommon.h"
#include "CommonDef.h"
#include "SolarFileReader.h"
#include ".\TextFilter.h"


#define	ISHANGUL(ch)	((ch) & 0x80)

//Todo:蜡聪内靛 眉农肺 促惫绢 瘤盔 且荐 乐霸!!!
bool  ITextFilter::CheckIncludeString(char *szSrc)
{

	for (int n = 0; n < (signed)strlen(szSrc); n++)
	{
		switch (szSrc[n])
		{
		case ' ' ://傍归 
		case '\t' ://徘篮 救等促.
			return true;
		}

		if(szSrc[n]& 0x80)
		{

			unsigned char	cBuf1=		szSrc[n];
			unsigned char	cBuf2=		szSrc[n+1];
			unsigned short	wBuf=		(unsigned short)cBuf1<<8 | cBuf2;

			if(wBuf >= 0xB0A1  &&  wBuf <= 0xC8FE)	//茄臂 	
			{
				;
			}
			else if(wBuf >= 0xCAA1  &&  wBuf <= 0xFDFE) //茄磊 
			{
				return true;
			}
			else if(wBuf >= 0xA1A1  &&  wBuf <= 0xACFE) //2官捞飘 漂荐 巩磊
			{
				return true;
			}
			n++;
		}
		else if(isdigit(szSrc[n]))//箭磊搁 
		{
			;
		}
		else if(isalpha(szSrc[n]))//康巩捞搁
		{
			;
		}
		else //扁鸥 
		{
			return true;
		}
	}

	return false;
}

//*****************************************************************************
//	巩磊凯俊辑 white space客 tab 阑 瘤快绊 巩磊父 巢变促.
//
//	Paremeters
//		char *szDest	: trim 矫挪 郴侩阑 淬阑 器牢磐
//		char *szSrc		: trim 矫懦 巩磊凯
//	Return Values
//		void
//	Remark
//		昏力 措惑 : ' ' '\t' '\n' '\"'
//*****************************************************************************
void	ITextFilter::Trim(char *szDest, const char *szSrc)
{
	for (int n = 0, i = 0; n < (signed)strlen(szSrc); n++)
	{
		switch (szSrc[n])
		{
		case ' ' :
		case '\t' :
		case '\n' :
		//case '\"' :
			break;

		default :
			szDest[i] = szSrc[n];
			i++;
			break;
		}
	}
	szDest[i] = '\0';
}


//*****************************************************************************
//	巩磊凯俊辑 漂沥 辨捞父怒父 肋扼辰 胶飘傅阑 父电促.
//
//	Paremeters
//		char *szDest	: 肋扼辰 胶飘傅阑 淬阑 器牢磐
//		char *szSrc		: 肋扼尘 巩磊凯
//		int nLength		: 肋扼尘 辨捞
//	Return Values
//		void
//	Remark
//		strncpy + 澄巩磊 持扁 狼 扁瓷.
//		父老 szSrc狼 辨捞啊 nLength焊促 累栏搁 szSrc狼 辨捞父怒 汗荤茄促.
//*****************************************************************************
void	ITextFilter::GetStringPart(char *szDest, const char *szSrc, int nLength)
{
	if (strlen(szSrc) <= nLength)
		strcpy(szDest, szSrc);
	else
	{
		memcpy(szDest, szSrc, nLength);
		szDest[nLength] = '\0';
	}
}

//*****************************************************************************
//	茄 巩磊凯俊辑 漂沥 巩磊凯狼 困摹甫 茫酒辰促.
//
//	Paremeters
//		char *szStr		: 八祸且 巩磊凯 (ex : ABCDEFG)
//		char *szCharSet	: 茫绰 措惑		(ex : EF)
//	Return Values
//		char*			: szChatSet狼 困摹 器牢磐. 绝栏搁 NULL.
//	Remark
//		strstr苞 扁瓷苞 荤侩过捞 鞍栏唱 茄臂 find狼 巩力痢阑 秦搬
//*****************************************************************************
char*	ITextFilter::FindString(char *szStr, const char *szCharSet)
{
	if (strlen(szStr) < strlen(szCharSet))
		return NULL;

	for (int n = 0; n < strlen(szStr) - strlen(szCharSet) + 1;)
	{
		char *l_szStr = (char*) malloc(strlen(szCharSet) + 1);
		GetStringPart(l_szStr, szStr + n, strlen(szCharSet));
		
		if ( CSTR_EQUAL == CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, l_szStr,_tcslen(l_szStr), szCharSet, _tcslen(szCharSet)) )
		{
			free(l_szStr);
			return (szStr + n);
		}
		free(l_szStr);
		if (ISHANGUL(szStr[n]))
			n += 2;
		else
			n++;
	}
	return NULL;
}


bool ITextFilter::CheckString(char *szSrc)
{
	//老摹窍绰窜绢甫 器窃窍绊 乐唱 八荤 
	return false;
}




bool ITextFilter::IsHaveReplace(char *szSrc,bool binclude) 
{
/*	if(binclude)
	{
		if(CheckIncludeString(szSrc))
		{
			return true;
		}	
	}*/

	return GetReplaceTarget(NULL, szSrc)!=NULL;	
}


//*****************************************************************************
//	巩磊凯狼 葛电 摹券 措惑阑 摹券矫挪促.
//
//	Paremeters
//		char *szDest	: 摹券捞 场抄 巩磊凯阑 淬阑 器牢磐
//		char *szSrc		: 摹券矫懦 巩磊凯
//		int nMaxLength	: 摹券矫挪 饶狼 郴侩阑 淬阑 弥措 辨捞
//	Return Values
//		bool			: 窍唱扼档 摹券阑 沁绰瘤 咯何
//	Remark
//		摹券饶 辨捞啊 nMaxLength 焊促 辨绢瘤搁 ''肺 摹券矫挪促.
//		ReplaceWord俊辑 szDest俊 甸绢哎 巩磊凯捞 szSrc狼 巩磊凯焊促 10硅 捞惑
//		辨搁 俊矾啊 唱霸 等促. 林狼!! (抗 : A甫 ABCDEFGHIJK肺 摹券矫虐搁 俊矾!)
//		公茄 摹券捞 登瘤 臼档废 林狼且 巴! (抗 : A甫 AA肺 摹券窍搁 公茄 摹券茄促!)
//*****************************************************************************
bool	ITextFilter::Replace(char *szDest, char *szSrc, int nMaxLength)
{
	if (!IsHaveReplace(szSrc))
	{
		GetStringPart(szDest, szSrc, nMaxLength);
		return false;
	}

	char *l_szStr = (char*) malloc(strlen(szSrc) + 1);
	strcpy(l_szStr, szSrc);

	while (IsHaveReplace(l_szStr))
	{
		char *l_szTargetOffset = NULL, *l_szTargetString = NULL, *l_szReplaceString = NULL;
		int l_nTargetLength = 0;

		//	官层具 且 胶飘傅阑 l_szTargetString俊 历厘.
		l_szTargetOffset = GetReplaceTarget(&l_nTargetLength, l_szStr);
		l_szTargetString = (char*) malloc(l_nTargetLength + 1);
		GetStringPart(l_szTargetString, l_szTargetOffset, l_nTargetLength);

		//	官诧 第狼 胶飘傅阑 l_szReplaceString俊 历厘.
		l_szReplaceString = (char*) malloc(l_nTargetLength * 10 + 1);
		ReplaceWord(l_szReplaceString, l_szTargetString, l_nTargetLength * 10);

		//	摹券沁阑 版快 nMaxLength甫 逞绢啊瘤 臼绰瘤 八荤.
		if (strlen(l_szStr) + strlen(l_szReplaceString) - strlen(l_szTargetString) > nMaxLength)
			strcpy(l_szReplaceString, "");

		//	摹券
		strcpy(l_szTargetOffset + strlen(l_szReplaceString), l_szTargetOffset + strlen(l_szTargetString));
		memcpy(l_szTargetOffset, l_szReplaceString, strlen(l_szReplaceString));

		free(l_szTargetString);
		free(l_szReplaceString);
	}
	GetStringPart(szDest, l_szStr, nMaxLength);
	free (l_szStr);
	return true;
}

//*****************************************************************************
//	单捞磐甫 檬扁拳茄促.
//
//	Paremeters
//		const char *szFName	: 阂矾棵 颇老 捞抚
//	Return Values
//		void
//	Remark
//*****************************************************************************
void	CNSlangTextFilter::Clear()
{
	m_nSlangNumber = 0;
	m_szaSlangTarget = NULL;
	m_szaSlangReplace = NULL;
}

//*****************************************************************************
//	垮 DATA 颇老阑 阂矾柯促.
//
//	Paremeters
//		const char *szFName	: 阂矾棵 颇老 捞抚
//	Return Values
//		void
//	Remark
//*****************************************************************************
HRESULT	CNSlangTextFilter::Load(const char *szFName)
{
	FILE *pFile = fopen(szFName, "r");
	if (pFile == NULL)
		return false;

	char l_szStr[1024];
	m_nSlangNumber = 0;
	while (fgets(l_szStr, 1023, pFile) != NULL)
	{
		Trim(l_szStr, l_szStr);
		if (l_szStr[0] != '/'&&l_szStr[1] != '/' && strlen(l_szStr) != 0)
			m_nSlangNumber++;
	}

	m_szaSlangTarget = new char*[m_nSlangNumber];
	m_szaSlangReplace = new char*[m_nSlangNumber];
	for (int n = 0; n < m_nSlangNumber; n++)
	{
		m_szaSlangTarget[n] = new char[SLANG_LENGTH_MAX];
		m_szaSlangReplace[n] = new char[SLANG_LENGTH_MAX];
	}

	fseek(pFile, 0, 0);
	n = 0;
	while (fgets(l_szStr, 1023, pFile) != NULL)
	{
		Trim(l_szStr, l_szStr);
		if (l_szStr[0] != '/' && l_szStr[1] != '/' &&strlen(l_szStr) != 0)
		{
			if (strstr(l_szStr, ":") == NULL)
			{
				strcpy(m_szaSlangTarget[n], l_szStr);
				strcpy(m_szaSlangReplace[n], "");
			}
			else
			{
				GetStringPart(m_szaSlangTarget[n], l_szStr, strstr(l_szStr, ":") - l_szStr);
				strcpy(m_szaSlangReplace[n], strstr(l_szStr, ":") + 1);
			}
			n++;
		}
	}
	fclose(pFile);
	return true;
}

//*****************************************************************************
//	垮 DATA 颇老阑 蒲颇老俊辑 阂矾柯促.
//
//	Paremeters
//		const char *szFName	: 阂矾棵 颇老 捞抚
//	Return Values
//		void
//	Remark
//*****************************************************************************

HRESULT	CNSlangTextFilter::LoadFromPack(const char *szFName)
{
	util::SolarFileReader sr;
	if( !sr.OpenFileFromPack( "Data\\Resource.wpk", (char *)szFName, SEPERATOR_ONLY_NEWLINE ) )
		return FALSE;

	m_nSlangNumber		= 0;

	char pToken[SLANG_LENGTH_MAX];

	while( TRUE )
	{
		eTOKEN_TYPE ettType = sr.GetNextTokenType(); 
		if ( TOKEN_END == ettType )
			break;

		strncpy( pToken, sr.GetTokenString(), SLANG_LENGTH_MAX );
		++m_nSlangNumber;
	}

	m_szaSlangTarget	= new char*[m_nSlangNumber];
	m_szaSlangReplace	= new char*[m_nSlangNumber];
	for (int n = 0; n < m_nSlangNumber; n++)
	{
		m_szaSlangTarget[n]		= new char[SLANG_LENGTH_MAX];
		m_szaSlangReplace[n]	= new char[SLANG_LENGTH_MAX];
	}

	sr.Reset();

	for( n = 0; n < m_nSlangNumber; ++n )
	{
		sr.GetNextTokenType( TOKEN_STRING );
		strncpy( pToken, sr.GetTokenString(), SLANG_LENGTH_MAX );

		strcpy( m_szaSlangTarget[n], pToken );
	}

	sr.CloseFile();

	return TRUE;
}

//*****************************************************************************
//	LOAD俊辑 何弗 data甸阑 颇鲍矫挪促.
//
//	Paremeters
//		void
//	Return Values
//		void
//	Remark
//*****************************************************************************
HRESULT	CNSlangTextFilter::Destroy()
{
	if (!IsInit())
		return false;

	m_xInit = false;
	for (int n = 0; n < m_nSlangNumber; n++)
	{
		SAFE_DELETE(m_szaSlangTarget[n]);
		SAFE_DELETE(m_szaSlangReplace[n]);
	}
	SAFE_DELETE_ARRAY(m_szaSlangTarget);
	SAFE_DELETE_ARRAY(m_szaSlangReplace);
	return true;
}

//*****************************************************************************
//	家胶俊辑 摹券且 措惑阑 茫酒辰促.
//
//	Paremeters
//		int *nLength		: 摹券 措惑狼 辨捞甫 罐阑 器牢磐
//		const char *szSrc	: 摹券 措惑阑 茫阑 巩磊凯
//	Return Values
//		char*				: 摹券 措惑狼 困摹
//	Remark
//		摹券 措惑捞 绝栏搁 nLength俊绰 0捞 甸绢啊绊 NULL捞 馆券等促.
//*****************************************************************************
char*	CNSlangTextFilter::GetReplaceTarget(int *nLength, char *szSrc)
{
	if (!IsInit())
		return NULL;

	char *l_szStr = (char*) malloc(strlen(szSrc) + 1);
	Trim(l_szStr, szSrc);
	for (int n = 0; n < m_nSlangNumber; n++)
	{
		if (FindString(l_szStr, m_szaSlangTarget[n]))
		{
			int l_nTargetPos = FindString(l_szStr, m_szaSlangTarget[n]) - l_szStr;
			int l_nOffsetSpaceNumber = 0, l_nTargetSpaceNumber = 0;
			for (int i = 0, l_nOffset = 0; ; i++)
			{
				if (szSrc[i] == ' ' || szSrc[i] == '\t' || szSrc[i] == '\n')
					l_nOffsetSpaceNumber++;
				else
				{
					if (l_nOffset >= l_nTargetPos)
						break;
					l_nOffset++;
				}
			}

			for (l_nOffset = 0; l_nOffset < strlen(m_szaSlangTarget[n]); i++)
			{
				if (szSrc[i] == ' ' || szSrc[i] == '\t' || szSrc[i] == '\n')
					l_nTargetSpaceNumber++;
				else
					l_nOffset++;
			}
			free(l_szStr);
			if (nLength != NULL)
				*nLength = strlen(m_szaSlangTarget[n]) + l_nTargetSpaceNumber;
			return (szSrc + l_nTargetPos + l_nOffsetSpaceNumber);
		}
	}
	free(l_szStr);
	return NULL;
}

//*****************************************************************************
//	漂沥 巩磊凯阑 公均栏肺 摹券秦具 窍绰瘤 茫酒辰促.
//
//	Paremeters
//		char *szDest		: 摹券茄 第狼 巩磊凯阑 历厘且 器牢磐
//		const char *szSrc	: 摹券且 巩磊凯
//		int nMaxLength		: szDest 滚欺狼 弥措 农扁
//	Return Values
//		void				:
//	Remark
//		摹券茄 巩磊凯捞 绝栏搁 ""捞 甸绢埃促.
//*****************************************************************************
void	CNSlangTextFilter::ReplaceWord(char *szDest, const char *szSrc, int nMaxLength)
{
	if (!IsInit())
		return;

	char *l_szStr = (char*) malloc(strlen(szSrc) + 1);
	Trim(l_szStr, szSrc);

	for (int n = 0; n < m_nSlangNumber; n++)
	{
		if (strcmp(l_szStr, m_szaSlangTarget[n]) == 0)
		{
			GetStringPart(szDest, m_szaSlangReplace[n], nMaxLength);
			free(l_szStr);
			return;
		}
	}
	strcpy(szDest, "");
	free(l_szStr);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -