src/c2html.c

changeset 43
a8cee98c8832
parent 42
7f2403c637a7
child 44
2b4ac35d061d
equal deleted inserted replaced
42:7f2403c637a7 43:a8cee98c8832
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

mercurial