1 : 	#include <windows.h>
     2 : 	#include <mbstring.h>
     3 : 	
     4 : 	#include "c2html.h"
     5 : 	
     6 : 	char k_ReserveList[][50] =
     7 : 	{
     8 : 		"case",
     9 : 		"break",
    10 : 		"and",
    11 : 		"and_eq",
    12 : 		"asm",
    13 : 		"auto",
    14 : 		"bitand",
    15 : 		"bitor",
    16 : 		"bool",
    17 : 		"break",
    18 : 		"case",
    19 : 		"catch",
    20 : 		"char",
    21 : 		"class",
    22 : 		"compl",
    23 : 		"const",
    24 : 		"const_cast",
    25 : 		"continue",
    26 : 		"default",
    27 : 		"delete",
    28 : 		"do",
    29 : 		"double",
    30 : 		"dynamic_cast",
    31 : 		"else",
    32 : 		"enum",
    33 : 		"explicit",
    34 : 		"export",
    35 : 		"extern",
    36 : 		"false",
    37 : 		"float",
    38 : 		"for",
    39 : 		"friend",
    40 : 		"goto",
    41 : 		"if",
    42 : 		"inline",
    43 : 		"int",
    44 : 		"long",
    45 : 		"mutable",
    46 : 		"namespace",
    47 : 		"new",
    48 : 		"not",
    49 : 		"not_eq",
    50 : 		"operator",
    51 : 		"or",
    52 : 		"or_eq",
    53 : 		"private",
    54 : 		"protected",
    55 : 		"public",
    56 : 		"register",
    57 : 		"reinterpret_cast",
    58 : 		"return",
    59 : 		"short",
    60 : 		"signed",
    61 : 		"sizeof",
    62 : 		"static",
    63 : 		"static_cast",
    64 : 		"struct",
    65 : 		"switch",
    66 : 		"template",
    67 : 		"this",
    68 : 		"throw",
    69 : 		"true",
    70 : 		"try",
    71 : 		"typedef",
    72 : 		"typeid",
    73 : 		"typename",
    74 : 		"union",
    75 : 		"unsigned",
    76 : 		"using",
    77 : 		"virtual",
    78 : 		"void",
    79 : 		"volatile",
    80 : 		"wchar_t",
    81 : 		"while",
    82 : 		"xor",
    83 : 		"xor_eq",
    84 : 	
    85 : 		"",
    86 : 	};
    87 : 	
    88 : 	
    89 : 	char k_ReserveListPps[][50] =
    90 : 	{
    91 : 		"define",
    92 : 		"error",
    93 : 		"import",
    94 : 		"undef",
    95 : 		"elif",
    96 : 		"if",
    97 : 		"include",
    98 : 		"else",
    99 : 		"ifdef",
   100 : 		"line",  
   101 : 		"endif",
   102 : 		"ifndef",
   103 : 		"pragma",
   104 : 		"",
   105 : 	
   106 : 	};
   107 : 	/*
   108 : 	auto const double float int short struct unsigned 
   109 : 	break  continue else   for   long   signed  switch  void   
   110 : 	case default enum goto register sizeof typedef volatile 
   111 : 	char do extern if return static union while 
   112 : 	
   113 : 	
   114 : 	  */
   115 : 	C2Html::C2Html(){
   116 : 		m_szBuffer = NULL;
   117 : 		strcpy(m_szColorLineNo,"#e0e0e0");
   118 : 	
   119 : 	}
   120 : 	
   121 : 	C2Html::~C2Html(){
   122 : 		ReleaseSrc();
   123 : 	}
   124 : 	
   125 : 	
   126 : 	
   127 : 	BOOL C2Html::LoasSrc(LPCSTR lpcFile)
   128 : 	{
   129 : 	
   130 : 	//	char szCFile[] = "main.cpp";
   131 : 		HANDLE hFileC;
   132 : 		//ファイルを開く
   133 : 		hFileC = ::CreateFile(lpcFile,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
   134 : 		if(hFileC==INVALID_HANDLE_VALUE ) {
   135 : 			
   136 : 			return FALSE;
   137 : 		}
   138 : 		DWORD dwFilesize = ::GetFileSize(hFileC,NULL);
   139 : 		DWORD dwBytesRead = 0;
   140 : 		m_szBuffer = (char*)GlobalAlloc(GMEM_FIXED|GMEM_ZEROINIT,dwFilesize+50);
   141 : 		ReadFile(hFileC,m_szBuffer,dwFilesize,&dwBytesRead,NULL);
   142 : 		m_szBuffer[dwBytesRead] = '\0';
   143 : 		CloseHandle(hFileC);
   144 : 	
   145 : 	
   146 : 		return TRUE;
   147 : 	}
   148 : 	
   149 : 	BOOL C2Html::ReleaseSrc()
   150 : 	{
   151 : 		if(m_szBuffer){
   152 : 			GlobalFree(m_szBuffer);
   153 : 			m_szBuffer = NULL;
   154 : 		}
   155 : 		return TRUE;
   156 : 	}
   157 : 	
   158 : 	BOOL C2Html::Convert(LPCSTR lpcFile,LPCSTR lpcTitle)
   159 : 	{
   160 : 		LPSTR pBuffer = m_szBuffer;
   161 : 	
   162 : 		if(!OpenBuffer(lpcFile)) return FALSE;
   163 : 	
   164 : 		char szBuf[200];
   165 : 		int iLineNo=0;
   166 : 		BOOL fNewLine = TRUE;
   167 : 		BOOL fCCommentOpen = FALSE;
   168 : 		BOOL fMCommentOpen = FALSE;
   169 : 		BOOL fStringOpen = FALSE;
   170 : 		BOOL fEsc=FALSE;//次の文字エスケープ
   171 : 		BOOL fPreprocessor = FALSE; //#がある
   172 : 	
   173 : 		AddBuffer(
   174 : 			"<html><head>"
   175 : 			"<title>");
   176 : 		AddBuffer(lpcTitle);
   177 : 		AddBuffer(
   178 : 			"</title>\r\n"
   179 : 			"<meta http-equiv=\"content-type\" content=\"text/html; charset=shift_jis\">\r\n"
   180 : 			"<meta http-equiv=\"content-style-type\" content=\"text/css\">\r\n"
   181 : 			"<style type=\"text/css\">\r\n"
   182 : 			"BODY {font-size: 9.0pt}\r\n"
   183 : 			"PRE {font-size: 9.0pt}\r\n"
   184 : 			".c2h_line {color: #a0a0a0}\r\n"
   185 : 			".c2h_comment {color: #008000}\r\n"
   186 : 			".c2h_reserve {color: #0000ff}\r\n"
   187 : 			"</style>\r\n"
   188 : 			"<body>\r\n");
   189 : 	
   190 : 	
   191 : 		AddBuffer("<pre>\r\n");
   192 : 		while(1){
   193 : 			if(pBuffer[0] == '\0'){	
   194 : 				break;
   195 : 			}
   196 : 	
   197 : 			/////
   198 : 	
   199 : 			if(fNewLine){
   200 : 				fNewLine = FALSE;
   201 : 				iLineNo++;
   202 : 				if(m_fDrawLine){
   203 : 					wsprintf(szBuf,"<FONT CLASS=c2h_line>%6d :</FONT> \t",iLineNo);
   204 : 					AddBuffer(szBuf);
   205 : 				}
   206 : 				fEsc = FALSE;
   207 : 			}else{
   208 : 				if(pBuffer[-1] == '\\' && pBuffer[-2] != '\\'){
   209 : 					fEsc = TRUE;
   210 : 				}else{
   211 : 					fEsc = FALSE;
   212 : 				}
   213 : 				
   214 : 			}
   215 : 	
   216 : 			//コメント
   217 : 			if( fStringOpen == FALSE){
   218 : 				if(pBuffer[0] == '/' && pBuffer[1] == '*'){	
   219 : 					if(fMCommentOpen == FALSE){
   220 : 						
   221 : 						fMCommentOpen = TRUE;
   222 : 	
   223 : 						wsprintf(szBuf,"<FONT CLASS=c2h_comment>/*");
   224 : 						AddBuffer(szBuf);
   225 : 						pBuffer+=2;
   226 : 						continue;
   227 : 					}
   228 : 				}else if(pBuffer[0] == '*' && pBuffer[1] == '/'){	
   229 : 					if(fMCommentOpen == TRUE){
   230 : 						wsprintf(szBuf,"*/</FONT>");
   231 : 						AddBuffer(szBuf);
   232 : 						fMCommentOpen = FALSE;
   233 : 						pBuffer+=2;
   234 : 						continue;
   235 : 					}
   236 : 				}
   237 : 				//C++コメント
   238 : 	
   239 : 				if(pBuffer[0] == '/' && pBuffer[1] == '/'){	
   240 : 					if(fCCommentOpen == FALSE && fMCommentOpen == FALSE){
   241 : 						fCCommentOpen = TRUE;
   242 : 						wsprintf(szBuf,"<FONT CLASS=c2h_comment>//");
   243 : 						AddBuffer(szBuf);
   244 : 						pBuffer+=2;
   245 : 						continue;
   246 : 					}
   247 : 				}else if(pBuffer[0] == '\r' || pBuffer[0] == '\n'){	
   248 : 					
   249 : 					if(fCCommentOpen && fMCommentOpen == FALSE){
   250 : 						wsprintf(szBuf,"</FONT>");
   251 : 						AddBuffer(szBuf);
   252 : 						fCCommentOpen = FALSE;
   253 : 					}
   254 : 					
   255 : 				}
   256 : 			}
   257 : 			//文字列内?
   258 : 			if(fCCommentOpen == FALSE && fMCommentOpen == FALSE){
   259 : 				if(pBuffer[0] == '\"' && fEsc == FALSE){	
   260 : 					if(fStringOpen == FALSE){
   261 : 						fStringOpen = TRUE;
   262 : 					}else{
   263 : 						fStringOpen = FALSE;
   264 : 					}
   265 : 				}
   266 : 			}
   267 : 			//#
   268 : 			if(fCCommentOpen == FALSE && fMCommentOpen == FALSE && fStringOpen == FALSE){
   269 : 				if(pBuffer[0] == '#'){
   270 : 					fPreprocessor = TRUE;
   271 : 					wsprintf(szBuf,"<FONT CLASS=c2h_reserve>#</FONT>");
   272 : 					AddBuffer(szBuf);
   273 : 					pBuffer+=1;
   274 : 					continue;
   275 : 				}
   276 : 			}
   277 : 	
   278 : 			//予約語 _mbsnbcmp_mbsnbcmp
   279 : 			if(fCCommentOpen == FALSE && fMCommentOpen == FALSE && fStringOpen == FALSE){
   280 : 	
   281 : 		//		char lpRev[] = "case";
   282 : 		//		char iLen = strlen(lpRev);
   283 : 				//単語であるかのチェック
   284 : 				BOOL fPrevOk = TRUE;
   285 : 				BOOL fNextOk = TRUE;
   286 : 				if(fNewLine == FALSE){
   287 : 					fPrevOk = IsNotWord(pBuffer[-1]);
   288 : 				}
   289 : 	
   290 : 				for(int i=0;1;i++){
   291 : 					char* lpRev =k_ReserveList[i];
   292 : 					char iLen = strlen(lpRev);
   293 : 					if(iLen <=0) break;
   294 : 	
   295 : 					fNextOk = IsNotWord(pBuffer[iLen]);
   296 : 	
   297 : 					if(fPrevOk == FALSE || fNextOk== FALSE) continue;
   298 : 	
   299 : 					if(_mbsnbcmp((const unsigned char *)pBuffer,(const unsigned char *)lpRev,iLen)==0){
   300 : 						wsprintf(szBuf,"<FONT CLASS=c2h_reserve>%s</FONT>",lpRev);
   301 : 						AddBuffer(szBuf);
   302 : 						pBuffer+=iLen;
   303 : 						continue;
   304 : 					}
   305 : 				}
   306 : 	
   307 : 				fPrevOk = TRUE;
   308 : 				fNextOk = TRUE;
   309 : 				if(fNewLine == FALSE){
   310 : 					fPrevOk = IsNotWord(pBuffer[-1]);
   311 : 				}
   312 : 				for(i=0;1;i++){
   313 : 					char* lpRev =k_ReserveListPps[i];
   314 : 					char iLen = strlen(lpRev);
   315 : 					if(iLen <=0) break;
   316 : 	
   317 : 					fNextOk = IsNotWord(pBuffer[iLen]);
   318 : 	
   319 : 					if(fPrevOk == FALSE || fNextOk== FALSE) continue;
   320 : 	
   321 : 					if(_mbsnbcmp((const unsigned char *)pBuffer,(const unsigned char *)lpRev,iLen)==0){
   322 : 						wsprintf(szBuf,"<FONT CLASS=c2h_reserve>%s</FONT>",lpRev);
   323 : 						AddBuffer(szBuf);
   324 : 						pBuffer+=iLen;
   325 : 						continue;
   326 : 					}
   327 : 				}
   328 : 	
   329 : 			}
   330 : 	
   331 : 	
   332 : 			////////
   333 : 			if(pBuffer[0] == '<'){
   334 : 				AddBuffer("&lt;",4);
   335 : 			}else if(pBuffer[0] == '>'){
   336 : 				AddBuffer("&gt;",4);
   337 : 			}else if(pBuffer[0] == '&'){
   338 : 				AddBuffer("&amp;",5);
   339 : 			}else{
   340 : 				AddBuffer(&pBuffer[0],1);
   341 : 			}
   342 : 	
   343 : 			////////
   344 : 	
   345 : 			
   346 : 			if(pBuffer[0] == '\n'){	
   347 : 				fNewLine = TRUE;
   348 : 				fPreprocessor = FALSE;
   349 : 			}
   350 : 	
   351 : 	
   352 : 			
   353 : 			pBuffer++;
   354 : 		}
   355 : 		AddBuffer("</pre>\r\n");
   356 : 	
   357 : 	
   358 : 		AddBuffer("</body></html>\r\n");
   359 : 	
   360 : 	
   361 : 		CloseBuffer();
   362 : 	
   363 : 		return TRUE;
   364 : 	}
   365 : 	
   366 : 	
   367 : 	BOOL C2Html::IsNotWord(char c){
   368 : 		if(c >= 'a' && c <= 'z'){
   369 : 			return FALSE;
   370 : 		}else if(c >= 'A' && c <= 'Z'){
   371 : 			return FALSE;
   372 : 		}else if(c >= '0' && c <= '9'){
   373 : 			return FALSE;
   374 : 		}
   375 : 		return TRUE;
   376 : 	}
   377 : 	
   378 : 	BOOL C2Html::AddBuffer(LPCSTR lpcStr,DWORD dwSize)
   379 : 	{
   380 : 		DWORD ByteWrite;
   381 : 		if(dwSize == 0){
   382 : 			dwSize = strlen(lpcStr);
   383 : 		}
   384 : 		::WriteFile(m_hFileDest,lpcStr,dwSize,&ByteWrite,NULL);
   385 : 	
   386 : 		return TRUE;
   387 : 	}
   388 : 	
   389 : 	BOOL C2Html::OpenBuffer(LPCSTR lpcFile)
   390 : 	{
   391 : 		m_hFileDest = ::CreateFile(lpcFile,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
   392 : 		if(m_hFileDest==INVALID_HANDLE_VALUE ) {
   393 : 			
   394 : 			return FALSE;
   395 : 		}
   396 : 	
   397 : 	
   398 : 		return TRUE;
   399 : 	}
   400 : 	
   401 : 	BOOL C2Html::CloseBuffer()
   402 : 	{
   403 : 	
   404 : 		::CloseHandle(m_hFileDest);
   405 : 		return TRUE;
   406 : 	}