//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Buttons.hpp>
#include <Dialogs.hpp>
#include <ExtCtrls.hpp>
#include <Menus.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE-managed Components
        TPanel *Panel1;
        TSpeedButton *SpeedButton1;
        TOpenDialog *OpenDialog1;
        TMainMenu *MainMenu1;
        TMenuItem *File1;
        TMenuItem *Open1;
        TMenuItem *N2;
        TMenuItem *Exit1;
        TMenuItem *About1;
        TMenuItem *N1;
        TMenuItem *Option1;
        TMenuItem *PureOutPut;
        void __fastcall FormCreate(TObject *Sender);  (Content)
        void __fastcall FormActivate(TObject *Sender);  (Content)
        void __fastcall FormClose(TObject *Sender, TCloseAction &Action);  (Content)
        void __fastcall SpeedButton1Click(TObject *Sender);  (Content)
        void __fastcall N1Click(TObject *Sender);  (Content)
        void __fastcall Open1Click(TObject *Sender);  (Content)
        void __fastcall Exit1Click(TObject *Sender);  (Content)
        void __fastcall PureOutPutClick(TObject *Sender);  (Content)
private:	// User declarations
        void __fastcall _CppToHtm();  (Content)
        void __fastcall _ReadRecivedData();  (Content)
        String __fastcall _TranCpp(String Str);  (Content)
        String __fastcall _TagEncode(String ATagStr);  (Content)
        String __fastcall _GetFuncName(String Str);  (Content)
        String __fastcall _LeftSpace(String Str);  (Content)
        String __fastcall _Left(String Str , int n);  (Content)
        String __fastcall _Right(String Str , int n);  (Content)
        String __fastcall _CutLeft(String Str , int n);  (Content)
        String __fastcall _CutRight(String Str , int n);  (Content)

public:		// User declarations
        __fastcall TForm1(TComponent* Owner);  (Content)
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

 


 

//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "IniFiles.hpp" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; TIniFile *MyIni; TStringList *MyH; TStringList *MyBuffer; TStringList *MyBuffer2; TStringList *TranDataList; bool flag_marked,myh_exist; String flag_marked_type; //---------------------------------------------------------------------------

Content , (Go Header)

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}

 

//---------------------------------------------------------------------------

Content , (Go Header)

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  MyIni = new TIniFile(ChangeFileExt(Application->ExeName,".ini"));

  MyH = new TStringList;
  MyBuffer = new TStringList;
  MyBuffer2 = new TStringList;

  TranDataList = new TStringList;
  TranDataList->Clear();

  _ReadRecivedData();
}

 

//---------------------------------------------------------------------------

Content , (Go Header)

void __fastcall TForm1::FormActivate(TObject *Sender)
{
  PureOutPut->Checked=MyIni->ReadBool("Parameter","PureOutPut",false);

}

 

//---------------------------------------------------------------------------

Content , (Go Header)

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  delete TranDataList;

  delete MyH;
  delete MyBuffer;
  delete MyBuffer2;

  MyIni->WriteBool("Parameter","PureOutPut",PureOutPut->Checked);
  delete MyIni;
}

 

//---------------------------------------------------------------------------

Content , (Go Header)

void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
  myh_exist=false;

  if (OpenDialog1->Execute())
     {
       MyBuffer->LoadFromFile(OpenDialog1->FileName);

       if (FileExists(ChangeFileExt(ExtractFileName(OpenDialog1->FileName),".h")))
          {
            myh_exist=true;
            MyH->LoadFromFile(ChangeFileExt(ExtractFileName(OpenDialog1->FileName),".h"));
          }

       //for express
       Panel1->Caption="Process...";
       Refresh();

       _CppToHtm();
       Panel1->Caption="";
     }
}

 

//---------------------------------------------------------------------------

Content , (Go Header)

void __fastcall TForm1::_CppToHtm()
{
  String www,pre_str,flo_str,lnk_str;

  flag_marked=false;

  MyBuffer2->Clear();
  MyBuffer2->Add("<html>");
  MyBuffer2->Add("<head>");
  MyBuffer2->Add("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=big5\">");
  MyBuffer2->Add("<title>"+ChangeFileExt(ExtractFileName(OpenDialog1->FileName),".html")+"</title>");
  MyBuffer2->Add("</head>");
  MyBuffer2->Add("<!-- Generated by bruce0829@yahoo.com.tw HTML exporter -->");
  MyBuffer2->Add("<body text=\"#000000\" bgcolor=\"#FFFFFF\" link=\"#FF00FF\" vlink=\"#FF00FF\" alink=\"#FF00FF\">"); //#0000FF(藍色), #FF00FF(桃紅), #008000(綠色) //2003/12/17
  MyBuffer2->Add("<pre><code>");
  MyBuffer2->Add("<font size=2 face=\"Courier New\"><font color=\"#000000\">");

  //處理 *.h 檔
  if (myh_exist)
     {
        for (int i=0 ; i<= MyH->Count-1 ; i++)
            {
               pre_str="";
               flo_str="";
               lnk_str="";

               if (!PureOutPut->Checked)
               {

               if (_Left(MyH->Strings[i],7)=="#ifndef")
                  {
                    pre_str="<a name=\"#0\">";
                    flo_str="</a\">";
                  }

               if (flag_marked_type!="/*" && _GetFuncName(MyH->Strings[i])!="")
                    lnk_str="  (<a href=\"#"+_GetFuncName(MyH->Strings[i])+"\">Content</a>)";
               else
                    lnk_str="";

               }

               MyBuffer2->Add(pre_str+_TranCpp(MyH->Strings[i])+flo_str+lnk_str);
            }

        //水平線
        MyBuffer2->Add("<p> </p>");
        MyBuffer2->Add("<hr color=\"#0000FF\">");
        MyBuffer2->Add("<p> </p>");

     }


  //處理 *.cpp 檔
  for (int i=0 ; i<= MyBuffer->Count-1 ; i++)
      {
             pre_str="";
             flo_str="";
             lnk_str="";

             if (!PureOutPut->Checked)
             {

             if ((flag_marked_type!="/*") && (MyBuffer->Strings[i].Pos("__fastcall")>0) && (MyBuffer->Strings[i].Pos("__fastcall")<=8))
                 pre_str="<p><a name=\""+_GetFuncName(MyBuffer->Strings[i])+"\">Content</a> , (<a href=\"#0\">Go Header</a>)<br></p>"+
                          "<table border=\"1\" width=\"100%\" bgcolor=\"#FFFFCC\"><tr><td><pre><font face=\"Courier New\">"; //#F7F7FF(淡藍), #E1F5FF(藍), #EFEFEF(灰), #FFFFD7(黃), #E8FFE8(綠), #FFFFCC(參考黃), #E0E0F0(KTop 藍)
             else
                 pre_str="";

             if (flag_marked_type!="/*" && _Left(MyBuffer->Strings[i],1)=="}")
                 flo_str="</font></pre></td></tr></table><p> </p>";
             else
                 flo_str="";
             }

             MyBuffer2->Add(pre_str+_TranCpp(MyBuffer->Strings[i])+flo_str+lnk_str);

      }

  MyBuffer2->Add("</font>");
  MyBuffer2->Add("</code></pre>");
  MyBuffer2->Add("</body>");
  MyBuffer2->Add("</html>");

  MyBuffer2->SaveToFile(ChangeFileExt(OpenDialog1->FileName,".htm"));
  www=ChangeFileExt(OpenDialog1->FileName,".htm");
  ShellExecute(0,NULL,www.c_str(),NULL,NULL,SW_SHOWDEFAULT);
}

 

//---------------------------------------------------------------------------

Content , (Go Header)

String __fastcall TForm1::_TranCpp(String Str)
{
  String r,tmp,tran_str,test,comp_str,Seg;
  int o,p,index1,index2;
  int c,s; //for bug_fix

  s=1; //for bug_fix

  if (flag_marked_type=="//" || flag_marked_type=="\"")
     {
       flag_marked=false;
       flag_marked_type="";
     }

  if (Trim(Str)=="")
     {
       return ("");
     }

  r=_LeftSpace(Str); //保留字串左邊所有的空白
  tmp=Trim(Str);

  Seg="";

  while (tmp!="")
        {
          if (flag_marked) //進入被 marked 的區塊 , 都不用轉碼
             {
               if (flag_marked_type=="//") //後面通通不用轉
                  {
                    r=r+_TagEncode(tmp)+"</i></font>";
                    tmp="";
                    continue;
                  }

               if (flag_marked_type=="/*")
                  {
                    p=tmp.Pos("*/");
                    if (p==0)
                       {
                         r=r+_TagEncode(tmp);
                         tmp="";
                         continue;
                       }
                    else
                       {
                         r=r+_TagEncode(_Left(tmp,p-1))+"*/</i></font>"; //較特殊 !!
                         tmp=_CutLeft(tmp,p+1);
                         flag_marked=false;
                         flag_marked_type=""; //2003/12/17
                         continue;
                       }
                  }

               if (flag_marked_type=="'")
                  {
                    p=tmp.Pos("'");
                    if (p==0)
                       {
                         r=r+_TagEncode(tmp);
                         tmp="";
                         continue;
                       }
                    else
                       {
                         r=r+_TagEncode(_Left(tmp,p-1))+"'</font>"; //較特殊 !!
                         tmp=_CutLeft(tmp,p);
                         flag_marked=false;
                         flag_marked_type=""; //2003/12/17
                         continue;
                       }
                  }

               if (flag_marked_type=="\"")
                  {
                    o=tmp.Pos("\\");
                    p=tmp.Pos("\"");

                    if (o!=0 && p!=0)  //用來對付雙引號中帶有 \ 者(指定特殊符號)
                       {
                         if (o<p)
                            {
                              r=r+_TagEncode(_Left(tmp,o+1));
                              tmp=_CutLeft(tmp,o+1);
                              continue;
                            }
                       }

                    switch (p)
                           {
                             case 0 : r=r+_TagEncode(tmp);
                                      tmp="";
                                      continue;
                                      break;
                             case 1 : r=r+_TagEncode(_Left(tmp,p-1))+"\"</font>";
                                      tmp=_CutLeft(tmp,p);
                                      flag_marked=false;
                                      flag_marked_type="";
                                      continue;
                                      break;
                             default: if (tmp[p-1]=='\\')
                                         {
                                           r=r+_TagEncode(_Left(tmp,p-1));
                                           tmp=_CutLeft(tmp,p);
                                           continue;
                                         }
                                       else
                                         {
                                           r=r+_TagEncode(_Left(tmp,p-1))+"\"</font>"; //較特殊 !!
                                           tmp=_CutLeft(tmp,p);
                                           flag_marked=false;
                                           flag_marked_type=""; //2003/12/17
                                           continue;
                                         }
                           }

                  }

             }


          //編譯器符號 片語比對
          if (_Left(tmp,8)=="#include")
             {
                    r=r+"<font color=\"#008000\">"+_TagEncode(tmp)+"</font>";
                    tmp="";
                    continue;
             }

          if (_Left(tmp,7)=="#pragma")
             {
                    r=r+"<font color=\"#008000\">"+_TagEncode(tmp)+"</font>";
                    tmp="";
                    continue;
             }

          if (_Left(tmp,7)=="#ifndef")
             {
                    r=r+"<font color=\"#008000\">"+_TagEncode(tmp)+"</font>";
                    tmp="";
                    continue;
             }

          if (_Left(tmp,7)=="#define")
             {
                    r=r+"<font color=\"#008000\">"+_TagEncode(tmp)+"</font>";
                    tmp="";
                    continue;
             }

          if (_Left(tmp,6)=="#endif")
             {
                    r=r+"<font color=\"#008000\">"+_TagEncode(tmp)+"</font>";
                    tmp="";
                    continue;
             }

          //預先比對
          if (_Left(tmp,2)=="//")
             {
                    r=r+"<font color=\"#0000FF\"><i>//";  //#0000FF(藍), #000080(深藍), #008000(綠) 2003/12/17
                    tmp=_CutLeft(tmp,2);
                    if (tmp=="") r=r+"</i></font>"; //2003/12/09
                    flag_marked=true;  //進入被 marked 的區塊
                    flag_marked_type="//";
                    continue;
             }

          if (_Left(tmp,2)=="/*")
             {
                    r=r+"<font color=\"#0000FF\"><i>/*";  //#0000FF(藍), #000080(深藍), #008000(綠) 2003/12/17
                    tmp=_CutLeft(tmp,2);
                    flag_marked=true;  //進入被 marked 的區塊
                    flag_marked_type="/*";
                    continue;
             }

          if (_Left(tmp,1)=="\"")
             {
                    r=r+"<font color=\"#FF0000\">\"";
                    tmp=_CutLeft(tmp,1);
                    flag_marked=true;  //進入被 marked 的區塊
                    flag_marked_type="\"";
                    continue;
             }

          if (_Left(tmp,1)=="'")
             {
                    r=r+"<font color=\"#FF00FF\">'";
                    tmp=_CutLeft(tmp,1);
                    flag_marked=true;  //進入被 marked 的區塊
                    flag_marked_type="'";
                    continue;
             }

          if (_Left(tmp,1)==" ")
             {
                    r=r+" ";
                    s=1; //for bug_fix
                    tmp=_CutLeft(tmp,1);
                    continue;
             }

          if (_Left(tmp,1)=="<")
             {
                    r=r+"<";
                    tmp=_CutLeft(tmp,1);
                    continue;
             }

          if (_Left(tmp,1)==">")
             {
                    r=r+">";
                    tmp=_CutLeft(tmp,1);
                    continue;
             }


          //擷取適合的字串區段
          index1=1;
          c=0; //for bug_fix
          for (int i=1 ; i<= tmp.Length() ; i++)
              {
                index2=i;

                //因為經過 預先比對 過濾過 , 此處找到的應該不會是在第一個位置
                if (tmp[i]=='\"' || tmp[i]==' ' || tmp[i]==';' || tmp[i]=='/' ||
                     tmp[i]=='(' || tmp[i]==',' || tmp[i]=='=' || tmp[i]=='!' ||
                     tmp[i]=='+' || tmp[i]=='-' || tmp[i]=='*' || tmp[i]=='.' ||
                     tmp[i]==':'
                   )
                   {
                     c=1; //for bug_fix
                     break;
                   }
              }

          if (index2==tmp.Length() && c==0) index2=index2+1;//用來騙 字典比對程序  //2003/12/09

          //字典比對
          tran_str=TranDataList->Values[_Left(tmp,index2-1)];
          if (tran_str!="" && s==1)
             {
                r=r+tran_str;
                tmp=_CutLeft(tmp,index2-1);
                continue;
             }

          s=0; //for bug_fix

          //空白已在前面被攔掉,所以此處多餘,故 Mark
          if (tmp[1]==' ' ||  tmp[1]==':' ||  tmp[1]==';' || tmp[1]==',' || tmp[1]=='(' || tmp[1]=='=')
              s=1;
          else
              s=0;

          //剩下沒人要的,只有一個一個原封不動的轉了
          r=r+_Left(tmp,1);
          tmp=_CutLeft(tmp,1);

        }

  return(r);

}

 

