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