| 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 |
|