46 " -V, -v Prints version and exits\n" |
46 " -V, -v Prints version and exits\n" |
47 "\n"); |
47 "\n"); |
48 } |
48 } |
49 |
49 |
50 /* TODO: remove this workaround after refactoring highlighter structure */ |
50 /* TODO: remove this workaround after refactoring highlighter structure */ |
51 static void plainparseline(char *src, UcxBuffer *dest, highlighter_t* hltr) { |
51 static void plainparseline(char *src, UcxBuffer *dest, HighlighterData* hltr) { |
52 size_t dp = 0; |
52 size_t dp = 0; |
53 char *buf = dest->space + dest->pos; |
53 char *buf = dest->space + dest->pos; |
54 while (*src && *src != '\n') { |
54 while (*src && *src != '\n') { |
55 dp = writeescapedchar(buf, dp, *src); |
55 dp = writeescapedchar(buf, dp, *src); |
56 src++; |
56 src++; |
59 buf[dp] = '\0'; |
59 buf[dp] = '\0'; |
60 dest->pos += dp; |
60 dest->pos += dp; |
61 dest->size += dp; |
61 dest->size += dp; |
62 } |
62 } |
63 |
63 |
64 int formatfile( |
64 int formatlines(highlighter_func highlighter, |
65 highlighter_t *highlighter, |
65 UcxList *in, write_func out, void *stream, int showlineno) { |
66 UcxList *in, write_func out, void *stream, |
|
67 int showlineno) { |
|
68 |
66 |
69 /* compute width of line numbering */ |
67 /* compute width of line numbering */ |
70 int lnw; |
68 int lnw; |
71 if (showlineno) { |
69 if (showlineno) { |
72 size_t lines = ucx_list_size(in); |
70 size_t lines = ucx_list_size(in); |
84 /* start monospace formatting */ |
82 /* start monospace formatting */ |
85 out("<pre>\n", 1, 6, stream); |
83 out("<pre>\n", 1, 6, stream); |
86 |
84 |
87 /* process lines */ |
85 /* process lines */ |
88 size_t lineno = 0; |
86 size_t lineno = 0; |
|
87 HighlighterData highlighter_data; |
|
88 memset(&highlighter_data, 0, sizeof(HighlighterData)); |
|
89 |
89 UCX_FOREACH(sourceline, in) { |
90 UCX_FOREACH(sourceline, in) { |
90 /* increase line number and clean line buffer */ |
91 /* increase line number and clean line buffer */ |
91 lineno++; |
92 lineno++; |
92 ucx_buffer_clear(line); |
93 ucx_buffer_clear(line); |
93 |
94 |
97 "<a name=\"l%d\" href=\"#l%d\">%*d </a></span> ", |
98 "<a name=\"l%d\" href=\"#l%d\">%*d </a></span> ", |
98 lineno, lineno, lnw, lineno); |
99 lineno, lineno, lnw, lineno); |
99 } |
100 } |
100 |
101 |
101 /* process code line */ |
102 /* process code line */ |
102 highlighter->parser(sourceline->data, line, highlighter); |
103 highlighter(sourceline->data, line, &highlighter_data); |
103 |
104 |
104 /* write code line */ |
105 /* write code line */ |
105 out(line->space, 1, line->size, stream); |
106 out(line->space, 1, line->size, stream); |
106 } |
107 } |
107 |
108 |
172 if (optind != argc-1) { |
173 if (optind != argc-1) { |
173 printhelp(); |
174 printhelp(); |
174 return EXIT_FAILURE; |
175 return EXIT_FAILURE; |
175 } else { |
176 } else { |
176 /* Configure highlighter */ |
177 /* Configure highlighter */ |
177 highlighter_t *highlighter = calloc(1, sizeof(highlighter_t)); |
178 highlighter_func hltr = NULL; |
178 switch (sourcetype) { |
179 switch (sourcetype) { |
179 case SOURCE_C: |
180 case SOURCE_C: |
180 highlighter->isdirective = check_cdirective; |
181 hltr = cparseline; |
181 highlighter->istype = check_ctype; |
|
182 highlighter->keywords = ckeywords; |
|
183 highlighter->parser = cparseline; |
|
184 break; |
182 break; |
185 case SOURCE_JAVA: |
183 case SOURCE_JAVA: |
186 highlighter->isdirective = check_jdirective; |
184 hltr = jparseline; |
187 highlighter->istype = check_jtype; |
|
188 highlighter->keywords = jkeywords; |
|
189 highlighter->parser = jparseline; |
|
190 break; |
185 break; |
191 case SOURCE_PLAIN: |
186 case SOURCE_PLAIN: |
192 highlighter->parser = plainparseline; |
187 hltr = plainparseline; |
193 break; |
188 break; |
194 default: /* should be unreachable */ |
189 default: /* should be unreachable */ |
195 fprintf(stderr, "error in enum source_type\n"); |
190 fprintf(stderr, "error in enum source_type\n"); |
196 return EXIT_FAILURE; |
191 return EXIT_FAILURE; |
197 } |
192 } |
252 if (content->space[i] == '\n' && i+1 < content->size) { |
247 if (content->space[i] == '\n' && i+1 < content->size) { |
253 ucx_list_append(inputlines, content->space+i+1); |
248 ucx_list_append(inputlines, content->space+i+1); |
254 } |
249 } |
255 } |
250 } |
256 |
251 |
257 formatfile( |
252 formatlines(hltr, inputlines, |
258 highlighter, |
253 (write_func) fwrite, fout, settings.showlinenumbers); |
259 inputlines, |
|
260 (write_func) fwrite, |
|
261 fout, |
|
262 settings.showlinenumbers); |
|
263 |
254 |
264 free(highlighter); |
|
265 ucx_buffer_free(content); |
255 ucx_buffer_free(content); |
266 } else { |
256 } else { |
267 perror("Error opening input file"); |
257 perror("Error opening input file"); |
268 if (fout != stdout) { |
258 if (fout != stdout) { |
269 fclose(fout); |
259 fclose(fout); |