//---------------------------------------------------------------------------

Content , (Go Header)

String __fastcall TForm1::_TagEncode(String ATagStr)
{
  String r;

  r="";
  for (int i=1 ; i <=ATagStr.Length() ; i++)
      {
        if (ATagStr[i]=='<')
           {
             r=r+"<";
             continue;
           }
        if (ATagStr[i]=='>')
           {
             r=r+">";
             continue;
           }
         r=r+(String)ATagStr[i];
      }
  return(r);
}

 

//---------------------------------------------------------------------------

Content , (Go Header)

String __fastcall TForm1::_GetFuncName(String Str)
{
  int n;
  String tmp,r;

  r="";
  tmp=Trim(Str);

  if (tmp.Pos("__fastcall")==0)
     {
       return(r);
     }

  for (int i=tmp.Pos("__fastcall")+10 ; i<=tmp.Length() ; i++)
      {
        if (tmp[i]=='(' || tmp[i]==';' || ((r!="") && (tmp[i]==' '))) break;

        if (tmp[i]==':')
           {
             r="";
             continue;
           }

        r=r+Trim((String)tmp[i]);
      }

  return(r);

}

 

//---------------------------------------------------------------------------

Content , (Go Header)

void __fastcall TForm1::_ReadRecivedData()
{
  TranDataList->Clear();
  TranDataList->Add("__except=<b>__except</b>");
  TranDataList->Add("__fastcall=<b>__fastcall</b>");
  TranDataList->Add("__finally=<b>__finally</b>");
  TranDataList->Add("__published=<b>__published</b>");
  TranDataList->Add("__stdcall=<b>__stdcall</b>");
  TranDataList->Add("break=<b>break</b>");
  TranDataList->Add("bool=<b>bool</b>");
  TranDataList->Add("case=<b>case</b>");
  TranDataList->Add("catch=<b>catch</b>");
  TranDataList->Add("class=<b>class</b>");
  TranDataList->Add("continue=<b>continue</b>");
  TranDataList->Add("default=<b>default</b>");
  TranDataList->Add("delete=<b>delete</b>");
  TranDataList->Add("do=<b>do</b>");
  TranDataList->Add("else=<b>else</b>");
  TranDataList->Add("extern=<b>extern</b>");
  TranDataList->Add("false=<b>false</b>");
  TranDataList->Add("for=<b>for</b>");
  TranDataList->Add("int=<b>int</b>");
  TranDataList->Add("if=<b>if</b>");
  TranDataList->Add("new=<b>new</b>");
  TranDataList->Add("private=<b>private</b>");
  TranDataList->Add("public=<b>public</b>");
  TranDataList->Add("return=<b>return</b>");
  TranDataList->Add("switch=<b>switch</b>");
  TranDataList->Add("this=<b>this</b>");
  TranDataList->Add("true=<b>true</b>");
  TranDataList->Add("try=<b>try</b>");
  TranDataList->Add("void=<b>void</b>");
  TranDataList->Add("while=<b>while</b>");
  //TranDataList->Add("<=<");
  //TranDataList->Add(">=>");
}

 

