diff options
Diffstat (limited to 'common_modules/module_manager/utilities/module_binary_to_c_array.c')
| -rw-r--r-- | common_modules/module_manager/utilities/module_binary_to_c_array.c | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/common_modules/module_manager/utilities/module_binary_to_c_array.c b/common_modules/module_manager/utilities/module_binary_to_c_array.c new file mode 100644 index 00000000..b02fde6e --- /dev/null +++ b/common_modules/module_manager/utilities/module_binary_to_c_array.c @@ -0,0 +1,139 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + + +/* Define the file handles. */ + +FILE *source_file; +FILE *array_file; + + +int main(int argc, char* argv[]) +{ + +int alpha; +int alpha1; +int alpha2; +int alpha3; +unsigned long address; +unsigned long column; + + + /* Determine if the proper number of files are provided. */ + if (argc != 3) + { + + /* Print an error message out and wait for user key hit. */ + printf("module_binary_to_c_array.exe - Copyright (c) Microsoft Corporation v5.8\n"); + printf("**** Error: invalid input parameter for module_binary_to_c_array.exe **** \n"); + printf(" Command Line Should be:\n\n"); + printf(" > module_binary_to_c_array source_binary_file c_array_file <cr> \n\n"); + return(1); + } + + /* Attempt to open the source file for reading. */ + source_file = fopen(argv[1], "rb"); + + /* Determine if the source file was opened properly. */ + if (source_file == NULL) + { + + /* Print an error message out and wait for user key hit. */ + printf("**** Error: open failed on binary source file **** \n"); + printf(" File: %s ", argv[1]); + return(2); + } + + /* Determine if the binary file is a valid ThreadX module. */ + alpha = fgetc(source_file); + alpha1 = fgetc(source_file); + alpha2 = fgetc(source_file); + alpha3 = fgetc(source_file); + + if ((alpha != 0x4D && alpha != 0x55) || (alpha1 != 0x4F && alpha1 != 0x44) || (alpha2 != 0x44 && alpha2 != 0x4F) || (alpha3 != 0x55 && alpha3 != 0x4D)) + { + + /* Print an error message out and wait for user key hit. */ + printf("**** Error: invalid format of binary input file **** \n"); + printf(" File: %s ", argv[1]); + return(3); + } + + /* Attempt to open the dump file for writing. */ + array_file = fopen(argv[2], "w"); + + /* Determine if the dump file was opened properly. */ + if (array_file == NULL) + { + + /* Print an error message out and wait for user key hit. */ + printf("**** Error: open failed on C array file **** \n"); + printf(" File: %s ", argv[2]); + return(4); + } + + fprintf(array_file, "/**************************** Module-Binary-to-C-array Utility **********************************/\n"); + fprintf(array_file, "/* */\n"); + fprintf(array_file, "/* Copyright (c) Microsoft Corporation Version 5.4, build date: 03-01-2018 */\n"); + fprintf(array_file, "/* */\n"); + fprintf(array_file, "/************************************************************************************************/\n\n"); + fprintf(array_file, "/* \n"); + fprintf(array_file, " Input Binary file: %30s\n", argv[1]); + fprintf(array_file, " Output C Array file: %30s\n", argv[2]); + fprintf(array_file, "*/\n\n"); + + /* Now print out the sections in a C array. */ + fprintf(array_file, "unsigned char module_code[] = {\n\n"); + fprintf(array_file, "/* Address Contents */\n\n"); + + /* Seek to the beginning of the source file. */ + fseek(source_file, 0, SEEK_SET); + + /* Initialize the variables. */ + address = 0; + column = 0; + + do + { + + /* Get character from the input file. */ + alpha = fgetc(source_file); + + /* Have we reached EOF? */ + if (alpha == EOF) + break; + + /* Print out character with a leading comma, except on the first character. */ + if (column == 0) + { + if (address != 0) + fprintf(array_file, ",\n"); + fprintf(array_file, "/* 0x%08X */ 0x%02X", address, (unsigned int) alpha); + } + else + fprintf(array_file, ", 0x%02X", (unsigned int) alpha); + + /* Move column forward. */ + column++; + + /* Are we at the end of the column? */ + if (column >= 16) + { + + column = 0; + } + + /* Move address forward. */ + address++; + } while (alpha != EOF); + + /* Finally, finish the C array containing the module code. */ + fprintf(array_file, "};\n\n"); + + /* Close files. */ + fclose(source_file); + fclose(array_file); + + return 0; +} |
