📄 textfilter.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 + -