src/highlighter.c

changeset 54
b3f24e23bc25
parent 53
5e47a26a16f0
child 55
bf54085ce341
equal deleted inserted replaced
53:5e47a26a16f0 54:b3f24e23bc25
50 static void put_htmlescaped(UcxBuffer *dest, char c) { 50 static void put_htmlescaped(UcxBuffer *dest, char c) {
51 if (c == '>') { 51 if (c == '>') {
52 ucx_buffer_puts(dest, ">"); 52 ucx_buffer_puts(dest, ">");
53 } else if (c == '<') { 53 } else if (c == '<') {
54 ucx_buffer_puts(dest, "&lt;"); 54 ucx_buffer_puts(dest, "&lt;");
55 } else { 55 } else if (c) {
56 ucx_buffer_putc(dest, c); 56 ucx_buffer_putc(dest, c);
57 } 57 }
58 } 58 }
59 59
60 static void put_htmlescapedstr(UcxBuffer *dest, sstr_t s) { 60 static void put_htmlescapedstr(UcxBuffer *dest, sstr_t s) {
124 } 124 }
125 125
126 char c; 126 char c;
127 do { 127 do {
128 c = src[++sp]; 128 c = src[++sp];
129 if (!c) {
130 /* TODO: might cause problems if code file does not end with NL */
131 break;
132 }
133 129
134 /* comments */ 130 /* comments */
135 if (!isstring && c == '/') { 131 if (!isstring && c == '/') {
136 if (hd->multiline_comment && sp > 0 && src[sp-1] == '*') { 132 if (hd->multiline_comment && sp > 0 && src[sp-1] == '*') {
137 iscomment = 0; 133 iscomment = 0;
193 put_htmlescaped(dest, c); 189 put_htmlescaped(dest, c);
194 } 190 }
195 } else { 191 } else {
196 if (isstring) { 192 if (isstring) {
197 put_htmlescaped(dest, c); 193 put_htmlescaped(dest, c);
198 } else if (!isalnum(c) && c!='_' && c!='#') { 194 } else if (isalnum(c) || c == '_' || c == '#') {
195 /* buffer the current word */
196 ucx_buffer_putc(wbuf, c);
197 } else {
199 /* write buffered word, if any */ 198 /* write buffered word, if any */
200 if (wbuf->size > 0) { 199 if (wbuf->size > 0) {
201 sstr_t word = sstrn(wbuf->space, wbuf->size); 200 sstr_t word = sstrn(wbuf->space, wbuf->size);
202 int closespan = 1; 201 int closespan = 1;
203 sstr_t typesuffix = ST("_t"); 202 sstr_t typesuffix = ST("_t");
224 } 223 }
225 wbuf->pos = wbuf->size = 0; /* reset word buffer */ 224 wbuf->pos = wbuf->size = 0; /* reset word buffer */
226 225
227 /* write current character */ 226 /* write current character */
228 put_htmlescaped(dest, c); 227 put_htmlescaped(dest, c);
229 } else {
230 /* buffer the current word */
231 ucx_buffer_putc(wbuf, c);
232 } 228 }
233 } 229 }
234 230
235 isescaping = !isescaping & (c == '\\'); 231 isescaping = !isescaping & (c == '\\');
236 } 232 }
237 } while (c != '\n'); 233 } while (c && c != '\n');
238 } 234 }
239 235
240 /* Java Highlighter */ 236 /* Java Highlighter */
241 237
242 static const char* jkeywords[] = { 238 static const char* jkeywords[] = {
269 } 265 }
270 266
271 char c; 267 char c;
272 do { 268 do {
273 c = src[++sp]; 269 c = src[++sp];
274 if (!c) {
275 /* TODO: might cause problems if code file does not end with NL */
276 break;
277 }
278 270
279 /* comments */ 271 /* comments */
280 if (!isstring && c == '/') { 272 if (!isstring && c == '/') {
281 if (hd->multiline_comment && sp > 0 && src[sp-1] == '*') { 273 if (hd->multiline_comment && sp > 0 && src[sp-1] == '*') {
282 iscomment = 0; 274 iscomment = 0;
317 put_htmlescaped(dest, c); 309 put_htmlescaped(dest, c);
318 } 310 }
319 } else { 311 } else {
320 if (isstring) { 312 if (isstring) {
321 put_htmlescaped(dest, c); 313 put_htmlescaped(dest, c);
322 } else if (!isalnum(c) && c!='_' && c!='@') { 314 } else if (isalnum(c) || c == '_' || c == '@') {
315 /* buffer the current word */
316 ucx_buffer_putc(wbuf, c);
317 } else {
323 /* write buffered word, if any */ 318 /* write buffered word, if any */
324 if (wbuf->size > 0) { 319 if (wbuf->size > 0) {
325 sstr_t word = sstrn(wbuf->space, wbuf->size); 320 sstr_t word = sstrn(wbuf->space, wbuf->size);
326 int closespan = 1; 321 int closespan = 1;
327 if (check_keyword(word, jkeywords)) { 322 if (check_keyword(word, jkeywords)) {
347 } 342 }
348 wbuf->pos = wbuf->size = 0; /* reset buffer */ 343 wbuf->pos = wbuf->size = 0; /* reset buffer */
349 344
350 /* write current character */ 345 /* write current character */
351 put_htmlescaped(dest, c); 346 put_htmlescaped(dest, c);
352 } else {
353 /* buffer the current word */
354 ucx_buffer_putc(wbuf, c);
355 } 347 }
356 } 348 }
357 349
358 isescaping = !isescaping & (c == '\\'); 350 isescaping = !isescaping & (c == '\\');
359 } 351 }
360 } while (c != '\n'); 352 } while (c && c != '\n');
361 } 353 }
362 354

mercurial