📄 readscanbasethd.cpp
字号:
// ReadScanBaseThd.cpp : implementation file
//
#include "stdafx.h"
#include "scanstringtool.h"
#include "ReadScanBaseThd.h"
#include "FileLine.h"
#include "ReplaceThd.h"
#include "WriteFileThd.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CReadScanBaseThd
IMPLEMENT_DYNAMIC(CReadScanBaseThd, CWinThread)
CReadScanBaseThd::CReadScanBaseThd(CScanstringtoolDlg* hDlg)
{
m_hDlg = hDlg;
m_bAutoDelete = FALSE;
m_bStopScan = FALSE;
m_hEventKill = CreateEvent(NULL, TRUE, FALSE, NULL);
m_hEventDead = CreateEvent(NULL, TRUE, FALSE, NULL);
m_hEventStart = CreateEvent(NULL, TRUE, FALSE, NULL);
m_hEventRead = CreateEvent(NULL, TRUE, FALSE, NULL);
m_hEventReplace = CreateEvent(NULL, TRUE, FALSE, NULL);
// SetEvent(m_hEventRead);
CReplaceThd* pReplaceThd = new CReplaceThd(m_hDlg,this);
CWriteFileThd* pWriteThd = new CWriteFileThd(pReplaceThd,this);
pWriteThd->CreateThread(); //启动写文件线程
pReplaceThd->CreateThread(); //启动扫描线程
m_pReplaceThd = (void*)pReplaceThd;
m_pWriteThd = pWriteThd;
}
CReadScanBaseThd::~CReadScanBaseThd()
{
CloseHandle(m_hEventDead);
CloseHandle(m_hEventKill);
CloseHandle(m_hEventStart);
CloseHandle(m_hEventRead);
CloseHandle(m_hEventReplace);
}
BOOL CReadScanBaseThd::InitInstance()
{
// TODO: perform and per-thread initialization here
DWORD ret;
HANDLE Handles[] = { m_hEventKill,
m_hEventStart };
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
{
m_hDlg->m_lFileNum = 1;
ReadFileList(m_hDlg->m_dir);
EndTask();
}
}
return TRUE;
}
int CReadScanBaseThd::ExitInstance()
{
// TODO: perform any per-thread cleanup here
return CWinThread::ExitInstance();
}
BEGIN_MESSAGE_MAP(CReadScanBaseThd, CWinThread)
//{{AFX_MSG_MAP(CReadScanBaseThd)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CReadScanBaseThd message handlers
void CReadScanBaseThd::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);
CWriteFileThd* pWriteThd = (CWriteFileThd*)m_pWriteThd;
if(pWriteThd !=NULL)
pWriteThd->KillThread();
CReplaceThd* pReplaceThd = (CReplaceThd*)m_pReplaceThd;
if(pReplaceThd !=NULL)
pReplaceThd->KillThread();
delete this;
}
// Function name : CReadScanBaseThd::ReadFileList
// Description : 2005-2-26读取文件到内存并做第一次扫描
// Author : fanduansheng
// Input :
// Output :
// Return type : long
// Argument : CString szSourceDir
long CReadScanBaseThd::ReadFileList(CString szSourceDir)
{
long lPackageSize = 0;
long ltempsize = 0;
CString szFileName;
szFileName.Empty();
HANDLE hFind;
WIN32_FIND_DATA fd;
CString szSource;
szSource.Empty();
if (szSourceDir.Right(1) != "\\")
szSourceDir += "\\" ;
szSource = szSourceDir + "*.*" ;
if ((hFind = ::FindFirstFile ((LPCSTR)szSource, &fd)) == INVALID_HANDLE_VALUE)
return lPackageSize;
/* Get the name of the directory's contents */
do
{
if(m_bStopScan) //结束扫描
break;
szFileName = (LPCTSTR) &fd.cFileName;
/* If content is a sub directory */
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if ( (szFileName != ".") && (szFileName != "..") ) //如果目录
{
if(m_hDlg == NULL)
break;
if(m_hDlg->m_bSubFolder)
ReadFileList(szSourceDir+szFileName);
}
}
else /* If content is a file */
{
if(!IsFileType(szFileName))
{
continue;
}
CString stmp= szSourceDir+ szFileName;
m_hDlg->m_ctlDsp.SetWindowText(stmp);
ScanFile(stmp);
CString szNfile;
szNfile.Format("%ld",m_hDlg->m_lFileNum);
m_hDlg->m_ctlFileNum.SetWindowText(szNfile);
m_hDlg->m_lFileNum++;
WaitForSingleObject(m_hEventRead,INFINITE);
}
lPackageSize += fd.nFileSizeLow;
} while (::FindNextFile (hFind, &fd));
::FindClose (hFind);
return lPackageSize;
}
// Function name : CReadScanBaseThd::ScanFile
// Description : 2005-2-26扫描一个文件把行归类,并分析出注释把文件读入到内存
// Author : fanduansheng
// Input :
// Output :
// Return type : void
// Argument : CString szFileName
void CReadScanBaseThd::ScanFile(CString szFileName)
{
ResetEvent(m_hEventRead);//扫描开始
long lFileLine = 0; //文件行
int iLineStatus = LTYPE_NORMAL; //行状态
char szBuff[4096]; //行缓冲
memset(szBuff,0,sizeof(szBuff));
int iStatusMachine = 0; //初始状态为原始无状态
FILE* fp = NULL;
fp = fopen(szFileName,"r");
if(fp == NULL)
{
//不扫描
return;
}
FileLine* startLine = new FileLine();
strcpy(startLine->m_szFileName ,szFileName);
startLine->m_bLineType = LTYPE_START;
theApp.m_CS.Lock();
theApp.m_originListMsg.AddTail(startLine);
theApp.m_CS.Unlock();
SetEvent(m_hEventReplace);
CString tmpFile = szFileName;
tmpFile.MakeLower();
BOOL bIsResource = (tmpFile.Find("resource.h") != -1);
if(bIsResource && theApp.m_lMacroValue == MAX_MARCO_VALUE)
{
theApp.m_lMacroValue = 1;
}
while(!feof(fp))
{
fgets(szBuff,sizeof(szBuff),fp);
if(feof(fp) && strchr(szBuff,0x0a)!=NULL)
break;
if(bIsResource)
{
long tmpLv=0;
char szTmp[4096];
sscanf(szBuff,"#define%s%ld",szTmp,&tmpLv);
if(tmpLv > theApp.m_lMacroValue)
theApp.m_lMacroValue = tmpLv;
}
lFileLine++;
//过虑注释
char szNoteBuff[4096]; //注释缓冲
memset(szNoteBuff,0,sizeof(szNoteBuff));
char szClassBuff[4096];//类名缓冲
memset(szClassBuff,0,sizeof(szClassBuff));
char szOtherBuff[4096]; //其他正常字符缓冲
memset(szOtherBuff,0,sizeof(szOtherBuff));
int i = 0; //行顺序计数
int iNote = 0;//注释字符计数
int iClass = 0;//类名注释
int iOther = 0; //正常字符缓冲
char cForward = '\0'; //前一字符缓冲
BOOL bBias = false;
int iQuote = 0;
GetLineClass(szFileName,szBuff,szClassBuff);
if(iLineStatus == LTYPE_NORMAL && \
(strstr(szBuff,"")==NULL || strstr(szBuff,"")==NULL) )
{
FileLine* normalLine = new FileLine();
strcpy(normalLine->m_szFileName ,szFileName);
strcpy(normalLine->m_szClassName, szClassBuff);
normalLine->m_bLineType = LTYPE_NORMAL;
normalLine->m_lLineNum = lFileLine;
strcpy(normalLine->m_szLineBuf, szBuff);
memset(szBuff,0,sizeof(szBuff));
theApp.m_CS.Lock();
theApp.m_originListMsg.AddTail(normalLine);
theApp.m_CS.Unlock();
SetEvent(m_hEventReplace);
continue;
}
while(true)
{
// char szTemp[4096];
if(iLineStatus == LTYPE_NOTE )
{
szNoteBuff[iNote++] = szBuff[i];
}
else
{
if(iQuote == 0 && szBuff[i] =='"')
{
iQuote = 1;
}
else if(iQuote == 1 && szBuff[i] =='"')
{
iQuote = 0;
}
//把多余的注释符号去掉
if(iOther != 0 )
{
if( (szOtherBuff[iOther - 1 ] == '/' && szBuff[i] == '*') || \
(szOtherBuff[iOther - 1 ] == '/' && szBuff[i] == '/') )
{
iOther--;
szOtherBuff[iOther] = 0;
}
else
{
szOtherBuff[iOther++] = szBuff[i];
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -