157 } |
157 } |
158 char word[WORDBUF_SIZE]; |
158 char word[WORDBUF_SIZE]; |
159 memset(word, 0, WORDBUF_SIZE); |
159 memset(word, 0, WORDBUF_SIZE); |
160 size_t wp = 0; |
160 size_t wp = 0; |
161 int isstring = 0, iscomment = 0; |
161 int isstring = 0, iscomment = 0; |
|
162 static int iscommentml; |
162 int isescaping = 0; |
163 int isescaping = 0; |
|
164 |
|
165 if (iscommentml) { |
|
166 iscomment = 1; |
|
167 memcpy(&(dest[dp]), "<span class=\"c2html-comment\">", 29); |
|
168 dp += 29; |
|
169 } |
|
170 // a fucking /* comment */ |
|
171 /* again // / */ |
163 for (char c = src[sp] ; c ; c=src[++sp]) { |
172 for (char c = src[sp] ; c ; c=src[++sp]) { |
164 /* comments and strings */ |
173 /* comments */ |
165 if (!isescaping && (c == '\'' || c == '\"')) { |
174 if (c == '/') { |
166 isstring ^= 1; |
175 if (iscommentml && sp > 0 && src[sp-1] == '*') { |
167 if (isstring) { |
176 iscomment = 0; |
168 memcpy(&(dest[dp]), "<span class=\"c2html-string\">", 28); |
177 iscommentml = 0; |
169 dp += 28; |
178 memcpy(&(dest[dp]), "/</span>", 8); |
170 dp = writeescapedchar(dest, dp, c); |
179 dp += 8; |
171 } else { |
180 continue; |
172 dp = writeescapedchar(dest, dp, c); |
181 } else if (!iscomment && (src[sp+1] == '/' || src[sp+1] == '*')) { |
|
182 iscomment = 1; |
|
183 iscommentml = (src[sp+1] == '*'); |
|
184 memcpy(&(dest[dp]), "<span class=\"c2html-comment\">", 29); |
|
185 dp += 29; |
|
186 } |
|
187 } |
|
188 |
|
189 if (iscomment) { |
|
190 if (c == '\n') { |
173 memcpy(&(dest[dp]), "</span>", 7); |
191 memcpy(&(dest[dp]), "</span>", 7); |
174 dp += 7; |
192 dp += 7; |
175 } |
193 } |
|
194 dp = writeescapedchar(dest, dp, c); |
176 } else { |
195 } else { |
177 if (iscomment || isstring) { |
196 /* strings */ |
178 dp = writeescapedchar(dest, dp, c); |
197 if (!isescaping && (c == '\'' || c == '\"')) { |
179 } else if (!isalnum(c) && c != '_' && c != '#') { |
198 isstring ^= 1; |
180 /* interpret word int_t */ |
199 if (isstring) { |
181 if (wp > 0 && wp < WORDBUF_SIZE) { |
200 memcpy(&(dest[dp]), "<span class=\"c2html-string\">", 28); |
182 int closespan = 1; |
201 dp += 28; |
183 if (iskeyword(word)) { |
202 dp = writeescapedchar(dest, dp, c); |
184 memcpy(&(dest[dp]), "<span class=\"c2html-keyword\">", 29); |
203 } else { |
185 dp += 29; |
204 dp = writeescapedchar(dest, dp, c); |
186 } else if (istype(word, wp)) { |
205 memcpy(&(dest[dp]), "</span>", 7); |
187 memcpy(&(dest[dp]), "<span class=\"c2html-type\">", 26); |
206 dp += 7; |
188 dp += 26; |
207 } |
189 } else if (isdirective(word)) { |
208 } else { |
190 memcpy(&(dest[dp]), "<span class=\"c2html-directive\">", 31); |
209 if (isstring) { |
191 dp += 31; |
210 dp = writeescapedchar(dest, dp, c); |
|
211 } else if (!isalnum(c) && c != '_' && c != '#') { |
|
212 /* interpret word int_t */ |
|
213 if (wp > 0 && wp < WORDBUF_SIZE) { |
|
214 int closespan = 1; |
|
215 if (iskeyword(word)) { |
|
216 memcpy(&(dest[dp]), "<span class=\"c2html-keyword\">", 29); |
|
217 dp += 29; |
|
218 } else if (istype(word, wp)) { |
|
219 memcpy(&(dest[dp]), "<span class=\"c2html-type\">", 26); |
|
220 dp += 26; |
|
221 } else if (isdirective(word)) { |
|
222 memcpy(&(dest[dp]), "<span class=\"c2html-directive\">", 31); |
|
223 dp += 31; |
|
224 } else { |
|
225 closespan = 0; |
|
226 } |
|
227 for (int i = 0 ; i < wp ; i++) { |
|
228 dp = writeescapedchar(dest, dp, word[i]); |
|
229 } |
|
230 if (closespan) { |
|
231 memcpy(&(dest[dp]), "</span>", 7); |
|
232 dp += 7; |
|
233 } |
|
234 memset(word, 0, WORDBUF_SIZE); |
|
235 wp = 0; |
|
236 } |
|
237 dp = writeescapedchar(dest, dp, c); |
|
238 } else { |
|
239 /* read word */ |
|
240 if (wp < WORDBUF_SIZE) { |
|
241 word[wp++] = c; |
|
242 } else if (wp == WORDBUF_SIZE) { |
|
243 for (int i = 0 ; i < WORDBUF_SIZE ; i++) { |
|
244 dp = writeescapedchar(dest, dp, word[i]); |
|
245 } |
|
246 wp++; |
|
247 dp = writeescapedchar(dest, dp, c); |
192 } else { |
248 } else { |
193 closespan = 0; |
249 dp = writeescapedchar(dest, dp, c); |
194 } |
250 } |
195 for (int i = 0 ; i < wp ; i++) { |
|
196 dp = writeescapedchar(dest, dp, word[i]); |
|
197 } |
|
198 if (closespan) { |
|
199 memcpy(&(dest[dp]), "</span>", 7); |
|
200 dp += 7; |
|
201 } |
|
202 memset(word, 0, WORDBUF_SIZE); |
|
203 wp = 0; |
|
204 } |
251 } |
205 dp = writeescapedchar(dest, dp, c); |
252 } |
206 } else { |
253 |
207 /* read word */ |
254 isescaping = !isescaping & (c == '\\'); |
208 if (wp < WORDBUF_SIZE) { |
255 } |
209 word[wp++] = c; |
|
210 } else if (wp == WORDBUF_SIZE) { |
|
211 for (int i = 0 ; i < WORDBUF_SIZE ; i++) { |
|
212 dp = writeescapedchar(dest, dp, word[i]); |
|
213 } |
|
214 wp++; |
|
215 dp = writeescapedchar(dest, dp, c); |
|
216 } else { |
|
217 dp = writeescapedchar(dest, dp, c); |
|
218 } |
|
219 } |
|
220 } |
|
221 |
|
222 isescaping = !isescaping & (c == '\\'); |
|
223 } |
256 } |
224 dest[dp] = 0; |
257 dest[dp] = 0; |
225 } |
258 } |
226 |
259 |
227 void printhelp() { |
260 void printhelp() { |