|
@@ -8,6 +8,8 @@
|
|
|
#include <bx/file.h>
|
|
#include <bx/file.h>
|
|
|
#include <bx/string.h>
|
|
#include <bx/string.h>
|
|
|
|
|
|
|
|
|
|
+#include <bx/debug.h>
|
|
|
|
|
+
|
|
|
class Bin2cWriter : public bx::WriterI
|
|
class Bin2cWriter : public bx::WriterI
|
|
|
{
|
|
{
|
|
|
public:
|
|
public:
|
|
@@ -15,6 +17,7 @@ public:
|
|
|
: m_mb(_allocator)
|
|
: m_mb(_allocator)
|
|
|
, m_mw(&m_mb)
|
|
, m_mw(&m_mb)
|
|
|
, m_name(_name)
|
|
, m_name(_name)
|
|
|
|
|
+ , m_outputAsCStr(false)
|
|
|
{
|
|
{
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -24,10 +27,81 @@ public:
|
|
|
|
|
|
|
|
virtual int32_t write(const void* _data, int32_t _size, bx::Error* _err) override
|
|
virtual int32_t write(const void* _data, int32_t _size, bx::Error* _err) override
|
|
|
{
|
|
{
|
|
|
|
|
+ m_outputAsCStr = true;
|
|
|
|
|
+
|
|
|
|
|
+ const char* data = (const char*)_data;
|
|
|
|
|
+ for (int32_t ii = 0; ii < _size; ++ii)
|
|
|
|
|
+ {
|
|
|
|
|
+ char ch = data[ii];
|
|
|
|
|
+ if (!bx::isPrint(ch)
|
|
|
|
|
+ && !bx::isSpace(ch) )
|
|
|
|
|
+ {
|
|
|
|
|
+ m_outputAsCStr = false;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
return bx::write(&m_mw, _data, _size, _err);
|
|
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 char* data = (const char*)m_mb.more(0);
|
|
|
|
|
+ uint32_t size = uint32_t(bx::seek(&m_mw) );
|
|
|
|
|
+
|
|
|
|
|
+ bx::Error err;
|
|
|
|
|
+
|
|
|
|
|
+ bx::write(
|
|
|
|
|
+ _writer
|
|
|
|
|
+ , &err
|
|
|
|
|
+ , "static const char* %.*s =\n\t\""
|
|
|
|
|
+ , m_name.getLength()
|
|
|
|
|
+ , m_name.getPtr()
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+ if (NULL != data)
|
|
|
|
|
+ {
|
|
|
|
|
+ bool escaped = false;
|
|
|
|
|
+
|
|
|
|
|
+ for (uint32_t ii = 0; ii < size; ++ii)
|
|
|
|
|
+ {
|
|
|
|
|
+ char ch = 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
|
|
|
|
|
+ {
|
|
|
|
|
+ bx::write(_writer, ch, &err);
|
|
|
|
|
+ escaped = false;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ bx::write(_writer, &err, "\"\n\t;\n");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ void outputHex(bx::WriterI* _writer)
|
|
|
{
|
|
{
|
|
|
#define HEX_DUMP_WIDTH 16
|
|
#define HEX_DUMP_WIDTH 16
|
|
|
#define HEX_DUMP_SPACE_WIDTH 96
|
|
#define HEX_DUMP_SPACE_WIDTH 96
|
|
@@ -38,7 +112,7 @@ public:
|
|
|
bx::Error err;
|
|
bx::Error err;
|
|
|
|
|
|
|
|
bx::write(
|
|
bx::write(
|
|
|
- m_writer
|
|
|
|
|
|
|
+ _writer
|
|
|
, &err
|
|
, &err
|
|
|
, "static const uint8_t %.*s[%d] =\n{\n"
|
|
, "static const uint8_t %.*s[%d] =\n{\n"
|
|
|
, m_name.getLength()
|
|
, m_name.getLength()
|
|
@@ -63,7 +137,7 @@ public:
|
|
|
if (HEX_DUMP_WIDTH == asciiPos)
|
|
if (HEX_DUMP_WIDTH == asciiPos)
|
|
|
{
|
|
{
|
|
|
ascii[asciiPos] = '\0';
|
|
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;
|
|
data += asciiPos;
|
|
|
hexPos = 0;
|
|
hexPos = 0;
|
|
|
asciiPos = 0;
|
|
asciiPos = 0;
|
|
@@ -73,11 +147,11 @@ public:
|
|
|
if (0 != asciiPos)
|
|
if (0 != asciiPos)
|
|
|
{
|
|
{
|
|
|
ascii[asciiPos] = '\0';
|
|
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_WIDTH
|
|
|
#undef HEX_DUMP_SPACE_WIDTH
|
|
#undef HEX_DUMP_SPACE_WIDTH
|
|
|
#undef HEX_DUMP_FORMAT
|
|
#undef HEX_DUMP_FORMAT
|
|
@@ -86,6 +160,7 @@ public:
|
|
|
bx::MemoryBlock m_mb;
|
|
bx::MemoryBlock m_mb;
|
|
|
bx::MemoryWriter m_mw;
|
|
bx::MemoryWriter m_mw;
|
|
|
bx::StringView m_name;
|
|
bx::StringView m_name;
|
|
|
|
|
+ bool m_outputAsCStr;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
void help(const char* _error = NULL)
|
|
void help(const char* _error = NULL)
|