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

📄 textparse.cpp

📁 vc座的资源管理器源代码
💻 CPP
字号:
//*******************************************************************************
// COPYRIGHT NOTES
// ---------------
// You may use this source code, compile or redistribute it as part of your application 
// for free. You cannot redistribute it as a part of a software development 
// library without the agreement of the author. If the sources are 
// distributed along with the application, you should leave the original 
// copyright notes in the source code without any changes.
// This code can be used WITHOUT ANY WARRANTIES at your own risk.
// 
// For the latest updates to this code, check this site:
// http://www.masmex.com 
// after Sept 2000
// 
// Copyright(C) 2000 Philip Oldaker <email: philip@masmex.com>
//*******************************************************************************

#include "stdafx.h"
#include "TextParse.h"

CTextParse::CTextParse()
{
	m_szBuffer[0] = '\0';
	m_pStartLine = m_szBuffer;
	m_pLine = m_szBuffer;
	m_pSavePos = m_szBuffer;
}

CTextParse::CTextParse(LPCTSTR pszLine)
{
	m_szBuffer[0] = '\0';
	Set(pszLine);
}

CTextParse::~CTextParse()
{
}

CTextParse::CTextParse(const CTextParse &tp)
{
	m_pLine = tp.m_pLine;
	m_pStartLine = tp.m_pStartLine;
	m_pSavePos = tp.m_pSavePos;
	m_szCopyBuf[0] = '\0';
	m_szBuffer[0] = '\0';
	_tcscpy(m_szCopyBuf,tp.m_szCopyBuf);
	_tcscpy(m_szBuffer,tp.m_szBuffer);
}

const CTextParse& CTextParse::operator=(LPCTSTR lpsz)
{
	Set(lpsz);
	m_szCopyBuf[0] = '\0';
	m_szBuffer[0] = '\0';
	return *this;
}

const CTextParse& CTextParse::operator=(const CTextParse &tp)
{
	if (*this == tp)
		return *this;
	m_pLine = tp.m_pLine;
	m_pStartLine = tp.m_pStartLine;
	m_pSavePos = tp.m_pSavePos;
	_tcscpy(m_szCopyBuf,tp.m_szCopyBuf);
	_tcscpy(m_szBuffer,tp.m_szBuffer);
	return *this;
}

BOOL CTextParse::CharExistFromCurPos(int c,BOOL bForward)
{
	LPCTSTR p = m_pLine;
	if (bForward) 
	{
		while (*p && *p != c)
			   p = _tcsinc(p);
	}
	else
	{
		while (p > m_pStartLine && *p != c)
			   p = _tcsdec(m_pLine,p);
	}
	return *p == c;
}

BOOL CTextParse::ValidCppCharExist(int c,BOOL bForward)
{
	LPCTSTR p = m_pLine;
	while (*p && *p != c && *p != '/')
		   p = _tcsinc(p);
	return *p == c;
}

BOOL CTextParse::CharExist(LPCTSTR str)
{
	LPCTSTR p = m_pStartLine;
	while (*p && !IsToken(str,p))
		   p = _tcsinc(p);
	return *p != '\0';
}

BOOL CTextParse::FindString(LPCTSTR str)
{
	LPCTSTR p = _tcsstr(m_pLine,str);
	if (p)
		m_pLine = p;
	return p ? TRUE : FALSE;
}

BOOL CTextParse::FindChar(int c)
{
	LPCTSTR p = _tcschr(m_pLine,c);
	if (p)
		m_pLine = p;
	return p ? TRUE : FALSE;
}

BOOL CTextParse::MoveUntilChar(int c,BOOL bForward)
{
	if (bForward) 
	{
		while(*m_pLine && *m_pLine != c)
			   m_pLine = _tcsinc(m_pLine);
		return *m_pLine != '\0';
	}
	else 
	{
		while(m_pLine > m_pStartLine && *m_pLine != c)
			   m_pLine = _tcsdec(m_pStartLine,m_pLine);
		return *m_pLine == c;
	}
}

BOOL CTextParse::MoveUntilChar(LPCTSTR strTok,BOOL bForward)
{
	if (bForward) 
	{
		while(*m_pLine && !IsToken(strTok,m_pLine))
			   m_pLine = _tcsinc(m_pLine);
		return *m_pLine != '\0';
	}
	else 
	{
		while(m_pLine > m_pStartLine && !IsToken(strTok,m_pLine))
			   m_pLine = _tcsdec(m_pStartLine,m_pLine);
		return IsToken(strTok,m_pLine);
	}
}

