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

📄 replacethd.cpp

📁 一个我自己写的多语言工具,可以用于JAVA,VC的多语言话,可以提取所有文字资源,不破坏源文件的注释
💻 CPP
字号:
// ReplaceThd.cpp : implementation file
//

#include "stdafx.h"
#include "scanstringtool.h"
#include "ReplaceThd.h"
#include "MacroObj.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CReplaceThd

IMPLEMENT_DYNAMIC(CReplaceThd, CWinThread)

CReplaceThd::CReplaceThd(CScanstringtoolDlg* hDlg,CReadScanBaseThd* pThd)
{
	m_hDlg = hDlg;
	m_bAutoDelete = FALSE;	
	m_hEventKill = CreateEvent(NULL, TRUE, FALSE, NULL);
	m_hEventDead = CreateEvent(NULL, TRUE, FALSE, NULL);
	m_hWrite = CreateEvent(NULL, TRUE, FALSE, NULL);
	m_pScanThd = pThd;
	m_lMacroNum = 0;
}

CReplaceThd::~CReplaceThd()
{
	CloseHandle(m_hEventKill);
	CloseHandle(m_hEventDead);
	CloseHandle(m_hWrite);
}

BOOL CReplaceThd::InitInstance()
{
	// TODO:  perform and per-thread initialization here
	DWORD ret;
	HANDLE Handles[] = { m_hEventKill, 
		m_pScanThd->m_hEventReplace };
	FileLine tmpLine,preLine;
	BOOL bContinueLine = FALSE;
	
	for (;;)
	{
		ret = WaitForMultipleObjects(2, Handles, false, INFINITE);
		if (ret == WAIT_OBJECT_0 )	// End Task
		{
			VERIFY(SetEvent(m_hEventDead));
			break;
		}
		else if (ret == WAIT_OBJECT_0+1 ) // Receive start task Event
		{
			if (!theApp.m_originListMsg.IsEmpty())
			{
				theApp.m_CS.Lock();
				FileLine* fileLine = (FileLine*) theApp.m_originListMsg.GetHead();
				theApp.m_originListMsg.RemoveHead();
				tmpLine = *fileLine;
				delete fileLine;
				theApp.m_CS.Unlock();
				//处理续接行,主要为c程序做
				int curType =  m_hDlg->m_ctlPrgType.GetCurSel();
				if(bContinueLine && curType == 0)
				{
					char szLineBuf[4096];
					sprintf(szLineBuf,"%s%s",preLine.m_szLineBuf ,tmpLine.m_szLineBuf);
					strcpy(tmpLine.m_szLineBuf,szLineBuf);
					tmpLine.m_lLineNum = preLine.m_lLineNum;
				}
				if(tmpLine.m_bLineType == LTYPE_NORMAL && curType == 0)
				{
					if(IsContinueLine(tmpLine.m_szLineBuf))
					{
						preLine = tmpLine;
						bContinueLine = true;
						continue;
					}
					else
					{
						bContinueLine = false;
					}
				}
				FileLine* fileReplace = new FileLine();
				*fileReplace  = tmpLine;
				if(fileReplace->m_bLineType == LTYPE_END)
				{
					m_lMacroNum = 0;
				}
			//	TRACE("--a--%s--aa--",fileReplace->m_szLineBuf);
				if(fileReplace->m_bLineType == LTYPE_NORMAL)
				{
					Replace(fileReplace);
				}
				theApp.m_CS.Lock();
				theApp.m_fileList.AddTail(fileReplace); 
				theApp.m_CS.Unlock();
				SetEvent(m_hWrite); //发送写文件消息
			}
			else
			{
				ResetEvent(m_pScanThd->m_hEventReplace);
			}
		}
	}
	return TRUE;
}

int CReplaceThd::ExitInstance()
{
	// TODO:  perform any per-thread cleanup here
	return CWinThread::ExitInstance();
}

BEGIN_MESSAGE_MAP(CReplaceThd, CWinThread)
	//{{AFX_MSG_MAP(CReplaceThd)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CReplaceThd message handlers

void CReplaceThd::KillThread()
{
	VERIFY(SetEvent(m_hEventKill));
	
	// allow thread to run at higher priority during kill process
	SetThreadPriority(THREAD_PRIORITY_BELOW_NORMAL);
	WaitForSingleObject(m_hEventDead, 2000);
	WaitForSingleObject(m_hThread, 1000);
	delete this;
}

