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