📄 cppdyer.cpp
字号:
// CppDyer.cpp: implementation of the CppDyer class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include <windows.h>
#include "CppDyer.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
static const int MAX_BUFFER_SIZE=32*1024;
using namespace std;
using namespace CppParser;
void CppDyer::getBaseSettings(string iniFileName)
{
string tagNames[]={"GLOBAL","PPKEYWORD","KEYWORD","IDENTIFIER","WHITESPACE","LINEFEED","DELIMITER","OPERATOR",
"SINGLELINECOMMENT","STRINGLITERAL","CHARLITERAL","DECNUMBERLITERAL","HEXNUMBERLITERAL","OCTNUMBERLITERAL",
"FLOATNUMBERLITERAL","BLOCKCOMMENT"};
int tagIDs[]={INVALID,PPKEYWORD,KEYWORD,IDENTIFIER,WHITESPACE,LINEFEED,DELIMITER,OPERATOR,
SINGLELINECOMMENT,STRINGLITERAL,CHARLITERAL,DECNUMBERLITERAL,HEXNUMBERLITERAL,OCTNUMBERLITERAL,
FLOATNUMBERLITERAL,BLOCKCOMMENT};
char s[MAX_BUFFER_SIZE];
for(int i=0;i<sizeof(tagIDs)/sizeof(*tagIDs);++i)
{
if(GetPrivateProfileString("settings",(tagNames[i]+"_prefix").c_str(),"",s,MAX_BUFFER_SIZE,iniFileName.c_str())!=0)
{
if(s[0])
{
mPrefix[tagIDs[i]]=s;
}
}
if(GetPrivateProfileString("settings",(tagNames[i]+"_suffix").c_str(),"",s,MAX_BUFFER_SIZE,iniFileName.c_str())!=0)
{
if(s[0])
{
mSuffix[tagIDs[i]]=s;
}
}
}
if(GetPrivateProfileString("settings","line_number_chars","0",s,MAX_BUFFER_SIZE,iniFileName.c_str())!=0)
{
mLineNumberChars=atoi(s);
if(mLineNumberChars<0)
mLineNumberChars=0;
}
if(GetPrivateProfileString("settings","line_number_indent","8",s,MAX_BUFFER_SIZE,iniFileName.c_str())!=0)
{
mLineNumberIndent=atoi(s);
if(mLineNumberIndent<mLineNumberChars)
{
mLineNumberChars=mLineNumberChars+4;
}
}
if(GetPrivateProfileString("settings","line_number_prefix","",s,MAX_BUFFER_SIZE,iniFileName.c_str())!=0)
{
mLineNumberPrefix=s;
}
if(GetPrivateProfileString("settings","line_number_suffix","",s,MAX_BUFFER_SIZE,iniFileName.c_str())!=0)
{
mLineNumberSuffix=s;
}
if(GetPrivateProfileString("settings","tab_spaces","4",s,MAX_BUFFER_SIZE,iniFileName.c_str())!=0)
{
mTabSpaces=atoi(s);
if(mTabSpaces<1)
mTabSpaces=1;
}
if(GetPrivateProfileSection("extra_keyword",s,MAX_BUFFER_SIZE,iniFileName.c_str())!=0)
{
char* p=s;
while(p[0])
{
mExtraKeywords.insert(p);
p+=strlen(p)+1;
}
}
}
void CppDyer::getSpecialSettings(string iniFileName)
{
char s[MAX_BUFFER_SIZE];
GetPrivateProfileSectionNames(s,MAX_BUFFER_SIZE,iniFileName.c_str());
char* p=s;
while(p[0])
{
if(strnicmp(p,"special_identifier_",sizeof("special_identifier_")-1)==0)
{
char prefix[MAX_BUFFER_SIZE];
char suffix[MAX_BUFFER_SIZE];
char value[MAX_BUFFER_SIZE];
GetPrivateProfileString(p,"style_prefix","",prefix,MAX_BUFFER_SIZE,iniFileName.c_str());
GetPrivateProfileString(p,"style_suffix","",suffix,MAX_BUFFER_SIZE,iniFileName.c_str());
if(prefix[0]||suffix[0])
{
mSpecialIdentifierPrefix.push_back(prefix);
mSpecialIdentifierSuffix.push_back(suffix);
if(GetPrivateProfileSection(p,value,MAX_BUFFER_SIZE,iniFileName.c_str())!=0)
{
char* v=value;
while(v[0])
{
mSpecialIdentifiers[v]=mSpecialIdentifierPrefix.size()-1;
v+=strlen(v)+1;
}
}
}
}
p+=strlen(p)+1;
}
}
CppDyer::CppDyer(string iniFileName)
{
vector<char> fullPath(10240);
char* temp;
if(GetFullPathName(iniFileName.c_str(),fullPath.size(),&fullPath[0],&temp)>=fullPath.size())
{
fullPath.resize(GetFullPathName(iniFileName.c_str(),fullPath.size(),&fullPath[0],&temp)+1);
if(GetFullPathName(iniFileName.c_str(),fullPath.size(),&fullPath[0],&temp)>=fullPath.size())
throw 1;
}
if(GetFileAttributes(&fullPath[0])==0xffffffff)
throw 1;
getBaseSettings(&fullPath[0]);
getSpecialSettings(&fullPath[0]);
}
void CppDyer::processFile(string cppFileName)
{
mPositionInLine=0;
mLineNumber=0;
mConvertingText.resize(1024*1024);
mConvertingText=mPrefix[INVALID];
if(mLineNumberChars)
{
char s[64];
sprintf(s,"%d",mLineNumber);
mConvertingText+=mLineNumberPrefix;
if(strlen(s)<mLineNumberChars)
{
for(string::size_type i=0;i<mLineNumberChars-strlen(s);++i)
{
mConvertingText+='0';
}
}
mConvertingText+=s;
for(string::size_type i=mLineNumberChars;i<mLineNumberIndent;++i)
{
mConvertingText+=" ";
}
mConvertingText+=mLineNumberSuffix;
}
mPositionInLine=0;
++mLineNumber;
ifstream ifs(cppFileName.c_str());
StreamContextHelper::InputStreamHelper helper(ifs);
StreamContextHelper(helper,*this).run();
mConvertingText+=mSuffix[INVALID];
ofstream ofs((cppFileName+".htm").c_str());
ofs<<mConvertingText;
}
void CppDyer::parse(Type t,const string& s,const Context&)
{
string prefix,suffix;
if(t==IDENTIFIER&&mExtraKeywords.find(s)!=mExtraKeywords.end())
{
prefix=mPrefix[KEYWORD];
suffix=mSuffix[KEYWORD];
}
else if(t==IDENTIFIER&&mSpecialIdentifiers.find(s)!=mSpecialIdentifiers.end())
{
prefix=mSpecialIdentifierPrefix[mSpecialIdentifiers[s]];
suffix=mSpecialIdentifierSuffix[mSpecialIdentifiers[s]];
}
else
{
prefix=mPrefix[t];
suffix=mSuffix[t];
}
mConvertingText+=prefix;
for(string::size_type i=0;i<s.size();++i)
{
if(s[i]=='\"')
mConvertingText+=""";
else if(s[i]=='&')
mConvertingText+="&";
else if(s[i]=='<')
mConvertingText+="<";
else if(s[i]=='>')
mConvertingText+=">";
else if(s[i]==' ')
mConvertingText+=" ";
else if(s[i]=='\t')
{
for(int i=0;i<mTabSpaces-mPositionInLine%4;++i)
mConvertingText+=" ";
mPositionInLine+=mTabSpaces-mPositionInLine%4;
continue;
}
else if(s[i]=='\n')
{
mConvertingText+="<br>\n";
if(mLineNumberChars)
{
mConvertingText+=suffix;
mConvertingText+=mLineNumberPrefix;
char s[64];
sprintf(s,"%d",mLineNumber);
if(strlen(s)<mLineNumberChars)
{
for(string::size_type i=0;i<mLineNumberChars-strlen(s);++i)
{
mConvertingText+='0';
}
}
mConvertingText+=s;
for(string::size_type i=mLineNumberChars;i<mLineNumberIndent;++i)
{
mConvertingText+=" ";
}
}
mPositionInLine=0;
mConvertingText+=mLineNumberSuffix;
mConvertingText+=prefix;
++mLineNumber;
continue;
}
else
mConvertingText+=s[i];
++mPositionInLine;
}
mConvertingText+=suffix;
}
CppDyer::~CppDyer()
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -