cpp2html[C++版]

例題のページで用いられているcpp2htmlのC++版を掲載します。 cpp2htmlは、C及びC++で書かれたソースファイルをHTMLへと変換します。 用意したファイルは、コンパイルして実行ファイルとして利用が可能な他、宣言されているクラス(CCpp2Html)を用いて他のソフトにも組み込むことが可能です。


 ダウンロード

ソースのダウンロード(リンク先にはcpp2htmlにより変換されたHTMLファイルが表示されます。):

実行時の引数は以下のようになります。

Gami[488]% cpp2html
USAGE: cpp2html srcfile [-disp] [-plain] [-out htmlfile] [-t n] [-no]
option:
        -disp   output to display (default _cpp.html file).
        -plain  do not display HTML header and footer.
        -t n    tab order (insert n spaces instead of a tab)
        -out htmlfile   output filename
        -no     display line number
Gami[489]%


 CCpp2Html クラスの利用

cpp2html.cpp の記述にはmain()関数が記述されていますので、他のファイルからCCpp2Htmlのクラスを利用するにはcpp2html.cpp内のmain()関数の記述を削除する必要があります。もしくは、下記のように記述されているmain部の上の USE_LIB の宣言のコメントアウトを外すことにより他のファイルから利用することが可能となります。

//-----------------------------------------------------------------
// main 関数として使用時
//-----------------------------------------------------------------
//#define USE_LIB --> この部分のコメントアウトを外す
#ifndef USE_LIB
int main(int argc,char* argv[])
{
    CCpp2Html* c2h = new CCpp2Html(argc,argv);
    if(!c2h->ReadCode()) return 0;
    if(c2h->Convert()) c2h->WriteCode();
    delete c2h;
    return 0;
}
#endif


 引数の読込みによる変換(exp1.cpp)

コンパイル:
 Gami[488]% g++ -o exp1 cpp2html.cpp common.cpp exp1.cpp

例題(exp1.cpp)
01: #include <stdio.h>
02: #include "cpp2html.h"
03: 
04: int main(int argc,char* argv[])
05: {
06:     CCpp2Html c2h(argc,argv);
07:     if(c2h.ReadCode()) {
08:         if(c2h.Convert())
09:             c2h.WriteCode();
10:     }
11:     return 0;
12: }

コンパイルには以下のような makefile を準備すると便利です。

SRC  = exp1
OBJS = common.o cpp2html.o $(SRC).o
COMP = g++
FLAG = -lm

all: $(OBJS)
	g++ -o $(SRC) $(OBJS) $(FLAG)


 配列に読み込まれたC言語の記述をファイルに保存(exp2.cpp)

例題(exp2.cpp)実行・表示例(samp.html)
#include <stdio.h>
#include <stdlib.h>
#include "cpp2html.h"

int main(int argc,char* argv[])
{
    // クラスの定義
    CCpp2Html*c2h = new CCpp2Html(
        FMT_HTML,  // FMT_PLAIN:<pre></pre>の記述のみ,
                   // FMT_HTML:<html>のヘッダ, フッタの記述付きで出力
        4,         // タブからスペースへの変換幅
        SW_LINE    // SW_NOLINE: 番号なし, SW_LINE: 番号付き
    );
    // 他のファイル等から読み取ったファイルを配列へ記憶
    char c_code[] = "\
#include <stdio.h>\n\
int main(){\n\
    printf(\"hello world\\n\");\n\
    return 0;\n\
}\n";
    // クラス内に配列をコピー
    c2h->SetCode(c_code);
    // 変換の実行
    if(c2h->Convert()){ // 変換成功
        int len = c2h->CodeLen(); // 変換されたHTMLコードの文字数
        // HTMLコードの記憶用配列の確保
        char* h_code = (char*)calloc(len+1,sizeof(char));
        // コードの取得
        c2h->GetCode(h_code);
        // 他のファイルへの書き出し
        FILE* fp=fopen("samp.html","w");
        fwrite(h_code,sizeof(char),len,fp);
        fclose(fp);
        // 配列の解放
        free(h_code);
    } else fprintf(stderr,"convert error.\n"); // 変換失敗
    
    // クラスの解放
    delete c2h;
    return 0;
}
01: #include <stdio.h>
02: int main(){
03:     printf("hello world\n");
04:     return 0;
05: }


 一括変換用Perlスクリプト

ファイルの数が多く一括して変換したい場合には、VC++等でのGUIを作成すれば良いのですが、cygwin環境で一括して変換することができるように、perl用のスクリプトを準備しました。

実行手順:

src2html.pl [download]
#!/usr/bin/perl
#--------------------------------------------------
# cpp2html 一括変換用スクリプト
#   src2html.pl
#--------------------------------------------------
# cpp2html のパスを指定
$trcmd = "cpp2html";
# 検索する拡張子のリスト
@Lext = ("cpp","cc","c","h","hh");
# 変換オプション
$opt  = 0;    # 1: ヘッダ,フッタを出力しない
$tab2spc = 0; # タブからスペースへの変換数
$sw_line = 0; # 行番号の表示
# 引数検索
for$i=0;$i<=$#ARGV;$i++){
    if($ARGV[$i] eq "-plain")  { $opt = 1; }
    if($ARGV[$i] eq "-no") { $sw_line = 1; }
    if($ARGV[$i] eq "-t"){
        $i++; $tab2spc = $ARGV[$i];
    }
}
# 拡張子による検索
for$i=0;$i<=$#Lext;$i++){
    $trext = $Lext[$i];
    @file  = <*$trext>;
    if($#file){
        foreach $fname (@file){
            ($name,$ext) = split(/\./,$fname);
            if($ext eq $trext){
                $cmd = "$trcmd $fname";
                if($opt){ $cmd = "$cmd -plain"; }
                if($sw_line){ $cmd = "$cmd -no"; }
                if($tab2spc){ $cmd = "$cmd -t $tab2spc"; }
                system($cmd);
            }
        }
    }
}
inserted by FC2 system