//--------------------------------------------------------------------------- //取出字串左邊的空白 //---------------------------------------------------------------------------

Content , (Go Header)

String __fastcall TForm1::_LeftSpace(String Str)
{
  String r;

  r="";
  for (int i=1 ; i <=Str.Length() ; i++)
      {
        if (Str[i]==' ')
              r=r+" ";
          else
              break;
      }

  return(r);

}

 

//--------------------------------------------------------------------------- //取出字串左邊 n 個字串 //---------------------------------------------------------------------------

Content , (Go Header)

String __fastcall TForm1::_Left(String Str , int n)
{
  String r;

  r="";
  if (n>Str.Length())
     {
       return (Str);
     }

  r=Str.SubString(1,n);

  return (r);

}

 

//--------------------------------------------------------------------------- //取出字串右邊 n 個字串 //---------------------------------------------------------------------------

Content , (Go Header)

String __fastcall TForm1::_Right(String Str , int n)
{
  String r;

  r="";
  if (n>Str.Length())
     {
       return (Str);
     }

  r=Str.SubString(Str.Length()-n+1,n);

  return (r);

}

 

//--------------------------------------------------------------------------- //減掉字串左邊 n 個字串 //---------------------------------------------------------------------------

Content , (Go Header)

String __fastcall TForm1::_CutLeft(String Str , int n)
{
  String r;

  r="";
  if (n>Str.Length())
     {
       return (r);
     }

  r=Str.SubString(n+1,Str.Length()-n);

  return (r);

}

 

//--------------------------------------------------------------------------- //減掉字串右邊 n 個字串 //---------------------------------------------------------------------------

Content , (Go Header)

String __fastcall TForm1::_CutRight(String Str , int n)
{
  String r;

  r="";
  if (n>Str.Length())
     {
       return (r);
     }

  r=Str.SubString(1,Str.Length()-n);

  return (r);

}

 

//---------------------------------------------------------------------------

Content , (Go Header)

void __fastcall TForm1::N1Click(TObject *Sender)
{
  ShellExecute(0,NULL,"http://home.kimo.com.tw/bruce0829/",NULL,NULL,SW_SHOWDEFAULT);
}

 

//---------------------------------------------------------------------------

Content , (Go Header)

void __fastcall TForm1::Open1Click(TObject *Sender)
{
  SpeedButton1Click(this);
}

 

//---------------------------------------------------------------------------

Content , (Go Header)

void __fastcall TForm1::Exit1Click(TObject *Sender)
{
  Close();
}

 

//---------------------------------------------------------------------------

Content , (Go Header)

void __fastcall TForm1::PureOutPutClick(TObject *Sender)
{
  PureOutPut->Checked=!PureOutPut->Checked;
}

 

//---------------------------------------------------------------------------