#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];
int r = 0xff & (color>>16);
int g = 0xff & (color>>8);
int b = 0xff & color;
sprintf(s_color,"#%02x%02x%02x",r,g,b);
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;
sprintf(s_color,"#%02x%02x%02x",r,g,b);
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;
}
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);
}
};
class CSrcOption
{
public:
char cmd[256];
char fIn[MAX_PATH],fOut[MAX_PATH];
int Hdst;
int Hfmt;
int t2s;
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;
}
};
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];
char *Ccode,*Hcode;
char *kwd_table[CPP_KWD_MAX],*pp_table[CPP_KWD_MAX];
int kwd_len[CPP_KWD_MAX],pp_len[CPP_KWD_MAX];
void usage();
int ReadArg(int argc, char* argv[], CSrcOption& cmdopt);
void InitClass();
void SortKwd();
void Html_headout();
void Html_footout();
void Html_codeout();
int Initbuf(int buflen);
void PushLine();
void strpush(const char* buf);
void charpush(const char buf);
int htmlsym_sch(char c);
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);
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);
int CodeLen();
void GetCode(char* dst);
int ReadCode();
void SetCode(char* src);
int ReadFile(char* fname);
int Convert();
void WriteCode();
void FreeCode();
};