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 :
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 :
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 :
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 :
279 : if(fCCommentOpen == FALSE && fMCommentOpen == FALSE && fStringOpen == FALSE){
280 :
281 :
282 :
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("<",4);
335 : }else if(pBuffer[0] == '>'){
336 : AddBuffer(">",4);
337 : }else if(pBuffer[0] == '&'){
338 : AddBuffer("&",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 : }