From 75bd1e4b2a7fff3aa09f6306bb9d07365655ca36 Mon Sep 17 00:00:00 2001 From: Mike Nolan Date: Thu, 25 Sep 2025 18:23:42 -0500 Subject: [PATCH] Added bin2h support --- CMakeLists.txt | 4 ++ apps/tbin2h.cpp | 15 ++++ include/TessesFramework/TessesFramework.hpp | 1 + .../TessesFramework/Text/HeaderGenerator.hpp | 11 +++ src/Text/HeaderGenerator.cpp | 69 +++++++++++++++++++ 5 files changed, 100 insertions(+) create mode 100644 apps/tbin2h.cpp create mode 100644 include/TessesFramework/Text/HeaderGenerator.hpp create mode 100644 src/Text/HeaderGenerator.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 858590c..b4fb3ca 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,6 +30,7 @@ src/Streams/ByteReader.cpp src/Streams/ByteWriter.cpp src/Streams/PtyStream.cpp src/Text/StringConverter.cpp +src/Text/HeaderGenerator.cpp src/TextStreams/StreamReader.cpp src/TextStreams/StreamWriter.cpp src/TextStreams/TextReader.cpp @@ -340,6 +341,9 @@ if(TESSESFRAMEWORK_ENABLE_EXAMPLES) endif() if(TESSESFRAMEWORK_ENABLE_APPS) +add_executable(tbin2h apps/tbin2h.cpp) +target_link_libraries(tbin2h PUBLIC tessesframework) +install(TARGETS tbin2h DESTINATION bin) add_executable(tanonydrop apps/tanonydrop.cpp) target_link_libraries(tanonydrop PUBLIC tessesframework) install(TARGETS tanonydrop DESTINATION bin) diff --git a/apps/tbin2h.cpp b/apps/tbin2h.cpp new file mode 100644 index 0000000..cbf7f8f --- /dev/null +++ b/apps/tbin2h.cpp @@ -0,0 +1,15 @@ +#include "TessesFramework/TessesFramework.hpp" + +int main(int argc, char** argv) +{ + if(argc < 4) + { + std::cout << "USAGE: " << argv[0] << " BINARYFILE VARNAME HEADERFILE" << std::endl; + return 0; + } + Tesses::Framework::Streams::FileStream fs(argv[1],"rb"); + if(!fs.CanRead()) return 1; + Tesses::Framework::TextStreams::StreamWriter writer(argv[3]); + Tesses::Framework::Text::GenerateCHeaderFile(&fs, argv[2], &writer); + return 0; +} \ No newline at end of file diff --git a/include/TessesFramework/TessesFramework.hpp b/include/TessesFramework/TessesFramework.hpp index 974cbdf..5cfc432 100644 --- a/include/TessesFramework/TessesFramework.hpp +++ b/include/TessesFramework/TessesFramework.hpp @@ -19,6 +19,7 @@ #include "TextStreams/StringReader.hpp" #include "TextStreams/StringWriter.hpp" #include "Text/StringConverter.hpp" +#include "Text/HeaderGenerator.hpp" #include "Threading/Thread.hpp" #include "Threading/Mutex.hpp" #include "Threading/ThreadPool.hpp" diff --git a/include/TessesFramework/Text/HeaderGenerator.hpp b/include/TessesFramework/Text/HeaderGenerator.hpp new file mode 100644 index 0000000..917a452 --- /dev/null +++ b/include/TessesFramework/Text/HeaderGenerator.hpp @@ -0,0 +1,11 @@ +#pragma once +#include "../Streams/MemoryStream.hpp" +#include "../TextStreams/StringWriter.hpp" + +namespace Tesses::Framework::Text { + void GenerateCHeaderFile(Streams::Stream* strm,std::string name, TextStreams::TextWriter* writer); + + std::string GenerateCHeaderFile(Streams::Stream* strm,std::string name); + void GenerateCHeaderFile(const std::vector& data,std::string name, TextStreams::TextWriter* writer); + std::string GenerateCHeaderFile(const std::vector& data,std::string name); +} \ No newline at end of file diff --git a/src/Text/HeaderGenerator.cpp b/src/Text/HeaderGenerator.cpp new file mode 100644 index 0000000..8e712ea --- /dev/null +++ b/src/Text/HeaderGenerator.cpp @@ -0,0 +1,69 @@ +#include "TessesFramework/Text/HeaderGenerator.hpp" +namespace Tesses::Framework::Text { + + void GenerateCHeaderFile(Streams::Stream* strm,std::string name, TextStreams::TextWriter* writer) + { + const size_t BLK_SZ=1024; + writer->WriteLine("#pragma once"); + writer->WriteLine("#if defined(__cplusplus)"); + writer->WriteLine("extern \"C\" {"); + writer->WriteLine("#endif"); + writer->WriteLine("#include "); + writer->WriteLine("#include "); + writer->Write("const uint8_t "); + writer->Write(name); + writer->WriteLine("_data[] = {"); + uint64_t total = 0; + size_t read; + + uint8_t* data = new uint8_t[BLK_SZ]; + bool first=true; + + + do { + read = strm->ReadBlock(data, BLK_SZ); + + for(size_t i = 0; i < read; i++) + { + if(!first) writer->Write(", "); + writer->Write((uint64_t)data[i]); + first=false; + } + total += read; + } while(read != 0); + + + delete data; + + writer->WriteLine("};"); + writer->Write("const size_t "); + writer->Write(name); + writer->Write("_length = "); + writer->Write(total); + writer->WriteLine(";"); + + writer->WriteLine("#if defined(__cplusplus)"); + writer->WriteLine("}"); + writer->WriteLine("#endif"); + + } + + std::string GenerateCHeaderFile(Streams::Stream* strm,std::string name) + { + TextStreams::StringWriter writer; + GenerateCHeaderFile(strm,name,&writer); + return writer.GetString(); + } + void GenerateCHeaderFile(const std::vector& data,std::string name, TextStreams::TextWriter* writer) + { + Tesses::Framework::Streams::MemoryStream ms(false); + ms.GetBuffer() = data; + GenerateCHeaderFile(&ms,name,writer); + } + std::string GenerateCHeaderFile(std::vector& data,std::string name) + { + TextStreams::StringWriter writer; + GenerateCHeaderFile(data,name,&writer); + return writer.GetString(); + } +}; \ No newline at end of file