1.1 --- a/src/c2html.c Fri Jun 21 11:42:18 2013 +0200 1.2 +++ b/src/c2html.c Fri Jun 21 12:27:45 2013 +0200 1.3 @@ -159,67 +159,100 @@ 1.4 memset(word, 0, WORDBUF_SIZE); 1.5 size_t wp = 0; 1.6 int isstring = 0, iscomment = 0; 1.7 + static int iscommentml; 1.8 int isescaping = 0; 1.9 + 1.10 + if (iscommentml) { 1.11 + iscomment = 1; 1.12 + memcpy(&(dest[dp]), "<span class=\"c2html-comment\">", 29); 1.13 + dp += 29; 1.14 + } 1.15 + // a fucking /* comment */ 1.16 + /* again // / */ 1.17 for (char c = src[sp] ; c ; c=src[++sp]) { 1.18 - /* comments and strings */ 1.19 - if (!isescaping && (c == '\'' || c == '\"')) { 1.20 - isstring ^= 1; 1.21 - if (isstring) { 1.22 - memcpy(&(dest[dp]), "<span class=\"c2html-string\">", 28); 1.23 - dp += 28; 1.24 - dp = writeescapedchar(dest, dp, c); 1.25 - } else { 1.26 - dp = writeescapedchar(dest, dp, c); 1.27 + /* comments */ 1.28 + if (c == '/') { 1.29 + if (iscommentml && sp > 0 && src[sp-1] == '*') { 1.30 + iscomment = 0; 1.31 + iscommentml = 0; 1.32 + memcpy(&(dest[dp]), "/</span>", 8); 1.33 + dp += 8; 1.34 + continue; 1.35 + } else if (!iscomment && (src[sp+1] == '/' || src[sp+1] == '*')) { 1.36 + iscomment = 1; 1.37 + iscommentml = (src[sp+1] == '*'); 1.38 + memcpy(&(dest[dp]), "<span class=\"c2html-comment\">", 29); 1.39 + dp += 29; 1.40 + } 1.41 + } 1.42 + 1.43 + if (iscomment) { 1.44 + if (c == '\n') { 1.45 memcpy(&(dest[dp]), "</span>", 7); 1.46 dp += 7; 1.47 } 1.48 + dp = writeescapedchar(dest, dp, c); 1.49 } else { 1.50 - if (iscomment || isstring) { 1.51 - dp = writeescapedchar(dest, dp, c); 1.52 - } else if (!isalnum(c) && c != '_' && c != '#') { 1.53 - /* interpret word int_t */ 1.54 - if (wp > 0 && wp < WORDBUF_SIZE) { 1.55 - int closespan = 1; 1.56 - if (iskeyword(word)) { 1.57 - memcpy(&(dest[dp]), "<span class=\"c2html-keyword\">", 29); 1.58 - dp += 29; 1.59 - } else if (istype(word, wp)) { 1.60 - memcpy(&(dest[dp]), "<span class=\"c2html-type\">", 26); 1.61 - dp += 26; 1.62 - } else if (isdirective(word)) { 1.63 - memcpy(&(dest[dp]), "<span class=\"c2html-directive\">", 31); 1.64 - dp += 31; 1.65 - } else { 1.66 - closespan = 0; 1.67 - } 1.68 - for (int i = 0 ; i < wp ; i++) { 1.69 - dp = writeescapedchar(dest, dp, word[i]); 1.70 - } 1.71 - if (closespan) { 1.72 - memcpy(&(dest[dp]), "</span>", 7); 1.73 - dp += 7; 1.74 - } 1.75 - memset(word, 0, WORDBUF_SIZE); 1.76 - wp = 0; 1.77 - } 1.78 - dp = writeescapedchar(dest, dp, c); 1.79 - } else { 1.80 - /* read word */ 1.81 - if (wp < WORDBUF_SIZE) { 1.82 - word[wp++] = c; 1.83 - } else if (wp == WORDBUF_SIZE) { 1.84 - for (int i = 0 ; i < WORDBUF_SIZE ; i++) { 1.85 - dp = writeescapedchar(dest, dp, word[i]); 1.86 - } 1.87 - wp++; 1.88 + /* strings */ 1.89 + if (!isescaping && (c == '\'' || c == '\"')) { 1.90 + isstring ^= 1; 1.91 + if (isstring) { 1.92 + memcpy(&(dest[dp]), "<span class=\"c2html-string\">", 28); 1.93 + dp += 28; 1.94 dp = writeescapedchar(dest, dp, c); 1.95 } else { 1.96 dp = writeescapedchar(dest, dp, c); 1.97 + memcpy(&(dest[dp]), "</span>", 7); 1.98 + dp += 7; 1.99 + } 1.100 + } else { 1.101 + if (isstring) { 1.102 + dp = writeescapedchar(dest, dp, c); 1.103 + } else if (!isalnum(c) && c != '_' && c != '#') { 1.104 + /* interpret word int_t */ 1.105 + if (wp > 0 && wp < WORDBUF_SIZE) { 1.106 + int closespan = 1; 1.107 + if (iskeyword(word)) { 1.108 + memcpy(&(dest[dp]), "<span class=\"c2html-keyword\">", 29); 1.109 + dp += 29; 1.110 + } else if (istype(word, wp)) { 1.111 + memcpy(&(dest[dp]), "<span class=\"c2html-type\">", 26); 1.112 + dp += 26; 1.113 + } else if (isdirective(word)) { 1.114 + memcpy(&(dest[dp]), "<span class=\"c2html-directive\">", 31); 1.115 + dp += 31; 1.116 + } else { 1.117 + closespan = 0; 1.118 + } 1.119 + for (int i = 0 ; i < wp ; i++) { 1.120 + dp = writeescapedchar(dest, dp, word[i]); 1.121 + } 1.122 + if (closespan) { 1.123 + memcpy(&(dest[dp]), "</span>", 7); 1.124 + dp += 7; 1.125 + } 1.126 + memset(word, 0, WORDBUF_SIZE); 1.127 + wp = 0; 1.128 + } 1.129 + dp = writeescapedchar(dest, dp, c); 1.130 + } else { 1.131 + /* read word */ 1.132 + if (wp < WORDBUF_SIZE) { 1.133 + word[wp++] = c; 1.134 + } else if (wp == WORDBUF_SIZE) { 1.135 + for (int i = 0 ; i < WORDBUF_SIZE ; i++) { 1.136 + dp = writeescapedchar(dest, dp, word[i]); 1.137 + } 1.138 + wp++; 1.139 + dp = writeescapedchar(dest, dp, c); 1.140 + } else { 1.141 + dp = writeescapedchar(dest, dp, c); 1.142 + } 1.143 } 1.144 } 1.145 + 1.146 + isescaping = !isescaping & (c == '\\'); 1.147 } 1.148 - 1.149 - isescaping = !isescaping & (c == '\\'); 1.150 } 1.151 dest[dp] = 0; 1.152 }