BOOL CTextParse::MoveUntilString(LPCTSTR str,BOOL bForward)
{
	if (bForward) 
	{
		while(*m_pLine && !IsString(str))
			   m_pLine = _tcsinc(m_pLine);
		return *m_pLine != '\0';
	}
	else
	{
		while(m_pLine > m_pStartLine && !IsString(str))
			   m_pLine = _tcsdec(m_pStartLine,m_pLine);
		return IsString(str);
	}
}

BOOL CTextParse::MoveWhileChar(int c,BOOL bForward)
{
	if (bForward) 
	{
		while(*m_pLine && *m_pLine == c)
			   m_pLine = _tcsinc(m_pLine);
		return *m_pLine != '\0';
	}
	else
	{
		while(m_pLine > m_pStartLine && *m_pLine == c)
			   m_pLine = _tcsdec(m_pStartLine,m_pLine);
		return *m_pLine == c;
	}
}

BOOL CTextParse::MoveWhileChar(LPCTSTR strTok,BOOL bForward)
{
	if (bForward) 
	{
		while(*m_pLine && IsToken(strTok,m_pLine))
			   m_pLine = _tcsinc(m_pLine);
		return *m_pLine != '\0';
	}
	else
	{
		while(m_pLine > m_pStartLine && IsToken(strTok,m_pLine))
			   m_pLine = _tcsdec(m_pStartLine,m_pLine);
		return IsToken(strTok,m_pLine);
	}
}

LPCTSTR CTextParse::CopyWhileChar(int c)
{
	for(int i=0;i < MAX_BUF && *m_pLine != '\0' && *m_pLine == c;i++)
	{
		m_szCopyBuf[i] = *m_pLine;
		m_pLine = _tcsinc(m_pLine);
	}
	m_szCopyBuf[i] = '\0';
	return m_szCopyBuf;
}

LPCTSTR CTextParse::CopyUntilString(LPCTSTR pszText)
{
	int nLen = _tcslen(pszText);
	for(int i=0;i < MAX_BUF && *m_pLine != '\0' && _tcsncmp(m_pLine,pszText,nLen) != 0;i++)
	{
		m_szCopyBuf[i] = *m_pLine;
		m_pLine = _tcsinc(m_pLine);
	}
	m_szCopyBuf[i] = '\0';
	return m_szCopyBuf;
}

LPCTSTR CTextParse::CopyUntilChar(int c)
{
	for(int i=0;i < MAX_BUF && *m_pLine != '\0' && *m_pLine != c;i++)
	{
		m_szCopyBuf[i] = *m_pLine;
		m_pLine = _tcsinc(m_pLine);
	}
	m_szCopyBuf[i] = '\0';
	return m_szCopyBuf;
}

LPCTSTR CTextParse::CopyWhileChar(LPCTSTR strTok)
{
	for(int i=0;i < MAX_BUF && *m_pLine != '\0' && IsToken(strTok,m_pLine);i++)
	{
		m_szCopyBuf[i] = *m_pLine;
		m_pLine = _tcsinc(m_pLine);
	}
	m_szCopyBuf[i] = '\0';
	return m_szCopyBuf;
}

LPCTSTR CTextParse::CopyUntilChar(LPCTSTR strTok)
{
	for(int i=0;i < MAX_BUF && *m_pLine != '\0' && !IsToken(strTok,m_pLine);i++)
	{
		m_szCopyBuf[i] = *m_pLine;
		m_pLine = _tcsinc(m_pLine);
	}
	m_szCopyBuf[i] = '\0';
	return m_szCopyBuf;
}

LPCTSTR CTextParse::CopyFuncUntilChar(LPCTSTR strTok)
{
	for(int i=0;i < MAX_BUF && !IsEnd() && !IsToken(strTok,m_pLine);i++) 
	{
/*		if (*m_pLine == '=') {
			MoveUntilChar(",)");
			if (m_szCopyBuf[i-1] == ' ') {
				i--;
			}
		}*/
		if (CharAtCurrent('/')) 
		{
			MoveForward();
			MoveUntilChar(_T("/"));
			if (m_szCopyBuf[i-1] == ' ') 
			{
				i--;
			    MoveForward();
			}
		}
		m_szCopyBuf[i] = *m_pLine;
		MoveForward();
	}
	m_szCopyBuf[i] = '\0';
	return m_szCopyBuf;
}

