aboutsummaryrefslogtreecommitdiffstats
path: root/tools/bin2carr/src/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/bin2carr/src/main.c')
-rw-r--r--tools/bin2carr/src/main.c232
1 files changed, 232 insertions, 0 deletions
diff --git a/tools/bin2carr/src/main.c b/tools/bin2carr/src/main.c
new file mode 100644
index 0000000..699db61
--- /dev/null
+++ b/tools/bin2carr/src/main.c
@@ -0,0 +1,232 @@
1#include <getopt.h>
2#include <stdio.h>
3#include <stdlib.h>
4#include <string.h>
5
6#include "shorthand.h"
7
8typedef enum {
9 ELEM_U8, ELEM_S8, ELEM_U16, ELEM_S16,
10 ELEM_U32, ELEM_S32, ELEM_U64, ELEM_S64,
11} ElemSize;
12
13void
14write_array(FILE *file_in, FILE *file_out, char *arr_name, ElemSize elem_size) {
15 char *arr_type;
16 size_t n_elem = 0;
17 switch (elem_size) {
18 case ELEM_U8:
19 arr_type = "u8";
20 n_elem = 8;
21 break;
22 case ELEM_S8:
23 arr_type = "s8";
24 n_elem = 8;
25 break;
26 case ELEM_U16:
27 arr_type = "u16";
28 n_elem = 8;
29 break;
30 case ELEM_S16:
31 arr_type = "s16";
32 n_elem = 8;
33 break;
34 case ELEM_U32:
35 arr_type = "u32";
36 n_elem = 4;
37 break;
38 case ELEM_S32:
39 arr_type = "s32";
40 n_elem = 4;
41 break;
42 case ELEM_U64:
43 arr_type = "u64";
44 n_elem = 4;
45 break;
46 case ELEM_S64:
47 arr_type = "s64";
48 n_elem = 4;
49 break;
50 default:
51 arr_type = "u8";
52 n_elem = 8;
53 break;
54 }
55 fprintf(file_out, "const %s %s[] = {\n", arr_type, arr_name);
56 size_t n_read = 0;
57 size_t counter = 0;
58 do {
59 if (counter == 0) {
60 fprintf(file_out, " ");
61 }
62 switch (elem_size) {
63 case ELEM_U8:
64 case ELEM_S8: {
65 u8 elem;
66 n_read = fread(&elem, sizeof(u8), 1, file_in);
67 fprintf(file_out, "0x%02x,", elem);
68 break;
69 }
70 case ELEM_U16:
71 case ELEM_S16: {
72 u16 elem;
73 n_read = fread(&elem, sizeof(u16), 1, file_in);
74 fprintf(file_out, "0x%04x,", elem);
75 break;
76 }
77 case ELEM_U32:
78 case ELEM_S32: {
79 u32 elem;
80 n_read = fread(&elem, sizeof(u32), 1, file_in);
81 fprintf(file_out, "0x%08x,", elem);
82 break;
83 }
84 case ELEM_U64:
85 case ELEM_S64: {
86 u64 elem;
87 n_read = fread(&elem, sizeof(u64), 1, file_in);
88 fprintf(file_out, "0x%016lx,", elem);
89 break;
90 }
91 }
92
93 if (counter == n_elem - 1) {
94 fprintf(file_out, "\n");
95 counter = 0;
96 } else {
97 fprintf(file_out, " ");
98 counter++;
99 }
100 } while(n_read != 0);
101 if (counter != 0) {
102 fseek(file_out, -1, SEEK_CUR);
103 fprintf(file_out, "\n");
104 }
105 fprintf(file_out, "};\n");
106}
107
108void
109print_usage(void) {
110 printf("Usage: %s [options] <filename>\n", BIN_NAME);
111 printf("\n");
112 printf("\t-e <u16>\tSize of array elements.\n");
113 printf("\t-n <arr_name>\tName of the output array.\n");
114 printf("\t-o <out_file.c>\tPath to the output file. If blank, stdout will be used.\n");
115 printf("\n");
116}
117
118int
119main(int argc, char *argv[]) {
120 // Initialize default parameters.
121 char *in_file_path = NULL;
122 char *out_file_path = NULL;
123 char arr_name[256] = {0};
124 ElemSize elem_size = ELEM_U8;
125
126 // Process options.
127 int option;
128 while ((option = getopt(argc, argv, "e:n:o:")) != -1) {
129 switch (option) {
130 case 'e': {
131 // Element size.
132 char *size = optarg;
133 if (strcmp(size, "u8") == 0) {
134 elem_size = ELEM_U8;
135 } else if (strcmp(size, "s8") == 0) {
136 elem_size = ELEM_S8;
137 } else if (strcmp(size, "u16") == 0) {
138 elem_size = ELEM_U16;
139 } else if (strcmp(size, "s16") == 0) {
140 elem_size = ELEM_S16;
141 } else if (strcmp(size, "u32") == 0) {
142 elem_size = ELEM_U32;
143 } else if (strcmp(size, "s32") == 0) {
144 elem_size = ELEM_S32;
145 } else if (strcmp(size, "u64") == 0) {
146 elem_size = ELEM_U64;
147 } else if (strcmp(size, "s64") == 0) {
148 elem_size = ELEM_S64;
149 }
150 } break;
151 case 'n': {
152 // Array name.
153 char *ptr = optarg;
154 size_t k = 0;
155 while(*ptr) {
156 switch (*ptr) {
157 case '.':
158 case '/':
159 case '-':
160 case '\\':
161 ptr++;
162 break;
163 default: {
164 arr_name[k++] = *ptr++;
165 } break;
166 }
167 }
168 } break;
169 case 'o': {
170 // Output file.
171 out_file_path = optarg;
172 } break;
173 default: {
174 print_usage();
175 return EXIT_FAILURE;
176 } break;
177 }
178 }
179
180 // Get the path to the file to be exported.
181 if (optind != argc - 1) {
182 fprintf(stderr, "%s: No input file given.\n", BIN_NAME);
183 print_usage();
184 return EXIT_FAILURE;
185 }
186 in_file_path = argv[optind];
187
188 // Check if there is a default array name.
189 if (arr_name[0] == '\0') {
190 char *ptr = in_file_path;
191 size_t k = 0;
192 while(*ptr) {
193 switch (*ptr) {
194 case '.':
195 case '/':
196 case '-':
197 case '\\':
198 ptr++;
199 break;
200 default: {
201 arr_name[k++] = *ptr++;
202 } break;
203 }
204 }
205 }
206
207 // Try to open input file.
208 FILE *file_in = fopen(in_file_path, "r");
209 if (file_in == NULL) {
210 fprintf(stderr, "%s: can't open input file: %s\n", BIN_NAME,
211 in_file_path);
212 return EXIT_FAILURE;
213 }
214
215 // Write output to file.
216 if (out_file_path == NULL) {
217 write_array(file_in, stdout, arr_name, elem_size);
218 } else {
219 FILE *file_out = fopen(out_file_path, "w");
220 if (!file_out) {
221 fprintf(stderr, "%s: can't open output file: %s\n", BIN_NAME, out_file_path);
222 fclose(file_in);
223 return EXIT_FAILURE;
224 }
225 write_array(file_in, file_out, arr_name, elem_size);
226 fclose(file_out);
227 }
228
229 // Cleanup.
230 fclose(file_in);
231 return EXIT_SUCCESS;
232}