#include <locale>
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <SMART_STRING.HPP>
#include <CXXLWCSPBRK.HPP>
using namespace std;
using namespace CxxlMan;
// cxxlWcspbrk 用的資料源
class Unicode_Source:public IWcspbrkSource
{
UNICODE_String m_StrSrc;
size_t StrSrcBase;
// 來自 IWcspbrkSource 須實作的虛擬函數
size_t cxxlFASTCALL GetStr(wchar_t *Dest,size_t Len)
{
size_t l = m_StrSrc.StrLength() - StrSrcBase;
if(l >= Len)
{
for(size_t i = 0; i<Len; ++i)
{
Dest[i] = ((const wchar_t*)m_StrSrc)[StrSrcBase + i];
}
StrSrcBase += Len;
return Len;
}
else
{
for(size_t i = 0; i < l; ++i)
{
Dest[i] = ((const wchar_t*)m_StrSrc)[StrSrcBase + i];
}
StrSrcBase = m_StrSrc.StrLength();
return l;
}
}
public:
Unicode_Source(const CxxlMan::UNICODE_String &StrSrc, ISpirit *spirit = Spirit_Easy)
:cxxlObject(spirit),m_StrSrc(StrSrc)
{
StrSrcBase = 0;
}
};
class ClearRemark
{
cxxlWcspbrk Wcspbrk;
wostringstream Dest;
// 未處放註解內的處理函數
bool RemOut();
// 處於 /* */ 內的處理函數
bool RemIn1();
// 處於 // 內的處理函數
bool RemIn2();
bool (ClearRemark::*funcPtr)();
public:
// Constructor
ClearRemark(const UNICODE_String &S)
:Wcspbrk(new Unicode_Source(S))
{
funcPtr = &ClearRemark::RemOut;
}
// Destructor
virtual ~ClearRemark()
{
}
wstring toDo()
{
while((this->*funcPtr)());
return Dest;
}
};
// 未處於註解內的處理函數
bool ClearRemark::RemOut()
{
const wchar_t *pTok[] = {L"//",L"/*",NULL};
cxxlWcspbrk_Result r = Wcspbrk.Next( pTok );
Dest << r.SubStr;
if(r.Token.isNULL())
return false;
if(wcscmp(r.Token, L"//") == 0)
funcPtr = &ClearRemark::RemIn2;
else if(wcscmp(r.Token, L"/*") == 0)
funcPtr = &ClearRemark::RemIn1;
return true;
}
// 處於 /* */ 內的處理函數
bool ClearRemark::RemIn1()
{
const wchar_t *pTok[] = {L"*/",NULL};
cxxlWcspbrk_Result r = Wcspbrk.Next( pTok );
if(r.Token.isNULL())
return false;
funcPtr = &ClearRemark::RemOut;
return true;
}
// 處於 // 內的處理函數
bool ClearRemark::RemIn2()
{
const wchar_t *pTok[] = {L"\r\n",L"\n",L"\r",NULL};
cxxlWcspbrk_Result r = Wcspbrk.Next( pTok );
if(r.Token.isNULL())
return false;
if( r.Token == L"\r\n")
{
Dest << L"\r\n";
}
else if( r.Token == L"\r")
{
Dest << L'\r';
}
else
{
Dest << L'\n';
}
funcPtr = &ClearRemark::RemOut;
return true;
}
int main(int argc, char* argv[])
{
if(argc != 2)
{
// 假設被編譯成執行檔名為 clrrem
cout << "clrrem filename" << endl << endl
<< " filename 含有註解的 c++ 原始檔名" << endl;
return 0;
}
ifstream fin(argv[1]);
if(!fin.good())
{
cout << "無法開啟指定的來源檔名" << endl;
return 0;
}
stringstream SS;
SS << fin.rdbuf(); // 取得整個文檔
fin.close();
string StrSrc(SS.str());
setlocale(LC_CTYPE, ""); // 指定系統現正使用中的地區語言做轉換
UNICODE_String WStrSrc(StrSrc.c_str()); // 轉為 Unicode 碼
ClearRemark CM(WStrSrc);
wcout << CM.toDo() << endl;
return 0;
}