BOOL CTextParse::IsToken(LPCTSTR strTok,LPCTSTR p)
{
	while(*strTok) 
	{
		  if (*p == *strTok)
			  break;
		   strTok = _tcsinc(strTok);
	}
	return *strTok != '\0';
}

LPCTSTR CTextParse::ExtractConstructor()
{
	MoveUntilChar('(');
	CopyUntilChar(')');
	_tcscat(m_szCopyBuf,_T(")"));
	return m_szCopyBuf;
}

LPCTSTR CTextParse::ExtractDeclareMacro()
{
	return CopyUntilChar('(');
}

LPCTSTR CTextParse::ExtractFuncName()
{
	Reset();
	// skip keywords
	if (_tcsncmp(m_pLine,_T("const"),5) == 0 || _tcsncmp(m_pLine,_T("afx_msg"),7) == 0 || _tcsncmp(m_pLine,_T("virtual"),7) == 0) 
	{
		CopyUntilWhiteSpace();
		MoveWhileWhiteSpace();
	}
	MoveUntilChar(_T("("));
	MoveUntilWhiteSpace(FALSE);
	if (*m_pLine == CPP_SPACE) // regular function
		MoveWhileWhiteSpace();
	else
	{ // else constructor or destructor
		// allow for virtual destructors
		if (_tcsncmp(m_pLine,_T("virtual"),7) == 0)
		{
			CopyUntilWhiteSpace();
			MoveWhileWhiteSpace();
		}
		Reset();
	}
	// returning pointer or reference
	if (*m_pLine == '*' || *m_pLine == '&')
	   m_pLine = _tcsinc(m_pLine);
	return CopyUntilChar('(');	
}

LPCTSTR CTextParse::ExtractClassName()
{
	MoveWhileWhiteSpace();
	if (_tcsncmp(m_pLine,_T("class"),5) != 0)
	{
		m_szCopyBuf[0] = 0;
		return m_szCopyBuf;
	}
	Reset();
	// check if derived class
	if (!CharExistFromCurPos(':'))
	{
		if (!CharExistFromCurPos('{'))
		{
			MoveToLastChar();
			MoveWhileWhiteSpace(FALSE);
			MoveUntilWhiteSpace(FALSE);
			MoveWhileWhiteSpace();
		}
		else
		{
			MoveUntilChar('{');
			MoveUntilWhiteSpace(FALSE);
			MoveWhileWhiteSpace(FALSE);			
			MoveUntilWhiteSpace(FALSE);
			MoveWhileWhiteSpace();			
		}
	}
	else
	{
		MoveUntilChar(':');
		// go back and skip colon
		MoveUntilWhiteSpace(FALSE);
		MoveWhileWhiteSpace(FALSE);
		if (CharAtCurrent('>'))
		{
			MoveUntilChar('<',FALSE);
			MoveUntilWhiteSpace(FALSE);
			MoveWhileWhiteSpace(FALSE);
		}
		MoveUntilWhiteSpace(FALSE);
		MoveWhileWhiteSpace();
	}
	return CopyUntilChar(_T(" \t<"));	
}

LPCTSTR CTextParse::ExtractBaseClassName()
{
	Reset();
	MoveWhileWhiteSpace();
	if (_tcsncmp(m_pLine,_T("class"),5) != 0)
	{
		m_szCopyBuf[0] = 0;
		return m_szCopyBuf;
	}
	Reset();
	// check if derived class
	if (CharExistFromCurPos(':'))
	{
		MoveUntilChar(':');
		// go back
		MoveWhileChar(':');		
		MoveWhileWhiteSpace();
		MoveUntilWhiteSpace();
		MoveWhileWhiteSpace();
	}
	else
	{
		m_szCopyBuf[0] = 0;
		return m_szCopyBuf;
	}
	return CopyUntilChar(_T(" \t<"));	
}

BOOL CTextParse::IsCommentBlock(LPCTSTR strStart,LPCTSTR strEnd)
{
	LPCTSTR p = _tcsstr(m_pLine,strStart);
	if (p)
	{
		if (p == m_pStartLine && *(p+sizeof(TCHAR)*2) == '+')
			return FALSE;
		if (p == m_pStartLine || (p != m_pStartLine && *(p-sizeof(TCHAR)) != '/') ) 
		{
			if (_tcsstr(m_pLine,strEnd) == NULL)
				return TRUE;
		}
	}
	return FALSE;
}

