📄 cpp_parser.cpp
字号:
/***************************************************************************/
/* NOTE: */
/* This document is copyright (c) by Oz Solomonovich, and is bound by the */
/* MIT open source license (www.opensource.org/licenses/mit-license.html). */
/* See License.txt for more information. */
/***************************************************************************/
#include "stdafx.h"
#include "Resource.h"
#include "CPP_Parser.h"
#include "config.h"
void CCParser::ParseFile(ifstream& ifs, CFileInfo& info)
{
char buf[10240];
bool bInComment = false, bHasCode, bHasComments;
while (!ifs.eof() && ifs.good())
{
ifs.getline(buf, countof(buf));
ParseLine(buf, bInComment, bHasCode, bHasComments);
if (bHasComments)
{
++info.m_iLinesWithComments;
}
if (bHasCode)
{
++info.m_iLinesWithCode;
}
if (!bHasCode && !bHasComments)
{
if (cfg_bProcessBlanks)
{
++info.m_iBlankLines;
}
else
{
++info.m_iLinesWithCode;
}
}
++info.m_iTotalLines;
}
info.m_stat = CFileInfo::full;
}
#define IS_PAIR(A, B) (ch == #@A && chNext == #@B)
void CCParser::ParseLine(
CString sLine,
/* in out */ bool& bMultiLineComment,
/* out */ bool& bHasCode,
/* out */ bool& bHasComments)
{
// state flags
bool bInString = false;
bool bInTwoPairSequence = false;
bHasComments = bMultiLineComment;
bHasCode = false;
const int len = sLine.GetLength();
for (int i = 0; i < len; ++i)
{
unsigned char ch = sLine[i];
unsigned char chNext = i < (len - 1)? sLine[i + 1] : 0;
// a // type comment - ignore rest of line
if (IS_PAIR(/, /) && !bMultiLineComment && !bInString &&
cfg_bProcessComments)
{
bHasComments = true;
return;
}
// start of /* comment
else if (IS_PAIR(/, *) && !bInString && cfg_bProcessComments)
{
bMultiLineComment = true;
bHasComments = true;
++i;
}
// end of /* comment (
else if (IS_PAIR(*, /) && !bInString && cfg_bProcessComments)
{
bMultiLineComment = false;
++i;
}
else if (ch == '\\' && !bMultiLineComment)
{
// escape character - so skip next char
++i;
bHasCode = true;
}
else if (ch == '"' && !bMultiLineComment)
{
bInString = !bInString;
bHasCode = true;
}
else if (!bMultiLineComment)
{
if (!isspace(ch))
{
bHasCode = true;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -