• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 
main(int argc,char * argv[])5 int main(int argc, char *argv[]) {
6     // Arguments
7     if (argc != 4 || (argc == 2 && strcmp(argv[1], "--help") == 0)) {
8         fprintf(stderr, "Usage: %s PREFIX OUTFILE INFILE\n", argv[0]);
9         exit(EXIT_FAILURE);
10     }
11 
12     char const *prefix = argv[1];
13     char const *infile_name = argv[3];
14     char const *outfile_name = argv[2];
15 
16     // Open Files
17     FILE *infile = fopen(infile_name, "rb");
18 
19     if (!infile) {
20         fprintf(stderr, "Unable to open input file: %s\n", infile_name);
21         exit(EXIT_FAILURE);
22     }
23 
24     FILE *outfile = fopen(outfile_name, "w");
25 
26     if (!outfile) {
27         fprintf(stderr, "Uanble to open output file: %s\n", outfile_name);
28         fclose(infile);
29         exit(EXIT_FAILURE);
30     }
31 
32 
33     // Generate Header Guard Begin
34     fprintf(outfile, "#ifndef %s_data_pack_h\n", prefix);
35     fprintf(outfile, "#define %s_data_pack_h\n\n", prefix);
36 
37 
38     // Generate Include Directive
39     fprintf(outfile, "#include <stddef.h>\n\n");
40 
41 
42     // Generate Encoded Data
43     fprintf(outfile, "static const char %s_data[] =\n", prefix);
44 
45     size_t data_size = 0;
46     for (;;) {
47         unsigned char buf[256];
48         unsigned char *ptr = buf;
49 
50         size_t nread = fread(buf, sizeof(char), sizeof(buf), infile);
51         size_t line_count = nread / 16;
52         size_t i;
53 
54         data_size += nread;
55 
56         for (i = 0; i < line_count; ++i, ptr += 16) {
57             fprintf(outfile,
58                     "\""
59                     "\\x%02x\\x%02x\\x%02x\\x%02x"
60                     "\\x%02x\\x%02x\\x%02x\\x%02x"
61                     "\\x%02x\\x%02x\\x%02x\\x%02x"
62                     "\\x%02x\\x%02x\\x%02x\\x%02x"
63                     "\"\n",
64                     ptr[0], ptr[1], ptr[2], ptr[3],
65                     ptr[4], ptr[5], ptr[6], ptr[7],
66                     ptr[8], ptr[9], ptr[10], ptr[11],
67                     ptr[12], ptr[13], ptr[14], ptr[15]);
68         }
69 
70         if (nread % 16 != 0) {
71             fprintf(outfile, "\"");
72 
73             for (i = line_count * 16; i < nread; ++i) {
74                 fprintf(outfile, "\\x%02x", buf[i]);
75             }
76 
77             fprintf(outfile, "\"\n");
78         }
79 
80         if (nread != sizeof(buf)) {
81             // End of file reached
82             break;
83         }
84     }
85 
86     fprintf(outfile, ";\n\n");
87 
88 
89     // Generate Data Size
90     fprintf(outfile, "static const size_t %s_size = %lu;\n",
91             prefix, (unsigned long)data_size);
92 
93 
94     // Generate Header Guard End
95     fprintf(outfile, "\n#endif\n");
96 
97 
98     // Close Files
99     fclose(infile);
100     fclose(outfile);
101 
102     return EXIT_SUCCESS;
103 }
104