LPCTSTR CTextParse::CopyWholeWord()
{
	bool bQuote=false;
	for(int i=0;i < MAX_BUF && *m_pLine != '\0';i++) 
	{
		if (*m_pLine == '"') 
		{
			bQuote = !bQuote;
		}
		else if (*m_pLine == ' ' && bQuote == false)
		{
			break;
		}
		m_szCopyBuf[i] = *m_pLine;
		m_pLine = _tcsinc(m_pLine);
	}
	SkipWhiteSpace();
	m_szCopyBuf[i] = '\0';
	return m_szCopyBuf;
}

LPCTSTR CTextParse::CopyUntilEnd()
{
	for(int i=0;i < MAX_BUF && *m_pLine != '\0';i++) 
	{
		m_szCopyBuf[i] = *m_pLine;
		m_pLine = _tcsinc(m_pLine);
	}
	m_szCopyBuf[i] = '\0';
	return m_szCopyBuf;
}

bool CTextParse::FindWholeWord(LPCTSTR pszText)
{
	bool bQuote = _tcsstr(pszText,_T("\"")) != NULL;
	if (*pszText == '+' || *pszText == '-')
		pszText = _tcsinc(pszText);
	int nLen = _tcslen(pszText);
	int nRet=-1;
	for(int i=0;i < MAX_BUF && *m_pLine != '\0';i++) 
	{
		SkipWhiteSpace();
		if (*m_pLine == '"')
		{
			if (bQuote == true) 
			{
				nRet = _tcsncmp(m_pLine,pszText,nLen);
				if (nRet == 0)
					break;
			}
			MoveWhileChar('"');
			MoveUntilChar('"');
			MoveWhileChar('"');
		}
		else
		{
			nRet = _tcsncmp(m_pLine,pszText,GetWordLen());
			if (nRet == 0)
				break;
			SkipWord();
		}
	}
	return nRet == 0;
}

int CTextParse::GetWordLen()
{
	LPCTSTR p = m_pLine;
	for (int i=0;*p && !IsToken(CPP_WHITE_SPACE,p);i++)
	{
		p++;
	}
	return i;
}

bool CTextParse::SkipHTMLCommand(bool bSkipCRLF)
{
	if (CharAtCurrent('&'))
	{
		MoveUntilChar(';');
		if (CharAtCurrent(';'))
			MoveForward();
		return true;
	}
	LPCTSTR p = m_pLine;
	if (bSkipCRLF)
	{
		while (*p == '\r' || *p == '\n')
			p = _tcsinc(p);
	}
	if (*p != '<')
		return false;
	while (*p != '>' && *p != '\0')
			p = _tcsinc(p);
	if (*p == '>')
		p = _tcsinc(p);
	m_pLine = p;
	return true;
}

void CTextParse::SkipHTMLCommands(bool bSkipCRLF)
{
	while (SkipHTMLCommand(bSkipCRLF))
		;
}

BOOL CTextParse::IsValidCPP(LPCTSTR pszText)
{
	BOOL bRet=FALSE;
	if (FindString(pszText))
	{
		// check if a comment
		SaveCurPos();
		if (!MoveUntilString(_T("//"),FALSE))
		{
			RestorePos();
			if (!MoveUntilString(_T("/*"),FALSE))
				bRet = TRUE;
		}
	}
	Reset();
	return bRet;
}

BOOL CTextParse::IsPrivate()
{
	return IsValidCPP(_T("private"));
}

BOOL CTextParse::IsPublic()
{
	return IsValidCPP(_T("public"));
}

BOOL CTextParse::IsProtected()
{
	return IsValidCPP(_T("protected"));
}

BOOL CTextParse::IsVirtualFunc()
{
	return IsValidCPP(_T("virtual"));
}

BOOL CTextParse::IsStartBrace()
{
	return IsValidCPP(_T("{"));
}

BOOL CTextParse::IsEndBrace()
{
	return IsValidCPP(_T("}"));
}

BOOL CTextParse::IsAccessSpecifier()
{
	return IsValidCPP(_T(":"));
}

BOOL CTextParse::IsConstructor(LPCTSTR pszClassName)
{
	CString sTest(pszClassName);
	sTest += _T("(");
	if (FindChar('~'))
	{
		Reset();
		return FALSE;
	}
	return IsValidCPP(sTest);
}

