📄 fileex.cpp
字号:
fprintf(lpfile, "%s", bufLine);
fclose(file);
fclose(lpfile);
return TRUE;
}
if(str != "")
fprintf(lpfile, "%s", bufLine);
memset(bufLine, 0x0, sizeof(bufLine));
break; //至此一行内容解析完毕[不包含注释部分]
}
}
}
}
}
fclose(file);
fclose(lpfile);
//
return TRUE;
}
//内部方法[解析工程的文件列表]
BOOL CParseDelphiFile::ParseDelphiProj()
{
if(!RemoveProjFileNoteInfo()) return FALSE;
CFileEx lpfile;
try
{
lpfile.Open((LPCTSTR)m_strNoNotesFilename, CFile::modeRead);
}
catch(...)
{
return FALSE;
}
//
CStringList m_lstSentence; //存放工程中的所有句子
CString strSentence = ""; //句子临时空间
m_lstSentence.RemoveAll();
//
while(!lpfile.IsEof())
{
char ch;
lpfile.Read(&ch, 1);
//根据分号来做分隔符来读一个句子
if(ch == GLOBAL_PASSTR_SPECCHAR) //字符串有限考虑
{
while(!lpfile.IsEof())
{
strSentence += ch;
lpfile.Read(&ch, 1);
if(ch == GLOBAL_PASSTR_SPECCHAR) break;
}
}
//如果是分号则
else if(ch == ';')
{
//至此一个句子分析完毕
m_lstSentence.AddTail(strSentence);
strSentence.Empty();
}
//普通字符
else
strSentence += ch;
}
lpfile.Close();
::DeleteFile((LPCTSTR)m_strNoNotesFilename); //清除痕迹
/***********************从StringList中搜索出Uses部分内容*************************/
CStringList m_sltTmpList;
m_sltTmpList.RemoveAll();
POSITION pos = m_lstSentence.GetHeadPosition();
while(pos != NULL)
{
CString str = "";
str = m_lstSentence.GetNext(pos);
str += ',';
str.TrimLeft(); str.TrimRight();
str.MakeUpper();
int nIndex = str.Find((LPCTSTR)"USES");
if(nIndex == 0)
{
str = str.Right(str.GetLength() - 4);
str.TrimLeft();
while(str.GetLength() > 0)
{
nIndex = str.Find((TCHAR)',');
if(nIndex != -1)
{
m_sltTmpList.AddTail(str.Left(nIndex));
str = str.Right(str.GetLength() - nIndex -1);
str.TrimLeft();
}
}
}
}
m_lstSentence.RemoveAll();
//从格式串中解析出文件名
pos = m_sltTmpList.GetHeadPosition();
while(pos != NULL)
{
CString str = "";
str = m_sltTmpList.GetNext(pos);
str.MakeUpper();
int nIndex = str.Find((TCHAR)GLOBAL_PASSTR_SPECCHAR);
if(nIndex != -1)
{
str = str.Right(str.GetLength() - nIndex);
str.TrimLeft(); str.TrimRight();
str.Remove((TCHAR)GLOBAL_PASSTR_SPECCHAR);
m_sltHeadFiles.AddTail(str);
}
}
m_sltTmpList.RemoveAll();
/***********************************结束搜索*************************************/
return TRUE;
}
//解析文件内部类结构,并修改m_cilClassNames列表内容
BOOL CParseDelphiFile::ParseDelphiClass(char strPasFilename[MAX_PATH])
{
if(!RemovePasFileNoteInfo(strPasFilename)) return FALSE; //效率
CFileEx lpfile;
try
{
lpfile.Open((LPCTSTR)m_strNoNotesFilename, CFile::modeRead);
}
catch(...)
{
return FALSE;
}
//
CStringList m_lstSentence; //存放工程中的所有句子
CString strSentence = ""; //句子临时空间
m_lstSentence.RemoveAll();
BOOL bTypeStart = FALSE; //类型定义是否开始标志
//
while(!lpfile.IsEof())
{
char ch;
lpfile.Read(&ch, 1);
if(ch == '(')
{
strSentence += ch;
while(!lpfile.IsEof())
{
lpfile.Read(&ch, 1);
strSentence += ch;
if(ch == ')') break;
}
}
else if(ch == ';')
{
/********************至此一个句子分析完毕****************/
//如果该句子的前四个字符是type--类型定义开始标志,那么开始记录其中内容
//如果该句子的前三个字符是var---类型定义结束标志,那么结束记录
strSentence.TrimLeft();
if(strSentence.Left(4).CompareNoCase("type") == 0)
bTypeStart = TRUE;
else if(strSentence.Left(3).CompareNoCase("var") == 0)
break;
if(bTypeStart == TRUE)
m_lstSentence.AddTail(strSentence);
strSentence.Empty();
}
//普通字符
else
{
strSentence += ch;
}
}
lpfile.Close();
::DeleteFile((LPCTSTR)m_strNoNotesFilename); //清除痕迹
/*****************以下部分功能:找出类名列表/找出各个类的三种内部函数*****************/
POSITION pos = m_lstSentence.GetHeadPosition();
while(pos != NULL)
{
CString strSentence = m_lstSentence.GetNext(pos);
strSentence.Replace(10, ' ');
strSentence.Replace('\n', ' ');
CString strOld = strSentence;
strSentence.MakeLower();
//搜索类名
int nIndex = strSentence.Find("class");
if(nIndex != -1)
{
TCHAR chp = 0, chn = 0; //class标志符前后字符判断
int np = nIndex - 1;
TCHAR ch = strSentence.GetAt(np);
while(ch == ' ')
{
--np; ch = strSentence.GetAt(np);
}
chp = ch;
int nn = nIndex + 5;
ch = strSentence.GetAt(nn);
while(ch == ' ')
{
++nn; ch = strSentence.GetAt(nn);
}
chn = ch;
if(chp == '=' && chn == '(') //如果符合一个类名位置关系
{
CString strClassname = "",
str = strOld.Left(np - 1);
str.TrimRight();
int nCount = str.GetLength() - 1;
while(nCount >= 0 && (ch = str.GetAt(nCount)) != ' ')
{
strClassname.Insert(0, ch);
--nCount;
}
if(strClassname.CompareNoCase("") != 0)
{
LPCLASSANDFILEREL lpitem;
lpitem = (LPCLASSANDFILEREL)malloc(sizeof(CLASSANDFILEREL));
memset(lpitem, 0x0, sizeof(lpitem));
lpitem->nFuncCounts = 0;
lstrcpy(lpitem->strClassName, strClassname.GetBuffer(0));
lstrcpy(lpitem->strFileName, strPasFilename);
/*********************以后留做扩展[解析类内部函数]*********************/
//如果class标志行句子中包含有过程或函数定义[特殊情况]
//所以用do...while结构,至少执行一次
//标志当前解析部分所在的位置(public/private/protected)
_CLASSFUNSTYPE cftCurPartType = CLS_FUNS_PUBLIC;
do //循环解析var以前的句子内容
{
int ifunc = 0; BOOL bisfunc = FALSE; //过程和函数区分标志
ifunc = strSentence.Find("function");
if(ifunc != -1)
{
if(ifunc == 0) bisfunc = TRUE;
else
{
chp = strSentence.GetAt((ifunc > 0) ? ifunc - 1:ifunc);
chn = strSentence.GetAt(ifunc + strlen("function"));
if((chp == ' ' || chp == ';') &&
(chn == ' ' || chn == ';'))
//该标志符为函数标志符
bisfunc = TRUE;
}
}
else
{
ifunc = strSentence.Find("procedure");
if(ifunc != -1)
{
if(ifunc == 0) bisfunc = FALSE;
else
{
chp = strSentence.GetAt(ifunc - 1);
chn = strSentence.GetAt(ifunc + strlen("procedure"));
if((chp == ' ' || chp == ';') &&
(chn == ' ' || chn == ';'))
//该标志符为函数标志符
bisfunc = FALSE;
}
}
}
//解析内部函数列表
if(ifunc != -1)
{
//解析一个函数/过程名
CString str = "";
for(int i = ifunc + (bisfunc ? strlen("function"):strlen("procedure")); i < strSentence.GetLength(); ++i)
{
ch = strOld.GetAt(i);
if(ch != '(') str += ch; else break;
}
str.TrimLeft(); str.TrimRight();
LPCLASSFUNSSTRUCT lpfunclst;
lpfunclst = (LPCLASSFUNSSTRUCT)malloc(sizeof(CLASSFUNSSTRUCT));
memset(lpfunclst, 0x0, sizeof(lpfunclst));
lstrcpy(lpfunclst->strFunctionName, str.GetBuffer(0));
lpfunclst->cfType = cftCurPartType;
if(bisfunc == TRUE) //如果为function
lpfunclst->ftType = FT_FUNCTION;
else //如果为procedure
lpfunclst->ftType = FT_PROCEDURE;
lpitem->cfaClassFunsArray[lpitem->nFuncCounts++] = lpfunclst;
}
//下一个成员函数/过程的搜索
strSentence = m_lstSentence.GetNext(pos);
strOld = strSentence;
strSentence.MakeLower();
//是否到类结束部分
if(strSentence.Compare((LPCTSTR)"end") == 0) break;
//确定下一个函数所在的部分类型(cftCurPartType)
BOOL bHaveAType = FALSE; //临时标志位
int nTypeFlagPos = strSentence.Find("private");
if(bHaveAType == FALSE)
{
if(nTypeFlagPos != -1)
{
if(nTypeFlagPos == 0)
{
cftCurPartType = CLS_FUNS_PRIVATE;
bHaveAType = TRUE;
}
else
{
chp = strSentence.GetAt(nTypeFlagPos - 1);
chn = strSentence.GetAt(nTypeFlagPos + strlen("private"));
if((chp == ' ' || chp == ';') &&
(chn == ' ' || chn == ';'))
{
cftCurPartType = CLS_FUNS_PRIVATE;
bHaveAType = TRUE;
}
}
}
}
nTypeFlagPos = strSentence.Find("protected");
if(bHaveAType == FALSE)
{
if(nTypeFlagPos != -1)
{
if(nTypeFlagPos == 0)
{
cftCurPartType = CLS_FUNS_PROTECTED;
bHaveAType = TRUE;
}
else
{
chp = strSentence.GetAt((nTypeFlagPos > 0) ? nTypeFlagPos - 1:nTypeFlagPos);
chn = strSentence.GetAt(nTypeFlagPos + strlen("protected"));
if((chp == ' ' || chp == ';') &&
(chn == ' ' || chn == ';'))
{
cftCurPartType = CLS_FUNS_PROTECTED;
bHaveAType = TRUE;
}
}
}
}
nTypeFlagPos = strSentence.Find("public");
if(bHaveAType == FALSE)
{
if(nTypeFlagPos != -1)
{
if(nTypeFlagPos == 0)
{
cftCurPartType = CLS_FUNS_PUBLIC;
bHaveAType = TRUE;
}
else
{
chp = strSentence.GetAt((nTypeFlagPos > 0) ? nTypeFlagPos - 1:nTypeFlagPos);
chn = strSentence.GetAt(nTypeFlagPos + strlen("public"));
if((chp == ' ' || chp == ';') &&
(chn == ' ' || chn == ';'))
{
cftCurPartType = CLS_FUNS_PUBLIC;
bHaveAType = TRUE;
}
}
}
}
}
while(pos != NULL);
//一个类解析完毕
m_cilClassNames.AddTail(lpitem);
}
}
}
}
/****************************************结束****************************************/
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -