135 SOURCE_JAVA, |
135 SOURCE_JAVA, |
136 SOURCE_PLAIN |
136 SOURCE_PLAIN |
137 }; |
137 }; |
138 |
138 |
139 int main(int argc, char** argv) { |
139 int main(int argc, char** argv) { |
140 int retcode = EXIT_SUCCESS; |
140 |
141 |
141 /* Default settings */ |
142 Settings settings; |
142 Settings settings; |
143 memset(&settings, 0, sizeof(settings)); |
143 memset(&settings, 0, sizeof(settings)); |
144 settings.showlinenumbers = 1; |
144 settings.showlinenumbers = 1; |
145 |
|
146 enum source_type sourcetype = SOURCE_C; |
145 enum source_type sourcetype = SOURCE_C; |
147 |
146 |
|
147 /* Parse command line */ |
148 char optc; |
148 char optc; |
149 while ((optc = getopt(argc, argv, "hljo:pH:F:vV")) != -1) { |
149 while ((optc = getopt(argc, argv, "hljo:pH:F:vV")) != -1) { |
150 switch (optc) { |
150 switch (optc) { |
151 case 'o': |
151 case 'o': |
152 if (!(optarg[0] == '-' && optarg[1] == 0)) { |
152 if (!(optarg[0] == '-' && optarg[1] == 0)) { |
184 } |
184 } |
185 } |
185 } |
186 |
186 |
187 if (optind != argc-1) { |
187 if (optind != argc-1) { |
188 printhelp(); |
188 printhelp(); |
189 return 1; |
189 return EXIT_FAILURE; |
190 } else { |
190 } else { |
|
191 /* Configure highlighter */ |
|
192 highlighter_t highlighter; |
|
193 highlighter_t *hptr = &highlighter; |
|
194 switch (sourcetype) { |
|
195 case SOURCE_C: |
|
196 init_c_highlighter(&highlighter); |
|
197 break; |
|
198 case SOURCE_JAVA: |
|
199 init_java_highlighter(&highlighter); |
|
200 break; |
|
201 case SOURCE_PLAIN: |
|
202 hptr = NULL; |
|
203 break; |
|
204 default: /* should be unreachable */ |
|
205 fprintf(stderr, "error in enum source_type\n"); |
|
206 return EXIT_FAILURE; |
|
207 } |
|
208 |
|
209 /* Open output file */ |
191 settings.infilename = argv[optind]; |
210 settings.infilename = argv[optind]; |
192 FILE *fout; |
211 FILE *fout; |
193 if (settings.outfilename) { |
212 if (settings.outfilename) { |
194 fout = fopen(settings.outfilename, "w"); |
213 fout = fopen(settings.outfilename, "w"); |
195 if (!fout) { |
214 if (!fout) { |
198 } |
217 } |
199 } else { |
218 } else { |
200 fout = stdout; |
219 fout = stdout; |
201 } |
220 } |
202 |
221 |
|
222 /* Allocate file buffer */ |
203 char *filebuf = malloc(FILEBUF_SIZE); |
223 char *filebuf = malloc(FILEBUF_SIZE); |
204 if (!filebuf) { |
224 if (!filebuf) { |
205 perror("Error allocating file buffer"); |
225 perror("Error allocating file buffer"); |
206 return EXIT_FAILURE; |
226 return EXIT_FAILURE; |
207 } |
227 } |
208 |
228 |
209 highlighter_t highlighter; |
229 /* Prepend header file */ |
210 highlighter_t *hptr = &highlighter; |
|
211 switch (sourcetype) { |
|
212 case SOURCE_C: |
|
213 init_c_highlighter(&highlighter); |
|
214 break; |
|
215 case SOURCE_JAVA: |
|
216 init_java_highlighter(&highlighter); |
|
217 break; |
|
218 case SOURCE_PLAIN: |
|
219 hptr = NULL; |
|
220 break; |
|
221 default: /* should be unreachable */ |
|
222 fprintf(stderr, "error in enum source_type\n"); |
|
223 retcode = EXIT_FAILURE; |
|
224 goto prog_end; |
|
225 } |
|
226 |
|
227 { |
230 { |
228 FILE *headerfile = fopen(settings.headerfile, "r"); |
231 FILE *headerfile = fopen(settings.headerfile, "r"); |
229 if (!headerfile) { |
232 if (!headerfile) { |
230 perror("Error opening header file"); |
233 perror("Error opening header file"); |
231 retcode = EXIT_FAILURE; |
234 if (fout != stdout) { |
232 goto prog_end; |
235 fclose(fout); |
|
236 } |
|
237 return EXIT_FAILURE; |
233 } |
238 } |
234 ucx_stream_copy(headerfile, fout, |
239 ucx_stream_copy(headerfile, fout, |
235 (read_func) fread, (write_func) fwrite, |
240 (read_func) fread, (write_func) fwrite, |
236 filebuf, FILEBUF_SIZE, (size_t)-1); |
241 filebuf, FILEBUF_SIZE, (size_t)-1); |
237 fclose(headerfile); |
242 fclose(headerfile); |
238 } |
243 } |
239 |
244 |
|
245 /* Process input file */ |
240 FILE *inputfile = fopen(settings.infilename, "r"); |
246 FILE *inputfile = fopen(settings.infilename, "r"); |
241 if (inputfile) { |
247 if (inputfile) { |
242 UcxBuffer *content = ucx_buffer_new(NULL, |
248 UcxBuffer *content = ucx_buffer_new(NULL, |
243 FILEBUF_SIZE*2, UCX_BUFFER_AUTOEXTEND); |
249 FILEBUF_SIZE*2, UCX_BUFFER_AUTOEXTEND); |
244 { |
250 { |
265 fout, |
271 fout, |
266 settings.showlinenumbers); |
272 settings.showlinenumbers); |
267 ucx_buffer_free(content); |
273 ucx_buffer_free(content); |
268 } else { |
274 } else { |
269 perror("Error opening input file"); |
275 perror("Error opening input file"); |
270 retcode = EXIT_FAILURE; |
276 if (fout != stdout) { |
271 } |
277 fclose(fout); |
272 |
278 } |
|
279 return EXIT_FAILURE; |
|
280 } |
|
281 |
|
282 /* Append footer file */ |
273 { |
283 { |
274 FILE *footerfile = fopen(settings.footerfile, "r"); |
284 FILE *footerfile = fopen(settings.footerfile, "r"); |
275 if (!footerfile) { |
285 if (!footerfile) { |
276 perror("Error opening footer file"); |
286 perror("Error opening footer file"); |
277 retcode = EXIT_FAILURE; |
287 if (fout != stdout) { |
278 goto prog_end; |
288 fclose(fout); |
|
289 } |
|
290 return EXIT_FAILURE; |
279 } |
291 } |
280 ucx_stream_copy(footerfile, fout, |
292 ucx_stream_copy(footerfile, fout, |
281 (read_func) fread, (write_func) fwrite, |
293 (read_func) fread, (write_func) fwrite, |
282 filebuf, FILEBUF_SIZE, (size_t)-1); |
294 filebuf, FILEBUF_SIZE, (size_t)-1); |
283 fclose(footerfile); |
295 fclose(footerfile); |
284 } |
296 } |
|
297 |
285 |
298 |
286 free(filebuf); |
299 free(filebuf); |
287 |
300 |
288 prog_end: |
301 return EXIT_SUCCESS; |
289 if (fout != stdout) { |
302 } |
290 fclose(fout); |
303 } |
291 } |
304 |
292 |
|
293 return retcode; |
|
294 } |
|
295 } |
|
296 |
|