Tue, 23 Aug 2016 15:55:02 +0200
refactors highlighter_t and removes abstraction overhead
src/c2html.c | file | annotate | diff | comparison | revisions | |
src/ccodegen.c | file | annotate | diff | comparison | revisions | |
src/ccodegen.h | file | annotate | diff | comparison | revisions | |
src/codegens.h | file | annotate | diff | comparison | revisions | |
src/javacodegen.c | file | annotate | diff | comparison | revisions | |
src/javacodegen.h | file | annotate | diff | comparison | revisions |
1.1 --- a/src/c2html.c Tue Aug 23 15:28:56 2016 +0200 1.2 +++ b/src/c2html.c Tue Aug 23 15:55:02 2016 +0200 1.3 @@ -48,7 +48,7 @@ 1.4 } 1.5 1.6 /* TODO: remove this workaround after refactoring highlighter structure */ 1.7 -static void plainparseline(char *src, UcxBuffer *dest, highlighter_t* hltr) { 1.8 +static void plainparseline(char *src, UcxBuffer *dest, HighlighterData* hltr) { 1.9 size_t dp = 0; 1.10 char *buf = dest->space + dest->pos; 1.11 while (*src && *src != '\n') { 1.12 @@ -61,10 +61,8 @@ 1.13 dest->size += dp; 1.14 } 1.15 1.16 -int formatfile( 1.17 - highlighter_t *highlighter, 1.18 - UcxList *in, write_func out, void *stream, 1.19 - int showlineno) { 1.20 +int formatlines(highlighter_func highlighter, 1.21 + UcxList *in, write_func out, void *stream, int showlineno) { 1.22 1.23 /* compute width of line numbering */ 1.24 int lnw; 1.25 @@ -86,6 +84,9 @@ 1.26 1.27 /* process lines */ 1.28 size_t lineno = 0; 1.29 + HighlighterData highlighter_data; 1.30 + memset(&highlighter_data, 0, sizeof(HighlighterData)); 1.31 + 1.32 UCX_FOREACH(sourceline, in) { 1.33 /* increase line number and clean line buffer */ 1.34 lineno++; 1.35 @@ -99,7 +100,7 @@ 1.36 } 1.37 1.38 /* process code line */ 1.39 - highlighter->parser(sourceline->data, line, highlighter); 1.40 + highlighter(sourceline->data, line, &highlighter_data); 1.41 1.42 /* write code line */ 1.43 out(line->space, 1, line->size, stream); 1.44 @@ -174,22 +175,16 @@ 1.45 return EXIT_FAILURE; 1.46 } else { 1.47 /* Configure highlighter */ 1.48 - highlighter_t *highlighter = calloc(1, sizeof(highlighter_t)); 1.49 + highlighter_func hltr = NULL; 1.50 switch (sourcetype) { 1.51 case SOURCE_C: 1.52 - highlighter->isdirective = check_cdirective; 1.53 - highlighter->istype = check_ctype; 1.54 - highlighter->keywords = ckeywords; 1.55 - highlighter->parser = cparseline; 1.56 + hltr = cparseline; 1.57 break; 1.58 case SOURCE_JAVA: 1.59 - highlighter->isdirective = check_jdirective; 1.60 - highlighter->istype = check_jtype; 1.61 - highlighter->keywords = jkeywords; 1.62 - highlighter->parser = jparseline; 1.63 + hltr = jparseline; 1.64 break; 1.65 case SOURCE_PLAIN: 1.66 - highlighter->parser = plainparseline; 1.67 + hltr = plainparseline; 1.68 break; 1.69 default: /* should be unreachable */ 1.70 fprintf(stderr, "error in enum source_type\n"); 1.71 @@ -254,14 +249,9 @@ 1.72 } 1.73 } 1.74 1.75 - formatfile( 1.76 - highlighter, 1.77 - inputlines, 1.78 - (write_func) fwrite, 1.79 - fout, 1.80 - settings.showlinenumbers); 1.81 + formatlines(hltr, inputlines, 1.82 + (write_func) fwrite, fout, settings.showlinenumbers); 1.83 1.84 - free(highlighter); 1.85 ucx_buffer_free(content); 1.86 } else { 1.87 perror("Error opening input file");
2.1 --- a/src/ccodegen.c Tue Aug 23 15:28:56 2016 +0200 2.2 +++ b/src/ccodegen.c Tue Aug 23 15:55:02 2016 +0200 2.3 @@ -39,18 +39,10 @@ 2.4 "while", NULL 2.5 }; 2.6 2.7 -int check_ctype(char *word, size_t len) { 2.8 - return (word[len-2] == '_' && word[len-1] == 't'); 2.9 -} 2.10 - 2.11 -int check_cdirective(char *word) { 2.12 - return (word[0] == '#'); 2.13 -} 2.14 - 2.15 #define memcpy_const(darr,doff,str) memcpy(&(darr[doff]), str, sizeof(str)-1); \ 2.16 dp += sizeof(str)-1 2.17 2.18 -void cparseline(char *src, UcxBuffer *destbuf, highlighter_t *hltr) { 2.19 +void cparseline(char *src, UcxBuffer *destbuf, HighlighterData *hltr) { 2.20 /* TODO: workaround for using old code with UcxBuffer */ 2.21 char *dest = destbuf->space + destbuf->pos; 2.22 2.23 @@ -146,13 +138,14 @@ 2.24 /* interpret word int_t */ 2.25 if (wp > 0 && wp < WORDBUF_SIZE) { 2.26 int closespan = 1; 2.27 - if (check_keyword(hltr->word, hltr->keywords)) { 2.28 + if (check_keyword(hltr->word, ckeywords)) { 2.29 memcpy_const(dest, dp, 2.30 "<span class=\"c2html-keyword\">"); 2.31 - } else if (hltr->istype(hltr->word, wp)) { 2.32 + } else if (hltr->word[wp-2] == '_' 2.33 + && hltr->word[wp-1] == 't') { 2.34 memcpy_const(dest, dp, 2.35 "<span class=\"c2html-type\">"); 2.36 - } else if (hltr->isdirective(hltr->word)) { 2.37 + } else if (hltr->word[0] == '#') { 2.38 isinclude = !strncmp( 2.39 "#include", hltr->word, WORDBUF_SIZE); 2.40 memcpy_const(dest, dp,
3.1 --- a/src/ccodegen.h Tue Aug 23 15:28:56 2016 +0200 3.2 +++ b/src/ccodegen.h Tue Aug 23 15:55:02 2016 +0200 3.3 @@ -41,7 +41,7 @@ 3.4 3.5 int check_ctype(char *word, size_t len); 3.6 int check_cdirective(char *word); 3.7 -void cparseline(char *src, UcxBuffer *dest, highlighter_t *hltr); 3.8 +void cparseline(char *src, UcxBuffer *dest, HighlighterData *hltr); 3.9 3.10 #ifdef __cplusplus 3.11 }
4.1 --- a/src/codegens.h Tue Aug 23 15:28:56 2016 +0200 4.2 +++ b/src/codegens.h Tue Aug 23 15:55:02 2016 +0200 4.3 @@ -39,21 +39,15 @@ 4.4 4.5 #define WORDBUF_SIZE 64 4.6 4.7 -#define iswordcharacter(c) (isalnum(c) || c=='_' || c=='#' || c=='@') 4.8 - 4.9 -typedef struct _highlighter_t highlighter_t; 4.10 -typedef void(*parser_fnc)(char*,UcxBuffer*,highlighter_t*); 4.11 - 4.12 -struct _highlighter_t { 4.13 - const char** keywords; 4.14 - int(*istype)(char*,size_t); 4.15 - int(*isdirective)(char*); 4.16 - parser_fnc parser; 4.17 +typedef struct { 4.18 int iscommentml; 4.19 char word[WORDBUF_SIZE]; 4.20 char includefile[FILENAME_MAX]; 4.21 -}; 4.22 +} HighlighterData; 4.23 4.24 +typedef void(*highlighter_func)(char*,UcxBuffer*,HighlighterData*); 4.25 + 4.26 +#define iswordcharacter(c) (isalnum(c) || c=='_' || c=='#' || c=='@') 4.27 size_t writeescapedchar(char *dest, size_t dp, char c); 4.28 int check_keyword(char *word, const char** keywords); 4.29 int check_capsonly(char *word, size_t wp);
5.1 --- a/src/javacodegen.c Tue Aug 23 15:28:56 2016 +0200 5.2 +++ b/src/javacodegen.c Tue Aug 23 15:55:02 2016 +0200 5.3 @@ -41,18 +41,10 @@ 5.4 "volatile", "const", "float", "native", "super", "while", NULL 5.5 }; 5.6 5.7 -int check_jtype(char *word, size_t len) { 5.8 - return isupper(word[0]); 5.9 -} 5.10 - 5.11 -int check_jdirective(char *word) { 5.12 - return word[0] == '@'; 5.13 -} 5.14 - 5.15 #define memcpy_const(darr,doff,str) memcpy(&(darr[doff]), str, sizeof(str)-1); \ 5.16 dp += sizeof(str)-1 5.17 5.18 -void jparseline(char *src, UcxBuffer *destbuf, highlighter_t *hltr) { 5.19 +void jparseline(char *src, UcxBuffer *destbuf, HighlighterData *hltr) { 5.20 /* TODO: workaround for using old code with UcxBuffer */ 5.21 char *dest = destbuf->space + destbuf->pos; 5.22 5.23 @@ -119,13 +111,13 @@ 5.24 /* interpret word int_t */ 5.25 if (wp > 0 && wp < WORDBUF_SIZE) { 5.26 int closespan = 1; 5.27 - if (check_keyword(hltr->word, hltr->keywords)) { 5.28 + if (check_keyword(hltr->word, jkeywords)) { 5.29 memcpy_const(dest, dp, 5.30 "<span class=\"c2html-keyword\">"); 5.31 - } else if (hltr->istype(hltr->word, wp)) { 5.32 + } else if (isupper(hltr->word[0])) { 5.33 memcpy_const(dest, dp, 5.34 "<span class=\"c2html-type\">"); 5.35 - } else if (hltr->isdirective(hltr->word)) { 5.36 + } else if (hltr->word[0] == '@') { 5.37 memcpy_const(dest, dp, 5.38 "<span class=\"c2html-directive\">"); 5.39 } else if (check_capsonly(hltr->word, wp)) {
6.1 --- a/src/javacodegen.h Tue Aug 23 15:28:56 2016 +0200 6.2 +++ b/src/javacodegen.h Tue Aug 23 15:55:02 2016 +0200 6.3 @@ -41,7 +41,7 @@ 6.4 6.5 int check_jtype(char *word, size_t len); 6.6 int check_jdirective(char *word); 6.7 -void jparseline(char *src, UcxBuffer *dest, highlighter_t *hltr); 6.8 +void jparseline(char *src, UcxBuffer *dest, HighlighterData *hltr); 6.9 6.10 6.11 #ifdef __cplusplus