146bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao#include <stdio.h>
246bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao#include <stdlib.h>
346bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao#include <string.h>
446bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao
546bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liaoint main(int argc, char *argv[]) {
646bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    // Arguments
746bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    if (argc != 4 || (argc == 2 && strcmp(argv[1], "--help") == 0)) {
846bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao        fprintf(stderr, "Usage: %s PREFIX OUTFILE INFILE\n", argv[0]);
946bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao        exit(EXIT_FAILURE);
1046bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    }
1146bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao
1246bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    char const *prefix = argv[1];
1346bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    char const *infile_name = argv[3];
1446bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    char const *outfile_name = argv[2];
1546bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao
1646bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    // Open Files
1746bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    FILE *infile = fopen(infile_name, "rb");
1846bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao
1946bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    if (!infile) {
2046bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao        fprintf(stderr, "Unable to open input file: %s\n", infile_name);
2146bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao        exit(EXIT_FAILURE);
2246bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    }
2346bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao
2446bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    FILE *outfile = fopen(outfile_name, "w");
2546bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao
2646bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    if (!outfile) {
2746bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao        fprintf(stderr, "Uanble to open output file: %s\n", outfile_name);
2846bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao        fclose(infile);
2946bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao        exit(EXIT_FAILURE);
3046bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    }
3146bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao
3246bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao
3346bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    // Generate Header Guard Begin
3446bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    fprintf(outfile, "#ifndef %s_data_pack_h\n", prefix);
3546bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    fprintf(outfile, "#define %s_data_pack_h\n\n", prefix);
3646bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao
3746bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao
3846bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    // Generate Include Directive
3946bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    fprintf(outfile, "#include <stddef.h>\n\n");
4046bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao
4146bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao
4246bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    // Generate Encoded Data
4346bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    fprintf(outfile, "static const char %s_data[] =\n", prefix);
4446bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao
4546bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    size_t data_size = 0;
4646bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    for (;;) {
4746bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao        unsigned char buf[256];
4846bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao        unsigned char *ptr = buf;
4946bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao
5046bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao        size_t nread = fread(buf, sizeof(char), sizeof(buf), infile);
5146bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao        size_t line_count = nread / 16;
5246bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao        size_t i;
5346bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao
5446bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao        data_size += nread;
5546bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao
5646bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao        for (i = 0; i < line_count; ++i, ptr += 16) {
5746bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao            fprintf(outfile,
5846bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao                    "\""
5946bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao                    "\\x%02x\\x%02x\\x%02x\\x%02x"
6046bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao                    "\\x%02x\\x%02x\\x%02x\\x%02x"
6146bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao                    "\\x%02x\\x%02x\\x%02x\\x%02x"
6246bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao                    "\\x%02x\\x%02x\\x%02x\\x%02x"
6346bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao                    "\"\n",
6446bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao                    ptr[0], ptr[1], ptr[2], ptr[3],
6546bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao                    ptr[4], ptr[5], ptr[6], ptr[7],
6646bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao                    ptr[8], ptr[9], ptr[10], ptr[11],
6746bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao                    ptr[12], ptr[13], ptr[14], ptr[15]);
6846bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao        }
6946bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao
7046bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao        if (nread % 16 != 0) {
7146bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao            fprintf(outfile, "\"");
7246bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao
7346bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao            for (i = line_count * 16; i < nread; ++i) {
7446bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao                fprintf(outfile, "\\x%02x", buf[i]);
7546bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao            }
7646bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao
7746bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao            fprintf(outfile, "\"\n");
7846bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao        }
7946bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao
8046bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao        if (nread != sizeof(buf)) {
8146bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao            // End of file reached
8246bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao            break;
8346bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao        }
8446bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    }
8546bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao
8646bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    fprintf(outfile, ";\n\n");
8746bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao
8846bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao
8946bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    // Generate Data Size
9046bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    fprintf(outfile, "static const size_t %s_size = %lu;\n",
9146bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao            prefix, (unsigned long)data_size);
9246bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao
9346bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao
9446bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    // Generate Header Guard End
9546bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    fprintf(outfile, "\n#endif\n");
9646bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao
9746bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao
9846bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    // Close Files
9946bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    fclose(infile);
10046bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    fclose(outfile);
10146bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao
10246bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao    return EXIT_SUCCESS;
10346bd0121f3cec6b80bd90a04a43604293f0d822bShih-wei Liao}
104