Browse Source

bin2c: Added output as cstring.

Бранимир Караџић 6 years ago
parent
commit
917b92d8e9
3 changed files with 80 additions and 5 deletions
  1. BIN
      tools/bin/linux/bin2c
  2. BIN
      tools/bin/linux/lemon
  3. 80 5
      tools/bin2c/bin2c.cpp

BIN
tools/bin/linux/bin2c


BIN
tools/bin/linux/lemon


+ 80 - 5
tools/bin2c/bin2c.cpp

@@ -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,10 +27,81 @@ public:
 
 	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);
 	}
 
-	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_SPACE_WIDTH 96
@@ -38,7 +112,7 @@ public:
 		bx::Error err;
 
 		bx::write(
-			  m_writer
+			  _writer
 			, &err
 			, "static const uint8_t %.*s[%d] =\n{\n"
 			, m_name.getLength()
@@ -63,7 +137,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 +147,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,6 +160,7 @@ public:
 	bx::MemoryBlock  m_mb;
 	bx::MemoryWriter m_mw;
 	bx::StringView   m_name;
+	bool             m_outputAsCStr;
 };
 
 void help(const char* _error = NULL)