1#include <stdio.h>
 2#include <stdlib.h>
 3
 4int main(int argc, char *argv[]) {
 5	if (argc < 3) {
 6		fprintf(stderr, "Usage: %s <input_file> <array_name>\n", argv[0]);
 7		return 1;
 8	}
 9
10	const char *filename = argv[1];
11	const char *array_name = argv[2];
12
13	FILE *f = fopen(filename, "rb");
14	if (!f) {
15		perror("fopen");
16		return 1;
17	}
18
19	fseek(f, 0, SEEK_END);
20	long size = ftell(f);
21	rewind(f);
22
23	unsigned char *buffer = malloc(size);
24	if (!buffer) {
25		perror("malloc");
26		fclose(f);
27		return 1;
28	}
29
30	if (fread(buffer, 1, size, f) != (size_t)size) {
31		perror("fread");
32		free(buffer);
33		fclose(f);
34		return 1;
35	}
36
37	// Generate include guard
38	printf("#ifndef %s_H\n", array_name);
39	printf("#define %s_H\n\n", array_name);
40
41	printf("unsigned char %s[] = {\n", array_name);
42	for (long i = 0; i < size; i++) {
43		if (i % 12 == 0) printf("\t");
44		printf("0x%02x", buffer[i]);
45		if (i != size - 1) printf(", ");
46		if ((i + 1) % 12 == 0) printf("\n");
47	}
48	if (size % 12 != 0) printf("\n");
49	printf("};\n");
50	printf("unsigned int %s_len = %ld;\n", array_name, size);
51
52	printf("\n#endif // %s_H\n", array_name);
53
54	free(buffer);
55	fclose(f);
56	return 0;
57}