timesynk/tools/bin2c.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;
}