#pragma once

#include <stdio.h>
#include <string.h>

#define USE_LIB                1

#define MAX_PATH               260
#define std_in                 "<stdin>"
#define std_out                "<stdout>"
#define DEFAULT_TAB2SPC        4
#define CPP_KWD_MAX            100
#define FMINSIZ                4096
#define RGB(r,g,b)             ( r<<16 | g<<8 | b )
#ifndef TRUE
#define TRUE                   1
#endif
#ifndef FALSE
#define FALSE                  0
#endif

// コマンドオプション
enum HTML_FMT {
    FMT_HTML     = 0,
    FMT_PLAIN    = 1,
};
enum SHOW_LINE_NUM {
    SW_NOLINE    = 0,
    SW_LINE      = 1,
};
enum OUPTUT_DEST {
    DST_FILE     = 0,
    DST_DISP     = 1,
};
// フォントスタイル
enum FONT_WEIGHT {
    FW_NORMAL    = 0, // 標準の太さ
    FW_BOLD      = 1, // 太字
    FW_LIGHTER   = 2, // 一段階細く
    FW_BOLDER    = 3, // 一段階太く
};
enum FONT_STYLE {
    FS_NORMAL    = 0, // 標準フォント
    FS_ITALIC    = 1, // イタリックフォント
    FS_OBLIQUE   = 2, // 斜体フォント
};
enum FONT_TYPE {
    FT_COMMENT   = 0,
    FT_DITECTIVE = 1,
    FT_FUNC      = 2,
    FT_COMMAND   = 3,
    FT_STRING    = 4,
    FT_LINENUM   = 5,
};
//----------------------------------------------------------------------------------------------------
// 色づけ用スタイル定義
//----------------------------------------------------------------------------------------------------
class CColorOption
{
    char body[256];
    char comment[256];
    char ditective[256];
    char function[256];
    char command[256];
    char string[256];
    char linenum[256];
 public:
    CColorOption() {
        sprintf(body,     "color:#000000; background:#ffffff;");
        sprintf(comment,  "color:#008000; font-weight:normal; font-style:normal;");
        sprintf(ditective,"color:#ff55aa; font-weight:normal; font-style:normal;");
        sprintf(function, "color:#ff5500; font-weight:normal; font-style:normal;");
        sprintf(command,  "color:#0000ff; font-weight:normal; font-style:normal;");
        sprintf(string,   "color:#aa3333; font-weight:normal; font-style:normal;");
        sprintf(linenum,  "color:#a0a0a0; font-weight:bold; font-style:normal;");
    }
    char* getBodyFmt()      { return body; }
    char* getCommentFmt()   { return comment; }
    char* getDitectiveFmt() { return ditective; }
    char* getFunctionFmt()  { return function; }
    char* getCommandFmt()   { return command; }
    char* getStringFmt()    { return string; }
    char* getLinenumFmt()   { return linenum; }
    void setBodyColor(int color, int bgcolor) {
        char s_color[10];
        char s_bgcolor[10];
        // color
        int r = 0xff & (color>>16);
        int g = 0xff & (color>>8);
        int b = 0xff & color;
        sprintf(s_color,"#%02x%02x%02x",r,g,b);
        // bgcolor
        r = 0xff & (bgcolor>>16);
        g = 0xff & (bgcolor>>8);
        b = 0xff & bgcolor;
        sprintf(s_bgcolor,"#%02x%02x%02x",r,g,b);
        
        sprintf(body,"color:%s; background:%s;",s_color,s_bgcolor);
    }
    void setFontFormat(FONT_TYPE type, int color, int weight, int style) {
        char s_color[10];
        char s_weight[10];
        char s_style[10];
        int r = 0xff & (color>>16);
        int g = 0xff & (color>>8);
        int b = 0xff & color;
        // color
        sprintf(s_color,"#%02x%02x%02x",r,g,b);
        // weight
        switch ( weight ) {
        case FW_NORMAL:  sprintf(s_weight,"normal");  break;
        case FW_BOLD:    sprintf(s_weight,"bold");    break;
        case FW_LIGHTER: sprintf(s_weight,"lighter"); break;
        case FW_BOLDER:  sprintf(s_weight,"bolder");  break;
        default: break;
        }
        // style
        switch ( style ) {
        case FS_NORMAL:  sprintf(s_style,"normal");  break;
        case FS_ITALIC:  sprintf(s_style,"italic");  break;
        case FS_OBLIQUE: sprintf(s_style,"oblique"); break;
        default: break;
        }
        char* p;
        switch ( type ) {
        case FT_COMMENT:   p = comment;   break;
        case FT_DITECTIVE: p = ditective; break;
        case FT_FUNC:      p = function;  break;
        case FT_COMMAND:   p = command;   break;
        case FT_STRING:    p = string;    break;
        case FT_LINENUM:   p = linenum;   break;
        default: return;
        }
        sprintf(p,"color:%s; font-weight:%s; font-style:%s;",s_color,s_weight,s_style);
    }
};
//----------------------------------------------------------------------------------------------------
//
// Source Option Class:
//   プログラム実行のオプション設定
//
//----------------------------------------------------------------------------------------------------
class CSrcOption
{
public:
    char cmd[256];
    char fIn[MAX_PATH],fOut[MAX_PATH];
    int Hdst; // 表示先  [file or stdout]
    int Hfmt; // 表示形式[html or  plain]
    int t2s;  // タブからスペースへの変換[default:4]
    int swLine; // 行番号表示
    
