diff --git a/reactos/CMakeLists.txt b/reactos/CMakeLists.txt index 2393f5ada6f..994fecf57a4 100644 --- a/reactos/CMakeLists.txt +++ b/reactos/CMakeLists.txt @@ -69,9 +69,9 @@ if(NOT CMAKE_CROSSCOMPILING) add_subdirectory(lib) if(NOT MSVC) - export(TARGETS widl gendib cabman cdmake mkhive obj2bin spec2def geninc rsym mkshelllink FILE ${CMAKE_BINARY_DIR}/ImportExecutables.cmake NAMESPACE native- ) + export(TARGETS bin2c widl gendib cabman cdmake mkhive obj2bin spec2def geninc rsym mkshelllink FILE ${CMAKE_BINARY_DIR}/ImportExecutables.cmake NAMESPACE native- ) else() - export(TARGETS widl gendib cabman cdmake mkhive obj2bin spec2def geninc mkshelllink FILE ${CMAKE_BINARY_DIR}/ImportExecutables.cmake NAMESPACE native- ) + export(TARGETS bin2c widl gendib cabman cdmake mkhive obj2bin spec2def geninc mkshelllink FILE ${CMAKE_BINARY_DIR}/ImportExecutables.cmake NAMESPACE native- ) endif() else() diff --git a/reactos/tools/CMakeLists.txt b/reactos/tools/CMakeLists.txt index 9513d4052f9..84f5f48c4b4 100644 --- a/reactos/tools/CMakeLists.txt +++ b/reactos/tools/CMakeLists.txt @@ -5,6 +5,8 @@ if(MSVC) add_definitions(-D_CRT_SECURE_NO_WARNINGS) endif() +add_executable(bin2c bin2c.c) + add_subdirectory(cabman) add_subdirectory(cdmake) add_subdirectory(gendib) diff --git a/reactos/tools/bin2c.c b/reactos/tools/bin2c.c new file mode 100644 index 00000000000..61b78ef5271 --- /dev/null +++ b/reactos/tools/bin2c.c @@ -0,0 +1,106 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS bin2c + * FILE: tools/bin2c/bin2c.c + * PURPOSE: Converts a binary file into a byte array + * PROGRAMMER: Hermès Bélusca - Maïto + */ + +#include + +int main(int argc, char *argv[]) +{ + FILE* inFile; + FILE* outCFile; + FILE* outHFile; + unsigned char ch; + unsigned char cnt; + + /* + * Validate the arguments. + */ + if (argc < 5) + { + printf("Usage: bin2c infile.bin outfile.c outfile.h array_name [array_attribute [header_for_attribute]]\n"); + return -1; + } + + /* + * Open the input and the output files. + */ + inFile = fopen(argv[1], "rb"); + if (!inFile) + { + printf("ERROR: Couldn't open data file '%s'.\n", argv[1]); + return -1; + } + outCFile = fopen(argv[2], "w"); + if (!outCFile) + { + fclose(inFile); + printf("ERROR: Couldn't create output source file '%s'.\n", argv[2]); + return -1; + } + outHFile = fopen(argv[3], "w"); + if (!outHFile) + { + fclose(outCFile); + fclose(inFile); + printf("ERROR: Couldn't create output header file '%s'.\n", argv[3]); + return -1; + } + + /* + * Generate the header file and close it. + */ + fprintf(outHFile, "/* This file is autogenerated, do not edit. */\n\n"); + fprintf(outHFile, "#ifndef CHAR\n" + "#define CHAR char\n" + "#endif\n\n"); + fprintf(outHFile, "extern CHAR %s[];\n", argv[4]); + fclose(outHFile); + + /* + * Generate the source file and close it. + */ + fprintf(outCFile, "/* This file is autogenerated, do not edit. */\n\n"); + if (argc >= 7) + { + /* There is a header to be included for defining the array attribute. */ + fprintf(outCFile, "#include \"%s\"\n", argv[6]); + } + fprintf(outCFile, "#include \"%s\"\n\n", argv[3]); + + /* Generate the array. */ + if (argc >= 6) + { + /* There is an array attribute. */ + fprintf(outCFile, "%s ", argv[5]); + } + fprintf(outCFile, "CHAR %s[] =\n{", argv[4]); + + cnt = 0; + ch = fgetc(inFile); + while (!feof(inFile)) + { + if ((cnt % 16) == 0) + { + fprintf(outCFile, "\n "); + cnt = 0; + } + fprintf(outCFile, " 0x%02x,", (unsigned int)ch); + ++cnt; + ch = fgetc(inFile); + } + /* Put a final NULL terminator. */ + fprintf(outCFile, "\n 0x00"); + fprintf(outCFile, "\n};\n"); + fclose(outCFile); + + /* Close the input file. */ + fclose(inFile); + + return 0; +} + +/* EOF */