From d751cecbb1ca1b7ac0a7bc8492e0e61e6c5fc0c7 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Tue, 17 May 2011 20:39:40 +0000 Subject: * tools/build/.cvsignore, tools/build/ChangeLog, tools/build/Makefile.am, tools/build/README, tools/build/binpatch.c, tools/build/cklength.c, tools/build/config.h.in, tools/build/configure.ac, tools/build/cvsignore-add.sh, tools/build/doxy-filter, tools/build/eolstrip.c, tools/build/install-if-change.in, tools/build/multigen, tools/build/packhex.c, tools/build/rtems-bin2c.c, tools/build/search-id.sh, tools/build/unhex.c, tools/cpu/.cvsignore, tools/cpu/ChangeLog, tools/cpu/Makefile.am, tools/cpu/configure.ac, tools/cpu/generic/.cvsignore, tools/cpu/generic/ChangeLog, tools/cpu/generic/Makefile.am, tools/cpu/generic/configure.ac, tools/cpu/generic/size_rtems.in, tools/cpu/nios2/.cvsignore, tools/cpu/nios2/ChangeLog, tools/cpu/nios2/Makefile.am, tools/cpu/nios2/README, tools/cpu/nios2/bridges.c, tools/cpu/nios2/bridges.h, tools/cpu/nios2/clocks.c, tools/cpu/nios2/clocks.h, tools/cpu/nios2/configure.ac, tools/cpu/nios2/devices.c, tools/cpu/nios2/devices.h, tools/cpu/nios2/linkcmds.c, tools/cpu/nios2/linkcmds.h, tools/cpu/nios2/memory.c, tools/cpu/nios2/memory.h, tools/cpu/nios2/nios2gen.c, tools/cpu/nios2/output.c, tools/cpu/nios2/output.h, tools/cpu/nios2/ptf.c, tools/cpu/nios2/ptf.h, tools/cpu/nios2/sample.ptf, tools/cpu/sh/.cvsignore, tools/cpu/sh/AUTHORS, tools/cpu/sh/COPYING, tools/cpu/sh/ChangeLog, tools/cpu/sh/Makefile.am, tools/cpu/sh/TODO, tools/cpu/sh/configure.ac, tools/cpu/sh/sci.c, tools/cpu/sh/sci.h, tools/cpu/sh/shgen.c: New files. --- tools/build/rtems-bin2c.c | 291 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 291 insertions(+) create mode 100644 tools/build/rtems-bin2c.c (limited to 'tools/build/rtems-bin2c.c') diff --git a/tools/build/rtems-bin2c.c b/tools/build/rtems-bin2c.c new file mode 100644 index 0000000000..4e6796aa38 --- /dev/null +++ b/tools/build/rtems-bin2c.c @@ -0,0 +1,291 @@ +/* + * bin2c.c + * + * convert a binary file into a C source array. + * + * THE "BEER-WARE LICENSE" (Revision 3.1415): + * sandro AT sigala DOT it wrote this file. As long as you retain this + * notice you can do whatever you want with this stuff. If we meet some + * day, and you think this stuff is worth it, you can buy me a beer in + * return. Sandro Sigala + * + * Subsequently modified by Joel Sherrill + * to add a number of capabilities not in the original. + * + * syntax: bin2c [-c] [-z] + * + * -c do NOT add the "const" keyword to definition + * -s add the "static" keywork to definition + * -v verbose + * -z terminate the array with a zero (useful for embedded C strings) + * + * examples: + * bin2c -c myimage.png myimage_png.cpp + * bin2c -z sometext.txt sometext_txt.cpp + * + */ + +#include +#include +#include +#include +#include + +#ifndef PATH_MAX +#define PATH_MAX 1024 +#endif + +int useconst = 1; +int usestatic = 0; +int verbose = 0; +int zeroterminated = 0; +int createC = 1; +int createH = 1; + +int myfgetc(FILE *f) +{ + int c = fgetc(f); + if (c == EOF && zeroterminated) { + zeroterminated = 0; + return 0; + } + return c; +} + +void process(const char *ifname, const char *ofname) +{ + FILE *ifile, *ocfile, *ohfile; + char buf[PATH_MAX], *p; + char obasename[PATH_MAX]; + char ocname[PATH_MAX]; + char ohname[PATH_MAX]; + const char *cp; + size_t len; + + /* Error check */ + if ( !ifname || !ofname ) { + fprintf(stderr, "process has NULL filename\n"); + exit(1); + } + + strncpy( obasename, ofname, PATH_MAX ); + len = strlen( obasename ); + if ( len >= 2 ) { + if ( obasename[len-2] == '.' ) { + if ( (obasename[len-1] == 'c') || (obasename[len-1] == 'h') ) + obasename[len-2] = '\0'; + } + } + + sprintf( ocname, "%s.c", obasename ); + sprintf( ohname, "%s.h", obasename ); + + if ( verbose ) { + fprintf( + stderr, + "in file: %s\n" + "c file: %s\n" + "h file: %s\n", + ifname, + ocname, + ohname + ); + } + + /* Open input and output files */ + ifile = fopen(ifname, "rb"); + if (ifile == NULL) { + fprintf(stderr, "cannot open %s for reading\n", ifname); + exit(1); + } + + if ( createC ) { + ocfile = fopen(ocname, "wb"); + if (ocfile == NULL) { + fprintf(stderr, "cannot open %s for writing\n", ocname); + exit(1); + } + } + + if ( createH ) { + ohfile = fopen(ohname, "wb"); + if (ohfile == NULL) { + fprintf(stderr, "cannot open %s for writing\n", ohname); + exit(1); + } + } + + /* find basename */ + char *ifbasename = strdup(ifname); + ifbasename = basename(ifbasename); + + strcpy(buf, ifbasename); + for (p = buf; *p != '\0'; ++p) + if (!isalnum(*p)) + *p = '_'; + + if ( createC ) { + /* print C file header */ + fprintf( + ocfile, + "/*\n" + " * Declarations for C structure representing binary file %s\n" + " *\n" + " * WARNING: Automatically generated -- do not edit!\n" + " */\n" + "\n" + "#include \n" + "\n", + ifbasename + ); + + /* print structure */ + fprintf( + ocfile, + "%s%sunsigned char %s[] = {\n ", + ((usestatic) ? "static " : ""), + ((useconst) ? "const " : ""), + buf + ); + int c, col = 1; + while ((c = myfgetc(ifile)) != EOF) { + if (col >= 78 - 6) { + fprintf(ocfile, "\n "); + col = 1; + } + fprintf(ocfile, "0x%.2x, ", c); + col += 6; + + } + fprintf(ocfile, "\n};\n"); + + /* print sizeof */ + fprintf( + ocfile, + "\n" + "%s%ssize_t %s_size = sizeof(%s);\n", + ((usestatic) ? "static " : ""), + ((useconst) ? "const " : ""), + buf, + buf + ); + } /* createC */ + + /*****************************************************************/ + /****** END OF C FILE *****/ + /*****************************************************************/ + + if ( createH ) { + /* print H file header */ + fprintf( + ohfile, + "/*\n" + " * Extern declarations for C structure representing binary file %s\n" + " *\n" + " * WARNING: Automatically generated -- do not edit!\n" + " */\n" + "\n" + "#ifndef __%s_h\n" + "#define __%s_h\n" + "\n" + "#include \n" + "\n", + ifbasename, /* header */ + obasename, /* ifndef */ + obasename /* define */ + ); + + /* print structure */ + fprintf( + ohfile, + "extern %s%sunsigned char %s[];", + ((usestatic) ? "static " : ""), + ((useconst) ? "const " : ""), + buf + ); + /* print sizeof */ + fprintf( + ohfile, + "\n" + "extern %s%ssize_t %s_size;\n", + ((usestatic) ? "static " : ""), + ((useconst) ? "const " : ""), + buf + ); + + fprintf( + ohfile, + "\n" + "#endif\n" + ); + } /* createH */ + + /*****************************************************************/ + /****** END OF H FILE *****/ + /*****************************************************************/ + + fclose(ifile); + if ( createC ) { fclose(ocfile); } + if ( createH ) { fclose(ohfile); } +} + +void usage(void) +{ + fprintf( + stderr, + "usage: bin2c [-csvzCH] \n" + " is the binary file to convert\n" + " should not have a .c or .h extension\n" + "\n" + " -c - do NOT use const in declaration\n" + " -s - do use static in declaration\n" + " -v - verbose\n" + " -z - add zero terminator\n" + " -H - create c-header only\n" + " -C - create c-source file only\n" + ); + exit(1); +} + +int main(int argc, char **argv) +{ + while (argc > 3) { + if (!strcmp(argv[1], "-c")) { + useconst = 0; + --argc; + ++argv; + } else if (!strcmp(argv[1], "-s")) { + usestatic = 1; + --argc; + ++argv; + } else if (!strcmp(argv[1], "-v")) { + verbose = 1; + --argc; + ++argv; + } else if (!strcmp(argv[1], "-z")) { + zeroterminated = 1; + --argc; + ++argv; + } else if (!strcmp(argv[1], "-C")) { + createH = 0; + createC = 1; + --argc; + ++argv; + } else if (!strcmp(argv[1], "-H")) { + createC = 0; + createH = 1; + --argc; + ++argv; + } else { + usage(); + } + } + if (argc != 3) { + usage(); + } + + /* process( input_file, output_basename ) */ + process(argv[1], argv[2]); + return 0; +} + -- cgit v1.2.3