--- a/src/javacodegen.c Thu Aug 25 11:30:30 2016 +0200 +++ b/src/javacodegen.c Thu Aug 25 12:16:57 2016 +0200 @@ -39,19 +39,21 @@ "volatile", "const", "float", "native", "super", "while", NULL }; -void java_highlighter(char *src, UcxBuffer *dest, int *multiline_comment) { +void java_highlighter(char *src, UcxBuffer *dest, HighlighterData *hd) { + /* reset buffers without clearing them */ + hd->primary_buffer->size = hd->primary_buffer->pos = 0; + hd->secondary_buffer->size = hd->secondary_buffer->pos = 0; - /* TODO: try to replace this buffer */ - char wordbuf[WORDBUF_SIZE]; - sstr_t word; - word.ptr = wordbuf; word.length = 0; + /* alias the buffers for better handling */ + UcxBuffer *wbuf = hd->primary_buffer; + /* local information */ size_t sp = (size_t)-1; int isstring = 0, iscomment = 0, isimport = 0; char quote = '\0'; int isescaping = 0; - if (*multiline_comment) { + if (hd->multiline_comment) { iscomment = 1; ucx_buffer_puts(dest, "<span class=\"c2html-comment\">"); } @@ -63,14 +65,14 @@ /* comments */ if (!isstring && c == '/') { - if (*multiline_comment && sp > 0 && src[sp-1] == '*') { + if (hd->multiline_comment && sp > 0 && src[sp-1] == '*') { iscomment = 0; - *multiline_comment = 0; + hd->multiline_comment = 0; ucx_buffer_puts(dest, "/</span>"); continue; } else if (!iscomment && (src[sp+1] == '/' || src[sp+1] == '*')) { iscomment = 1; - *multiline_comment = (src[sp+1] == '*'); + hd->multiline_comment = (src[sp+1] == '*'); ucx_buffer_puts(dest, "<span class=\"c2html-comment\">"); } } @@ -104,8 +106,10 @@ } else { if (isstring) { put_htmlescaped(dest, c); - } else if (!isalnum(c) && c!='_' && c!='#' && c!='@') { - if (word.length > 0 && word.length < WORDBUF_SIZE) { + } else if (!isalnum(c) && c!='_' && c!='@') { + /* write buffered word, if any */ + if (wbuf->size > 0) { + sstr_t word = sstrn(wbuf->space, wbuf->size); int closespan = 1; if (check_keyword(word, jkeywords)) { ucx_buffer_puts(dest, @@ -128,20 +132,13 @@ ucx_buffer_puts(dest, "</span>"); } } - word.length = 0; + wbuf->pos = wbuf->size = 0; /* reset buffer */ + + /* write current character */ put_htmlescaped(dest, c); } else { - /* read word */ - if (word.length < WORDBUF_SIZE) { - word.ptr[word.length++] = c; - } else if (word.length == WORDBUF_SIZE) { - /* TODO: this will be removed */ - ucx_buffer_puts(dest, - "!!! WARNING - WORD TOO LONG TO PARSE !!!"); - word.length = 0; - } else { - put_htmlescaped(dest, c); - } + /* buffer the current word */ + ucx_buffer_putc(wbuf, c); } }