From aeed8530ad1845b716fddd7d863f3d6b58da00c9 Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Fri, 5 Aug 2022 02:26:36 +0000 Subject: [PATCH] Obj --- include/Orange/Core/FileSystem.h | 3 ++- include/Orange/Core/Parse.h | 29 ++++++++++++---------- include/Orange/Core/SmallVector.h | 8 +++++++ include/Orange/Core/Span.h | 10 ++++++++ src/Apps/Tools/CubeTest.cpp | 40 +++++++++++++++---------------- src/Orange/Core/Filesystem.cpp | 21 +++++++++++++--- 6 files changed, 75 insertions(+), 36 deletions(-) diff --git a/include/Orange/Core/FileSystem.h b/include/Orange/Core/FileSystem.h index 2cbb5d6..ef3e82d 100644 --- a/include/Orange/Core/FileSystem.h +++ b/include/Orange/Core/FileSystem.h @@ -6,5 +6,6 @@ namespace orange::fs { - Result OpenFileIntoBuffer(const char* path, bool text = false); + Result OpenFileIntoBuffer(const char* path); + Result OpenFileIntoTextBuffer(const char* path); } diff --git a/include/Orange/Core/Parse.h b/include/Orange/Core/Parse.h index ac93d7d..11d3472 100644 --- a/include/Orange/Core/Parse.h +++ b/include/Orange/Core/Parse.h @@ -17,7 +17,7 @@ namespace orange::stream if (result.ec == std::errc{}) { first = result.ptr; - return Result::Success(obj); + return Result::Success(obj); } return Result::Error(BasicErrorCode::NotFound); @@ -35,6 +35,11 @@ namespace orange::stream return Parse(first, first + strlen(first)); } + inline bool EndOfStream(const char* first, const char* end) + { + return first == end || *first == '\0'; + } + inline bool CharMatches(char character, StringView delims) { for (auto delim : delims) @@ -46,10 +51,10 @@ namespace orange::stream return false; } - inline size_t Consume(const char*& first, StringView delims) + inline size_t Consume(const char*& first, const char* end, StringView delims) { size_t count = 0; - while (CharMatches(*first, delims)) + while (!EndOfStream(first, end) && CharMatches(*first, delims)) { first++; count++; @@ -58,16 +63,16 @@ namespace orange::stream return count; } - inline size_t ConsumeSpace(const char*& first) + inline size_t ConsumeSpace(const char*& first, const char* end) { - return Consume(first, " \t"); + return Consume(first, end, " \t"); } template > - size_t ReadOrAdvance(const char*& first, StringView delims, size_t advancement = 0, OutArray* array = nullptr) + size_t ReadOrAdvance(const char*& first, const char* end, StringView delims, size_t advancement = 0, OutArray* array = nullptr) { size_t count = 0; - while (!CharMatches(*first, delims) && *first != '\0') + while (!EndOfStream(first, end) && !CharMatches(*first, delims)) { if (array) array->PushBack(*first); @@ -75,7 +80,7 @@ namespace orange::stream count++; } - if (*first == '\0') + if (EndOfStream(first, end)) return count; first += advancement; @@ -84,13 +89,13 @@ namespace orange::stream } template > - size_t ReadString(const char*& first, StringView delims, OutArray& array) + size_t ReadString(const char*& first, const char* end, StringView delims, OutArray& array) { - return ReadOrAdvance(first, delims, 0, &array); + return ReadOrAdvance(first, end, delims, 0, &array); } - inline size_t AdvancePast(const char*& first, StringView delims) + inline size_t AdvancePast(const char*& first, const char* end, StringView delims) { - return ReadOrAdvance(first, delims, 1); + return ReadOrAdvance(first, end, delims, 1); } } diff --git a/include/Orange/Core/SmallVector.h b/include/Orange/Core/SmallVector.h index 872cab6..775fe22 100644 --- a/include/Orange/Core/SmallVector.h +++ b/include/Orange/Core/SmallVector.h @@ -118,6 +118,11 @@ namespace orange Ptr(--m_size)->~T(); } + bool Empty() const + { + return Size() == 0; + } + T& operator [] (size_t idx) { return *Ptr(idx); } const T& operator [] (size_t idx) const { return *Ptr(idx); } @@ -171,4 +176,7 @@ namespace orange }; + template + using Vector = SmallVector; + } diff --git a/include/Orange/Core/Span.h b/include/Orange/Core/Span.h index a6aaccb..1df9385 100644 --- a/include/Orange/Core/Span.h +++ b/include/Orange/Core/Span.h @@ -58,8 +58,11 @@ namespace orange }; using BufferView = Span; + struct StringView : public Span { + using Span::Span; + StringView(const char* str) : Span{str, strlen(str)} {} }; @@ -70,4 +73,11 @@ namespace orange ~Buffer() { delete[] data; } }; + + struct TextBuffer : public Span + { + using Span::Span; + + ~TextBuffer() { delete[] data; } + }; } diff --git a/src/Apps/Tools/CubeTest.cpp b/src/Apps/Tools/CubeTest.cpp index 647a215..6a2e9ac 100644 --- a/src/Apps/Tools/CubeTest.cpp +++ b/src/Apps/Tools/CubeTest.cpp @@ -10,23 +10,25 @@ using namespace orange; -Result ParseOBJ(BufferView buffer) +Result ParseOBJ(StringView buffer) { - const char* obj = (const char *)buffer.data; - do + const char* obj = buffer.data; + const char* end = buffer.data + buffer.size; + while (obj != end) { SmallVector element; - stream::ReadString(obj, " #\n", element); + stream::ReadString(obj, end, " #\n", element); if (element == "v" || element == "vn" || element == "vt") { float vtx[3]{}; for (int i = 0; i < 3; i++) { - stream::ConsumeSpace(obj); - auto r_float = stream::Parse(obj); - if (!r_float) return Result::Error(); - vtx[i] = *r_float; + stream::ConsumeSpace(obj, end); + if (auto r_float = stream::Parse(obj, end)) + vtx[i] = *r_float; + else + return Result::Error(); } element.PushBack('\0'); @@ -34,9 +36,9 @@ Result ParseOBJ(BufferView buffer) } else if (element == "g" || element == "o") { - stream::ConsumeSpace(obj); + stream::ConsumeSpace(obj, end); SmallVector name; - stream::ReadString(obj, " #\n", name); + stream::ReadString(obj, end, " #\n", name); name.PushBack('\0'); if (element == "g") @@ -49,18 +51,16 @@ Result ParseOBJ(BufferView buffer) int32_t indices[3][3]{}; for (int i = 0; i < 3; i++) { - stream::ConsumeSpace(obj); + stream::ConsumeSpace(obj, end); for (int j = 0; j < 3; j++) { indices[i][j] = -1; - if (j == 0 || stream::Consume(obj, "/")) + if (j == 0 || stream::Consume(obj, end, "/")) { - auto r_int = stream::Parse(obj); - if (!r_int) continue; - - indices[i][j] = *r_int; + if (auto r_int = stream::Parse(obj, end)) + indices[i][j] = *r_int; } } } @@ -69,14 +69,14 @@ Result ParseOBJ(BufferView buffer) indices[1][0], indices[1][1], indices[1][2], indices[2][0], indices[2][1], indices[2][2]); } - else if (element.Size()) + else if (!element.Empty()) { element.PushBack('\0'); log::info("Unknown element: %s", element.Data()); } - stream::AdvancePast(obj, "\n"); - } while (*obj != '\0'); + stream::AdvancePast(obj, end, "\n"); + }; return Result::Success(); } @@ -101,7 +101,7 @@ int main(int argc, char** argv) if (!r_swapchain) return 1; - auto r_objData = fs::OpenFileIntoBuffer("/home/joshua/chair.obj", true); + auto r_objData = fs::OpenFileIntoTextBuffer("/home/joshua/chair.obj"); if (!r_objData) return 1; diff --git a/src/Orange/Core/Filesystem.cpp b/src/Orange/Core/Filesystem.cpp index 82a373c..712afc1 100644 --- a/src/Orange/Core/Filesystem.cpp +++ b/src/Orange/Core/Filesystem.cpp @@ -4,9 +4,9 @@ namespace orange::fs { - Result OpenFileIntoBuffer(const char* path, bool text) + Result OpenFileIntoBuffer(const char* path) { - FILE* file = fopen(path, text ? "r" : "rb"); + FILE* file = fopen(path, "rb"); if (!file) Result::Error(BasicErrorCode::NotFound); fseek(file, 0, SEEK_END); @@ -16,8 +16,23 @@ namespace orange::fs uint8_t* data = new uint8_t[size]; fread(data, size, 1, file); fclose(file); - if (text) data[size++] = '\0'; return Result::Success(data, size); } + + Result OpenFileIntoTextBuffer(const char* path) + { + FILE* file = fopen(path, "rb"); + if (!file) + Result::Error(BasicErrorCode::NotFound); + fseek(file, 0, SEEK_END); + size_t size = size_t(ftell(file)); + fseek(file, 0, SEEK_SET); + + char* data = new char[size]; + fread(data, size, 1, file); + fclose(file); + + return Result::Success(data, size); + } }