    CSrcOption() {
        memset(cmd,0,sizeof(char)*256);
        strcpy(fIn,std_in);
        strcpy(fOut,std_out);
        Hdst   = DST_FILE;
        Hfmt   = FMT_HTML;
        t2s    = DEFAULT_TAB2SPC;
        swLine = SW_NOLINE;
    }
    CSrcOption& operator = (CSrcOption &opt) {
        strcpy(cmd,opt.cmd);
        strcpy(fIn,opt.fIn);
        strcpy(fOut,opt.fOut);
        Hdst   = opt.Hdst;
        Hfmt   = opt.Hfmt;
        t2s    = opt.t2s;
        swLine = opt.swLine;
        return *this;
    }
};
//----------------------------------------------------------------------------------------------------
//
// Cpp2Html Class:
//   convert C/C++ source to HTML document
//
//----------------------------------------------------------------------------------------------------
class Cpp2Html
{
    FILE *OFP;
    CColorOption colopt;
    CSrcOption cmdopt;
    int  Run,fcLen,lineSum,tabSum,hci,linefmt;
    char DocTitle[256],tabstr[256],repst[256];
    char HeadCode[2048],FootCode[256];
    // [C/C++] Source and HTML Document Buffer
    char *Ccode,*Hcode;
    // C/C++言語用キーワード配列
    char *kwd_table[CPP_KWD_MAX],*pp_table[CPP_KWD_MAX];
    int  kwd_len[CPP_KWD_MAX],pp_len[CPP_KWD_MAX];

    // コマンドヘルプ
    void usage();
    // プログラムの引数の読取[FALSE:失敗,TRUE:正常]
    int ReadArg(int argc, char* argv[], CSrcOption& cmdopt);
    
    // クラスデータの初期化
    void InitClass();
    
    // C/C++キーワードのソート
    void SortKwd();

    // 書き出し: header/footer/source
    void Html_headout();
    void Html_footout();
    void Html_codeout();

    // Hcode 初期化
    int Initbuf(int buflen);
    // Hcode へ行番号を挿入
    void PushLine();
    // Hcode へ文字列を挿入
    void strpush(const char* buf);
    void charpush(const char buf);
    
    // * C code check
    // HTML記号かどうか
    int htmlsym_sch(char c);
    // HTML記号の検索
    char* get_htmlsym(int kn);
    // 特殊領域の判定[通常,文字列,コメント]
    int ch_strstate(unsigned char pre_c, unsigned char now_c, unsigned char nxt_c);
    // 特殊領域の置き換え[通常,文字列,コメント]
    int rep_strarea(int kstat, char* c_code, int iPos);
    int rep_area(char* c_code, int iPos, const char* estr);
    // プリプロセッサの判定
    int ch_ditective(char* c_code, int iPos, unsigned char pre_c);
    // 関数の置き換え
    int ch_function(char* c_code, int iPos, unsigned char pre_c);
    int rep_function(char* c_code, int iPos, unsigned char pre_c);
    // キーワードの判定
    int ch_keyword(char* c_code, int iPos, unsigned char pre_c);

    // * Convert: c/c++ source to HTML document
    void Cpp2html();
    
public:
    // コンストラクタ
    Cpp2Html(int argc,char* argv[]);
    Cpp2Html(CSrcOption opt);
    Cpp2Html(int Hfmt=FMT_HTML, int t2s=DEFAULT_TAB2SPC , int swLine=SW_NOLINE);
    // デストラクタ
    ~Cpp2Html();

    // スタイルの変更
    void SetBodyColor(int color, int bgcolor);
    void SetFontFormat(FONT_TYPE type, int color, int weight, int style);
    
    // HTMLのコピー
    int CodeLen();
    void GetCode(char* dst);
    // ソースコードの読込み
    int ReadCode();
    void SetCode(char* src);
    int ReadFile(char* fname);
    // 変換実行
    int Convert();
    // 書き出し
    void WriteCode();
    // 解放
    void FreeCode();
};
inserted by FC2 system