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

📄 cpp_parser.cpp

📁 一个统计文件大小和程序信息的插件程序(vc或vc.net下使用)
💻 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 + -