void CReplaceThd::Replace(FileLine* fileLine)
{
	
	if(strchr(fileLine->m_szLineBuf,'\"') == NULL)
		return;
	if(strstr(fileLine->m_szLineBuf,"#include")!=NULL)
		return;
	BOOL bChoose = true;
	BOOL bChinese = false;
	BOOL bChrFlag = false;
	char szNoteBuf[4096]; //自加注释缓冲
	char szLineBuf[4096]; //非替换的缓冲
	char szRepBuf[4096]; //替换后的缓冲
	char szMacro[4096]; //宏名缓冲
	char szStrBuf[4096]; //被替换的字符串缓冲
	char szMacroFunc[4096]; //宏函数
	memset(szNoteBuf,0,sizeof(szNoteBuf));
	szNoteBuf[0] = '/';
	szNoteBuf[1] = '/';
	memset(szLineBuf,0,sizeof(szLineBuf));
	memset(szRepBuf,0,sizeof(szRepBuf));
	memset(szMacro,0,sizeof(szMacro));
	memset(szStrBuf,0,sizeof(szStrBuf));
	memset(szMacroFunc,0,sizeof(szMacroFunc));
	int i=0; //行字符计数
	int iStr = 0;//被替换字符串缓冲计数
	int iLine = 0; //非替换缓冲计数

	for (;;) {
		if(bChrFlag)
		{
			if(fileLine->m_szLineBuf[i] > 128 || fileLine->m_szLineBuf[i] <0 )
				bChinese = true;
			szStrBuf[iStr++] = fileLine->m_szLineBuf[i];
		}
		else if((fileLine->m_szLineBuf[i] !='\"' && !bChrFlag) || \
			(fileLine->m_szLineBuf[i] =='\"' && !bChrFlag && (fileLine->m_szLineBuf[i-1] == '\\' || fileLine->m_szLineBuf[i-1] == '\'')))
		{
			szLineBuf[iLine++] = fileLine->m_szLineBuf[i];
		}
		
		if(fileLine->m_szLineBuf[i] =='\"' && !bChrFlag && fileLine->m_szLineBuf[i-1] != '\\' && fileLine->m_szLineBuf[i-1] != '\'' )
		{
			strcat(szRepBuf,szLineBuf);
			memset(szLineBuf,0,sizeof(szLineBuf));
			iStr = 0;
			iLine = 0;
			szStrBuf[iStr++] = fileLine->m_szLineBuf[i];
			bChrFlag = true;
			bChinese = false;
		}
		else if( (fileLine->m_szLineBuf[i] =='\"' && bChrFlag && (fileLine->m_szLineBuf[i-2] == '\\' && fileLine->m_szLineBuf[i-1] == '\\' ) ) || \
			 (fileLine->m_szLineBuf[i] =='\"' && bChrFlag && (fileLine->m_szLineBuf[i-1] != '\\' && \
			 fileLine->m_szLineBuf[i-2] != '\\')) || ( fileLine->m_szLineBuf[i] =='\"' && bChrFlag && fileLine->m_szLineBuf[i-1] != '\'' && fileLine->m_szLineBuf[i-1] != '\\'  ))
		{
			if(m_hDlg->m_bInclude)
			{
				if(bChinese)
					bChoose = true;
				else
					bChoose = false;
			}
			else
			{
				bChoose = true;
			}
			if(bChoose) //如果需要提取
			{
				int curType =  m_hDlg->m_ctlPrgType.GetCurSel();
				CString* strMacro = NULL;
				CString*  strStrBuf = NULL;
				CString* strTmp = NULL;
				CMacroObj* macroObj = NULL;
			//	szStrBuf[iStr++] = fileLine->m_szLineBuf[i];
				if(!theApp.m_strToMacroMap.Lookup(szStrBuf,(CObject *&)strMacro)) //没有找到相同的字串则使用已有宏
				{
					
					if(theApp.m_macroToStrMap.Lookup(fileLine->m_szClassName,(CObject *&)macroObj))
					{
						if(macroObj != NULL)
						{
							macroObj->m_lNum++;
							m_lMacroNum = macroObj->m_lNum;
						}
						sprintf(szMacro,"%s_%ld",fileLine->m_szClassName,m_lMacroNum);
					}
					else
					{
						m_lMacroNum++;
						sprintf(szMacro,"%s_%ld",fileLine->m_szClassName,m_lMacroNum);
						macroObj = new CMacroObj();
						macroObj->m_lNum =  m_lMacroNum;
						strcpy(macroObj->m_szMacroBase,fileLine->m_szClassName);
						theApp.m_macroToStrMap.SetAt(fileLine->m_szClassName,(CObject *)macroObj);
					}
					
					if(curType == 0)
					{
						sprintf(szMacroFunc,"%s(%s)",m_hDlg->m_szMacroName,szMacro);
					}
					else
					{
						sprintf(szMacroFunc,"%s(\"%s\")",m_hDlg->m_szMacroName,szMacro);
					}
					strMacro = new CString();
					*strMacro = szMacro;
					theApp.m_strToMacroMap.SetAt(szStrBuf,(CObject *)strMacro);	
					if(curType == 0)
					{
						m_hDlg->WriteCMac(szMacro,szStrBuf);
					}
					else
					{
						char szJavaStr[4096];
						TrimQuotation(szStrBuf,szJavaStr);
						m_hDlg->WriteJavaMac(szMacro,szJavaStr);
					}
				}
				else
				{
					if(curType == 0)
					{
						sprintf(szMacroFunc,"%s(%s)",m_hDlg->m_szMacroName,*strMacro);
					}
					else
					{
						sprintf(szMacroFunc,"%s(\"%s\")",m_hDlg->m_szMacroName,*strMacro);
					}
				}
				//自加注释
				strcat(szNoteBuf, szStrBuf);
				strcat(szNoteBuf, "  ");

				strcat(szRepBuf,szMacroFunc);
				
				m_hDlg->m_lReplaceNum++;
				CString szNrep;
				szNrep.Format("%ld",m_hDlg->m_lReplaceNum);
				m_hDlg->m_ctlReplaceNum.SetWindowText(szNrep);			
			}//end if(bChoose) //如果需要提取
			else
			{
				strcat(szRepBuf,szStrBuf);
			}

			memset(szStrBuf,0,sizeof(szStrBuf));
			bChrFlag = false;
			iStr = 0;
			iLine = 0;
		}

		if(fileLine->m_szLineBuf[i] =='\0')
			break;
		i++;
	}//end for(;;)
	if( iLine!=0 )
	{
		strcat(szRepBuf,szLineBuf);
	}
	strcpy( fileLine->m_szLineBuf, szRepBuf);
	if(strlen(szNoteBuf) >2) //如果自加注释为空则跳过
	{
		FileLine* noteLine = new FileLine();
		noteLine->m_bLineType = LTYPE_DEF_NOTE;
		noteLine->m_lLineNum = fileLine->m_lLineNum;
		strcpy(noteLine->m_szFileName, fileLine->m_szFileName);
		strcpy(noteLine->m_szLineBuf,szNoteBuf);
		theApp.m_CS.Lock();
		theApp.m_fileList.AddTail(noteLine); 
		theApp.m_CS.Unlock();
	}
	SetEvent(m_hWrite); //发送写文件消息
}

