Blame


1 a2728733 2021-07-18 op /*
2 a2728733 2021-07-18 op * Copyright (c) 2021 Omar Polo <op@omarpolo.com>
3 a2728733 2021-07-18 op *
4 a2728733 2021-07-18 op * Permission to use, copy, modify, and distribute this software for any
5 a2728733 2021-07-18 op * purpose with or without fee is hereby granted, provided that the above
6 a2728733 2021-07-18 op * copyright notice and this permission notice appear in all copies.
7 a2728733 2021-07-18 op *
8 a2728733 2021-07-18 op * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 a2728733 2021-07-18 op * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 a2728733 2021-07-18 op * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 a2728733 2021-07-18 op * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 a2728733 2021-07-18 op * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 a2728733 2021-07-18 op * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 a2728733 2021-07-18 op * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 a2728733 2021-07-18 op */
16 a2728733 2021-07-18 op
17 a2728733 2021-07-18 op /*
18 a2728733 2021-07-18 op * pagebundler converts the given file into a valid C program that can
19 a2728733 2021-07-18 op * be compiled. The generated code provides a variable that holds the
20 a2728733 2021-07-18 op * original file.
21 a2728733 2021-07-18 op *
22 a2728733 2021-07-18 op * Usage: pagebundler -f file -v varname > outfile
23 a2728733 2021-07-18 op */
24 a2728733 2021-07-18 op
25 a2728733 2021-07-18 op #include <errno.h>
26 a2728733 2021-07-18 op #include <stdio.h>
27 a2728733 2021-07-18 op #include <unistd.h>
28 a2728733 2021-07-18 op #include <string.h>
29 a2728733 2021-07-18 op
30 a2728733 2021-07-18 op const char *file;
31 a2728733 2021-07-18 op const char *varname;
32 a2728733 2021-07-18 op
33 a2728733 2021-07-18 op int
34 a2728733 2021-07-18 op main(int argc, char **argv)
35 a2728733 2021-07-18 op {
36 a2728733 2021-07-18 op size_t len, r, i;
37 a2728733 2021-07-18 op int ch;
38 a2728733 2021-07-18 op FILE *f;
39 a2728733 2021-07-18 op uint8_t buf[64];
40 a2728733 2021-07-18 op
41 a2728733 2021-07-18 op while ((ch = getopt(argc, argv, "f:v:")) != -1) {
42 a2728733 2021-07-18 op switch (ch) {
43 a2728733 2021-07-18 op case 'f':
44 a2728733 2021-07-18 op file = optarg;
45 a2728733 2021-07-18 op break;
46 a2728733 2021-07-18 op case 'v':
47 a2728733 2021-07-18 op varname = optarg;
48 a2728733 2021-07-18 op break;
49 a2728733 2021-07-18 op default:
50 a2728733 2021-07-18 op fprintf(stderr, "%s: wrong usage\n",
51 a2728733 2021-07-18 op argv[0]);
52 a2728733 2021-07-18 op return 1;
53 a2728733 2021-07-18 op }
54 a2728733 2021-07-18 op }
55 a2728733 2021-07-18 op
56 a2728733 2021-07-18 op if (file == NULL || varname == NULL) {
57 a2728733 2021-07-18 op fprintf(stderr, "%s: wrong usage\n", argv[0]);
58 a2728733 2021-07-18 op return 1;
59 a2728733 2021-07-18 op }
60 a2728733 2021-07-18 op
61 a2728733 2021-07-18 op if ((f = fopen(file, "r")) == NULL) {
62 a2728733 2021-07-18 op fprintf(stderr, "%s: can't open %s: %s",
63 a2728733 2021-07-18 op argv[0], file, strerror(errno));
64 a2728733 2021-07-18 op }
65 a2728733 2021-07-18 op
66 a2728733 2021-07-18 op printf("const uint8_t %s[] = {\n", varname);
67 a2728733 2021-07-18 op
68 a2728733 2021-07-18 op len = 0;
69 a2728733 2021-07-18 op for (;;) {
70 a2728733 2021-07-18 op r = fread(buf, 1, sizeof(buf), f);
71 a2728733 2021-07-18 op len += r;
72 a2728733 2021-07-18 op
73 a2728733 2021-07-18 op printf("\t");
74 a2728733 2021-07-18 op for (i = 0; i < r; ++i) {
75 a2728733 2021-07-18 op printf("0x%x, ", buf[i]);
76 a2728733 2021-07-18 op }
77 a2728733 2021-07-18 op printf("\n");
78 a2728733 2021-07-18 op
79 a2728733 2021-07-18 op if (r != sizeof(buf))
80 a2728733 2021-07-18 op break;
81 a2728733 2021-07-18 op }
82 a2728733 2021-07-18 op
83 a2728733 2021-07-18 op len++;
84 a2728733 2021-07-18 op printf("\t0x00\n");
85 a2728733 2021-07-18 op printf("}; /* %s */\n", varname);
86 a2728733 2021-07-18 op
87 a2728733 2021-07-18 op printf("size_t %s_len = %zu;\n", varname, len);
88 a2728733 2021-07-18 op
89 a2728733 2021-07-18 op fclose(f);
90 a2728733 2021-07-18 op return 0;
91 a2728733 2021-07-18 op }