#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { // Arguments if (argc != 4 || (argc == 2 && strcmp(argv[1], "--help") == 0)) { fprintf(stderr, "Usage: %s PREFIX OUTFILE INFILE\n", argv[0]); exit(EXIT_FAILURE); } char const *prefix = argv[1]; char const *infile_name = argv[3]; char const *outfile_name = argv[2]; // Open Files FILE *infile = fopen(infile_name, "rb"); if (!infile) { fprintf(stderr, "Unable to open input file: %s\n", infile_name); exit(EXIT_FAILURE); } FILE *outfile = fopen(outfile_name, "w"); if (!outfile) { fprintf(stderr, "Uanble to open output file: %s\n", outfile_name); fclose(infile); exit(EXIT_FAILURE); } // Generate Header Guard Begin fprintf(outfile, "#ifndef %s_data_pack_h\n", prefix); fprintf(outfile, "#define %s_data_pack_h\n\n", prefix); // Generate Include Directive fprintf(outfile, "#include <stddef.h>\n\n"); // Generate Encoded Data fprintf(outfile, "static const char %s_data[] =\n", prefix); size_t data_size = 0; for (;;) { unsigned char buf[256]; unsigned char *ptr = buf; size_t nread = fread(buf, sizeof(char), sizeof(buf), infile); size_t line_count = nread / 16; size_t i; data_size += nread; for (i = 0; i < line_count; ++i, ptr += 16) { fprintf(outfile, "\"" "\\x%02x\\x%02x\\x%02x\\x%02x" "\\x%02x\\x%02x\\x%02x\\x%02x" "\\x%02x\\x%02x\\x%02x\\x%02x" "\\x%02x\\x%02x\\x%02x\\x%02x" "\"\n", ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5], ptr[6], ptr[7], ptr[8], ptr[9], ptr[10], ptr[11], ptr[12], ptr[13], ptr[14], ptr[15]); } if (nread % 16 != 0) { fprintf(outfile, "\""); for (i = line_count * 16; i < nread; ++i) { fprintf(outfile, "\\x%02x", buf[i]); } fprintf(outfile, "\"\n"); } if (nread != sizeof(buf)) { // End of file reached break; } } fprintf(outfile, ";\n\n"); // Generate Data Size fprintf(outfile, "static const size_t %s_size = %lu;\n", prefix, (unsigned long)data_size); // Generate Header Guard End fprintf(outfile, "\n#endif\n"); // Close Files fclose(infile); fclose(outfile); return EXIT_SUCCESS; }