BOOL CTextParse::IsMsgMap()
{
	return FindString(_T("{{AFX_MSG"));
}

BOOL CTextParse::IsDeclareMacro()
{
	BOOL bRet = FALSE;
	if (IsValidCPP(_T("DECLARE_")))
	{
		if (!FindString(_T("()")))
			bRet = TRUE;
		Reset();
	}
	return bRet;
}

BOOL CTextParse::IsStartCommentBlock()
{
	if (!FindString(_T("//")))
		return FindString(_T("/*"));
	return FALSE;
}

BOOL CTextParse::IsEndCommentBlock()
{
	return FindString(_T("*/"));
}

BOOL CTextParse::IsClass()
{
	BOOL bRet=TRUE;
	if (FindString(_T("template")))
	{
		bRet = FALSE;
	}
	if (!StringAtCurrent(_T("class ")))
	{
		bRet = FALSE;
	}
	Reset();
	// any line comments before 'class '
	MoveUntilString(_T("class "));
	if (MoveUntilString(_T("//"),FALSE))
	{
		bRet = FALSE;		
	}
	Reset();
	if (FindChar(_T(';')))
	{
		bRet = FALSE;
	}
	if (FindChar(_T('#')))
	{
		bRet = FALSE;
	}
	Reset();
	return bRet;
}

BOOL CTextParse::ExtractArgs(CString &sRet,CStringArray &asArgs)
{
	asArgs.RemoveAll();
	SaveCurPos();
	if (!CharAtCurrent('(') && FindChar('('))
	{
		RestorePos();
		SkipWhiteSpace();
		if (StringAtCurrent(_T("const")))
		{
			MoveUntilWhiteSpace();			
			SkipWhiteSpace();
		}
		sRet = CopyUntilWhiteSpace();
		if (MoveUntilChar('('))
		{
			MoveForward();
		}
		else
		{
			RestorePos();
		}
	}
	while (!CharAtCurrent(')') && !IsEnd())
	{
		SkipWhiteSpace();
		if (StringAtCurrent(_T("const")))
		{
			MoveUntilWhiteSpace();			
			SkipWhiteSpace();
		}
		MoveUntilWhiteSpace();
		SkipWhiteSpace();
		if (StringAtCurrent(_T("void")))
			break;
		if (CharAtCurrent('*') || CharAtCurrent('&'))
			MoveForward();
		asArgs.Add(CopyUntilChar(_T(",)\t ")));
		if (CharAtCurrent(','))
			MoveForward();
		else
			SkipWhiteSpace();
	}
	return TRUE;
}

LPCTSTR CTextParse::ExtractHTMLText(bool bRemoveCRLF)
{
	return ExtractHTMLText(_T("<"),bRemoveCRLF);
}

LPCTSTR CTextParse::ExtractHTMLText(LPCTSTR pszUntil,bool bRemoveCRLF)
{
	int nLen=_tcslen(pszUntil);
	int i=0;
	bool bEnd = false;
	while(i < MAX_BUF && *m_pLine != '\0' && _tcsncmp(m_pLine,pszUntil,nLen) != 0)
	{
		if (*m_pLine == '<' || *m_pLine == '&')
		{
			while (SkipHTMLCommand(false))
			{
				if (_tcsncmp(m_pLine,pszUntil,nLen) == 0)
				{
					bEnd = true;
					break;
				}
			}
		}
		if (bEnd)
			break;
		if (bRemoveCRLF && (*m_pLine == '\n' || *m_pLine == '\r'))
		{
			m_pLine = _tcsinc(m_pLine);
		}
		else
		{
			m_szCopyBuf[i++] = *m_pLine;
			m_pLine = _tcsinc(m_pLine);
		}
	}
	m_szCopyBuf[i] = '\0';
	return m_szCopyBuf;
}

LPCTSTR CTextParse::ExtractHTMLLink()
{
	m_szCopyBuf[0] = '\0';
	if (!FindString(_T("href=")))
		return m_szCopyBuf;
	MoveUntilChar('"');
	LPCTSTR p = m_pLine;
	if (*p == '"')
	{
		p = _tcsinc(p);
		m_pLine = p;
		LPCTSTR pRet = CopyUntilChar('"');
		MoveUntilChar('>');
		MoveWhileChar('>');
		return pRet;
	}
	return m_szCopyBuf;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -