src/c2html.c

changeset 8
417cd3b29f97
parent 7
02cf8ac736e6
child 9
6b1fba10c4cb
--- a/src/c2html.c	Fri Jun 21 11:42:18 2013 +0200
+++ b/src/c2html.c	Fri Jun 21 12:27:45 2013 +0200
@@ -159,67 +159,100 @@
   memset(word, 0, WORDBUF_SIZE);
   size_t wp = 0;
   int isstring = 0, iscomment = 0;
+  static int iscommentml;
   int isescaping = 0;
+  
+  if (iscommentml) {
+    iscomment = 1;
+    memcpy(&(dest[dp]), "<span class=\"c2html-comment\">", 29);
+    dp += 29;
+  }
+  // a fucking /* comment */
+  /* again // / */
   for (char c = src[sp] ; c ; c=src[++sp]) {
-    /* comments and strings */
-    if (!isescaping && (c == '\'' || c == '\"')) {
-      isstring ^= 1;
-      if (isstring) {
-        memcpy(&(dest[dp]), "<span class=\"c2html-string\">", 28);
-        dp += 28;
-        dp = writeescapedchar(dest, dp, c);
-      } else {
-        dp = writeescapedchar(dest, dp, c);
+    /* comments */
+    if (c == '/') {
+      if (iscommentml && sp > 0 && src[sp-1] == '*') {
+        iscomment = 0;
+        iscommentml = 0;
+        memcpy(&(dest[dp]), "/</span>", 8);
+        dp += 8;
+        continue;
+      } else if (!iscomment && (src[sp+1] == '/' || src[sp+1] == '*')) {
+        iscomment = 1;
+        iscommentml = (src[sp+1] == '*');
+        memcpy(&(dest[dp]), "<span class=\"c2html-comment\">", 29);
+        dp += 29;
+      }
+    }
+    
+    if (iscomment) {
+      if (c == '\n') {
         memcpy(&(dest[dp]), "</span>", 7);
         dp += 7;
       }
+      dp = writeescapedchar(dest, dp, c);
     } else {
-      if (iscomment || isstring) {
-        dp = writeescapedchar(dest, dp, c);
-      } else if (!isalnum(c) && c != '_' && c != '#') {
-        /* interpret word int_t */
-        if (wp > 0 && wp < WORDBUF_SIZE) {
-          int closespan = 1;
-          if (iskeyword(word)) {
-            memcpy(&(dest[dp]), "<span class=\"c2html-keyword\">", 29);
-            dp += 29;
-          } else if (istype(word, wp)) {
-            memcpy(&(dest[dp]), "<span class=\"c2html-type\">", 26);
-            dp += 26;
-          } else if (isdirective(word)) {
-            memcpy(&(dest[dp]), "<span class=\"c2html-directive\">", 31);
-            dp += 31;
-          } else {
-            closespan = 0;
-          }
-          for (int i = 0 ; i < wp ; i++) {
-            dp = writeescapedchar(dest, dp, word[i]);
-          }
-          if (closespan) {
-            memcpy(&(dest[dp]), "</span>", 7);
-            dp += 7;
-          }
-          memset(word, 0, WORDBUF_SIZE);
-          wp = 0;
-        }
-        dp = writeescapedchar(dest, dp, c);
-      } else {
-        /* read word */
-        if (wp < WORDBUF_SIZE) {
-          word[wp++] = c;
-        } else if (wp == WORDBUF_SIZE) {
-          for (int i = 0 ; i < WORDBUF_SIZE ; i++) {
-            dp = writeescapedchar(dest, dp, word[i]);
-          }
-          wp++;
+      /* strings */
+      if (!isescaping && (c == '\'' || c == '\"')) {
+        isstring ^= 1;
+        if (isstring) {
+          memcpy(&(dest[dp]), "<span class=\"c2html-string\">", 28);
+          dp += 28;
           dp = writeescapedchar(dest, dp, c);
         } else {
           dp = writeescapedchar(dest, dp, c);
+          memcpy(&(dest[dp]), "</span>", 7);
+          dp += 7;
+        }
+      } else {
+        if (isstring) {
+          dp = writeescapedchar(dest, dp, c);
+        } else if (!isalnum(c) && c != '_' && c != '#') {
+          /* interpret word int_t */
+          if (wp > 0 && wp < WORDBUF_SIZE) {
+            int closespan = 1;
+            if (iskeyword(word)) {
+              memcpy(&(dest[dp]), "<span class=\"c2html-keyword\">", 29);
+              dp += 29;
+            } else if (istype(word, wp)) {
+              memcpy(&(dest[dp]), "<span class=\"c2html-type\">", 26);
+              dp += 26;
+            } else if (isdirective(word)) {
+              memcpy(&(dest[dp]), "<span class=\"c2html-directive\">", 31);
+              dp += 31;
+            } else {
+              closespan = 0;
+            }
+            for (int i = 0 ; i < wp ; i++) {
+              dp = writeescapedchar(dest, dp, word[i]);
+            }
+            if (closespan) {
+              memcpy(&(dest[dp]), "</span>", 7);
+              dp += 7;
+            }
+            memset(word, 0, WORDBUF_SIZE);
+            wp = 0;
+          }
+          dp = writeescapedchar(dest, dp, c);
+        } else {
+          /* read word */
+          if (wp < WORDBUF_SIZE) {
+            word[wp++] = c;
+          } else if (wp == WORDBUF_SIZE) {
+            for (int i = 0 ; i < WORDBUF_SIZE ; i++) {
+              dp = writeescapedchar(dest, dp, word[i]);
+            }
+            wp++;
+            dp = writeescapedchar(dest, dp, c);
+          } else {
+            dp = writeescapedchar(dest, dp, c);
+          }
         }
       }
+
+      isescaping = !isescaping & (c == '\\');
     }
-    
-    isescaping = !isescaping & (c == '\\');
   }
   dest[dp] = 0;
 }

mercurial