BOOL CReplaceThd::IsIgnorStr(char *szStr)
{
	BOOL bRet = false;
	if(szStr ==NULL)
		return true;
	if (strlen(szStr) == 0) {
		return true;
	}
	if(strcmp(szStr,"%%s") ==0 || strcmp(szStr,"\\") ==0)
		bRet = true;
	return bRet;
}

void CReplaceThd::TrimQuotation(char* szSrc, char *szDes)
{
	strcpy(szDes,szSrc + 1);
	int iLen = strlen(szSrc);
	szDes[iLen - 2] = 0;
}

// Function name	: CReplaceThd::IsContinueLine
// Description	    : 2005-7-6是需要续接的行
// Author			: fanduansheng
// Input			: 
// Output			: 
// Return type		: BOOL 
// Argument         : char *szLine--行的内容
BOOL CReplaceThd::IsContinueLine(char *szLine)
{
	BOOL bRet = false;
	BOOL bSlash = false;
	BOOL bFirst = false;
	BOOL bMatch = false;
	int iLen = strlen(szLine);
	int j = iLen;
	int p = iLen + 1;
	for(int i=iLen;i>=0;i--)
	{
		if(szLine[i] =='\0' || szLine[i]== 0x0a || szLine[i]== 0x0d)
		{
			j--;
			continue;
		}

		if(szLine[i] == '\\' && j== i )
		{
			p = i;
			bSlash = true;
		}
		if(i > 0)
		{
			if(szLine[i]== '"' && szLine[i-1]!= '\\' && bFirst == false)
			{
				bFirst = true;
				bMatch = false;
			}
			else if(bFirst && szLine[i]== '"' && szLine[i-1]!= '\\')
			{
				bMatch = true;
				bFirst = false;
			}
		}
		else 
		{
			if(szLine[i]== '"'  && bFirst == false)
			{
				bFirst = true;
				bMatch = false;
			}
			else if(bFirst && szLine[i]== '"')
			{
				bMatch = true;
				bFirst = false;
			}
		}
	}
	if(bSlash && !bMatch)
	{
		szLine[p] = 0;
		bRet = true;
	}
	return bRet;
}

⌨️ 快捷键说明

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