diff options
Diffstat (limited to '3rdparty/bx/tools/bin2c/bin2c.cpp')
-rw-r--r-- | 3rdparty/bx/tools/bin2c/bin2c.cpp | 134 |
1 files changed, 120 insertions, 14 deletions
diff --git a/3rdparty/bx/tools/bin2c/bin2c.cpp b/3rdparty/bx/tools/bin2c/bin2c.cpp index 2c7f48d1de0..8d152ff6b80 100644 --- a/3rdparty/bx/tools/bin2c/bin2c.cpp +++ b/3rdparty/bx/tools/bin2c/bin2c.cpp @@ -1,6 +1,6 @@ /* - * Copyright 2011-2018 Branimir Karadzic. All rights reserved. - * License: https://github.com/bkaradzic/bx#license-bsd-2-clause + * Copyright 2011-2022 Branimir Karadzic. All rights reserved. + * License: https://github.com/bkaradzic/bx/blob/master/LICENSE */ #include <bx/allocator.h> @@ -8,6 +8,8 @@ #include <bx/file.h> #include <bx/string.h> +#include <bx/debug.h> + class Bin2cWriter : public bx::WriterI { public: @@ -15,6 +17,7 @@ public: : m_mb(_allocator) , m_mw(&m_mb) , m_name(_name) + , m_outputAsCStr(false) { } @@ -24,23 +27,102 @@ public: virtual int32_t write(const void* _data, int32_t _size, bx::Error* _err) override { + bool asCStr = true; + + const char* data = (const char*)_data; + for (int32_t ii = 0; ii < _size && asCStr; ++ii) + { + char ch = data[ii]; + + asCStr &= false + | bx::isPrint(ch) + | bx::isSpace(ch) + ; + } + + m_outputAsCStr = asCStr; + return bx::write(&m_mw, _data, _size, _err); } - void output(bx::WriterI* m_writer) + void output(bx::WriterI* _writer) + { + if (m_outputAsCStr) + { + outputString(_writer); + } + else + { + outputHex(_writer); + } + } + + void outputString(bx::WriterI* _writer) + { + const uint8_t* data = (const uint8_t*)m_mb.more(0); + uint32_t size = uint32_t(bx::seek(&m_mw) ); + + bx::Error err; + + bx::write( + _writer + , &err + , "static const char* %.*s = /* Generated with bin2c. */\n\t\"" + , m_name.getLength() + , m_name.getPtr() + ); + + if (NULL != data) + { + bool escaped = false; + + for (uint32_t ii = 0; ii < size; ++ii) + { + const char ch = char(data[ii]); + + if (!escaped) + { + switch (ch) + { + case '\"': bx::write(_writer, "\\\"", &err); break; + case '\n': bx::write(_writer, "\\n\"\n\t\"", &err); break; + case '\r': bx::write(_writer, "\\r", &err); break; + case '\\': escaped = true; BX_FALLTHROUGH; + default: bx::write(_writer, ch, &err); break; + } + } + else + { + switch (ch) + { + case '\n': bx::write(_writer, "\\\"\n\t\"", &err); break; + case '\r': BX_FALLTHROUGH; + case '\t': bx::write(_writer, "\\", &err); BX_FALLTHROUGH; + default : bx::write(_writer, ch, &err); break; + } + + escaped = false; + } + } + } + + bx::write(_writer, &err, "\"\n\t;\n"); + } + + void outputHex(bx::WriterI* _writer) { #define HEX_DUMP_WIDTH 16 #define HEX_DUMP_SPACE_WIDTH 96 #define HEX_DUMP_FORMAT "%-" BX_STRINGIZE(HEX_DUMP_SPACE_WIDTH) "." BX_STRINGIZE(HEX_DUMP_SPACE_WIDTH) "s" - const char* data = (const char*)m_mb.more(0); + const uint8_t* data = (const uint8_t*)m_mb.more(0); uint32_t size = uint32_t(bx::seek(&m_mw) ); bx::Error err; bx::write( - m_writer + _writer , &err - , "static const uint8_t %.*s[%d] =\n{\n" + , "static const uint8_t %.*s[%d] = /* Generated with bin2c. */\n{\n" , m_name.getLength() , m_name.getPtr() , size @@ -63,7 +145,7 @@ public: if (HEX_DUMP_WIDTH == asciiPos) { ascii[asciiPos] = '\0'; - bx::write(m_writer, &err, "\t" HEX_DUMP_FORMAT "// %s\n", hex, ascii); + bx::write(_writer, &err, "\t" HEX_DUMP_FORMAT "// %s\n", hex, ascii); data += asciiPos; hexPos = 0; asciiPos = 0; @@ -73,11 +155,11 @@ public: if (0 != asciiPos) { ascii[asciiPos] = '\0'; - bx::write(m_writer, &err, "\t" HEX_DUMP_FORMAT "// %s\n", hex, ascii); + bx::write(_writer, &err, "\t" HEX_DUMP_FORMAT "// %s\n", hex, ascii); } } - bx::write(m_writer, &err, "};\n"); + bx::write(_writer, &err, "};\n"); #undef HEX_DUMP_WIDTH #undef HEX_DUMP_SPACE_WIDTH #undef HEX_DUMP_FORMAT @@ -86,8 +168,22 @@ public: bx::MemoryBlock m_mb; bx::MemoryWriter m_mw; bx::StringView m_name; + bool m_outputAsCStr; }; +void error(const char* _format, ...) +{ + bx::WriterI* stdOut = bx::getStdOut(); + bx::Error err; + + va_list argList; + va_start(argList, _format); + bx::write(stdOut, &err, "Error:\n"); + bx::write(stdOut, _format, argList, &err); + bx::write(stdOut, &err, "\n\n"); + va_end(argList); +} + void help(const char* _error = NULL) { bx::WriterI* stdOut = bx::getStdOut(); @@ -95,13 +191,13 @@ void help(const char* _error = NULL) if (NULL != _error) { - bx::write(stdOut, &err, "Error:\n%s\n\n", _error); + error(_error); } bx::write(stdOut, &err , "bin2c, binary to C\n" - "Copyright 2011-2018 Branimir Karadzic. All rights reserved.\n" - "License: https://github.com/bkaradzic/bx#license-bsd-2-clause\n\n" + "Copyright 2011-2022 Branimir Karadzic. All rights reserved.\n" + "License: https://github.com/bkaradzic/bx/blob/master/LICENSE\n\n" ); bx::write(stdOut, &err @@ -156,21 +252,31 @@ int main(int _argc, const char* _argv[]) bx::DefaultAllocator allocator; data = BX_ALLOC(&allocator, size); - bx::read(&fr, data, size); + bx::read(&fr, data, size, bx::ErrorAssert{}); bx::close(&fr); bx::FileWriter fw; if (bx::open(&fw, outFilePath) ) { Bin2cWriter writer(&allocator, name); - bx::write(&writer, data, size); + bx::write(&writer, data, size, bx::ErrorAssert{}); writer.output(&fw); bx::close(&fw); } + else + { + bx::StringView path = outFilePath; + error("Failed to open output file '%.*s'.\n", path.getLength(), path.getPtr() ); + } BX_FREE(&allocator, data); } + else + { + bx::StringView path = filePath; + error("Failed to open input file '%.*s'.\n", path.getLength(), path.getPtr() ); + } return 0; } |