117 lines
2.6 KiB
C
117 lines
2.6 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
FILE *file_c;
|
|
FILE *file_h;
|
|
|
|
void convert(char *file_name, char *var_name) {
|
|
int i, n;
|
|
unsigned char buffer[16];
|
|
|
|
FILE *infile=fopen(file_name, "r");
|
|
|
|
fprintf(file_c, "unsigned char %s[] = {\n", var_name);
|
|
while ((n = fread(buffer, 1, 16, infile)))
|
|
{
|
|
for (i = 0; i < n; i++) {
|
|
fprintf(file_c, "0x%2.2x,", buffer[i]);
|
|
}
|
|
}
|
|
fprintf(file_c, "\n};\n");
|
|
fprintf(file_c, "unsigned int %s_length = %d;\n\n", var_name, ftell(infile));
|
|
fprintf(file_h, "extern unsigned char %s[];\n", var_name);
|
|
fprintf(file_h, "extern unsigned int %s_length;\n\n", var_name);
|
|
}
|
|
|
|
int main(int argc, char **argv) {
|
|
if (argc <= 1) {
|
|
printf("Usage: %s binary_file\nOutputs: binary_file.h, binary_file.c\n", argv[0]);
|
|
printf("Optional flags: \n");
|
|
printf("\t-a\tAppend converted file to output files\n");
|
|
return;
|
|
}
|
|
int i;
|
|
char **file = NULL;
|
|
char mode[3];
|
|
mode[0] = 'w';
|
|
mode[1] = '\0';
|
|
for(i=1;i < argc;i++) {
|
|
switch(argv[i][0]) {
|
|
case '-': // flag
|
|
switch(argv[i][1]) {
|
|
case 'a':
|
|
printf(" appending mode activated\n");
|
|
mode[0] = 'a';
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
default: // not a flag, so it is filename
|
|
file = &argv[i];
|
|
break;
|
|
}
|
|
}
|
|
if (file == NULL) {
|
|
printf("ERR: must specify filename\n");
|
|
return 1;
|
|
}
|
|
printf("Processing %s\n", *file);
|
|
|
|
size_t file_length = strlen(*file);
|
|
|
|
char *var_name = malloc(file_length+1);
|
|
strcpy(var_name, *file);
|
|
i = 0;
|
|
while(var_name[i] != '\0') {
|
|
switch(var_name[i]) {
|
|
case '.':
|
|
case '\\':
|
|
case ',':
|
|
var_name[i] = '_';
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
i++;
|
|
}
|
|
|
|
char *filename_c = malloc(file_length+3);
|
|
strcpy(filename_c, var_name);
|
|
filename_c[file_length] = '.';
|
|
filename_c[file_length+1] = 'c';
|
|
filename_c[file_length+2] = '\0';
|
|
|
|
char *filename_h = malloc(file_length+3);
|
|
strcpy(filename_h, var_name);
|
|
filename_h[file_length] = '.';
|
|
filename_h[file_length+1] = 'h';
|
|
filename_h[file_length+2] = '\0';
|
|
|
|
printf("Writing to %s and %s\n", filename_c, filename_h);
|
|
|
|
file_c = fopen(filename_c, mode);
|
|
file_h = fopen(filename_h, mode);
|
|
|
|
i = 0;
|
|
while(var_name[i] != '\0') {
|
|
switch(var_name[i]) {
|
|
case '/':
|
|
var_name[i] = '_';
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
i++;
|
|
}
|
|
fprintf(file_h, "#ifndef %s_H\n#define %s_H\n", var_name, var_name);
|
|
convert(*file, var_name);
|
|
|
|
fprintf(file_h, "#endif\n");
|
|
fclose(file_c);
|
|
fclose(file_h);
|
|
|
|
return 0;
|
|
}
|