diff --git a/lib/glacier/string/str_format.h b/lib/glacier/string/str_format.h index ca00e3e..547d608 100644 --- a/lib/glacier/string/str_format.h +++ b/lib/glacier/string/str_format.h @@ -66,7 +66,8 @@ String StrFormat(StringView format, Args... args) { } template -void StrFormat(StringBuilder& builder, StringView format, Args... args) { +void StrFormatIntoBuffer(StringBuilder& builder, StringView format, + Args... args) { StrFormatInternal(builder, format, args...); } diff --git a/lib/glacier/string/string_builder.cpp b/lib/glacier/string/string_builder.cpp index 3b75e86..2fbd176 100644 --- a/lib/glacier/string/string_builder.cpp +++ b/lib/glacier/string/string_builder.cpp @@ -27,4 +27,27 @@ VariableStringBuilder::operator StringView() const { return StringView(data_.RawPtr(), size()); } +void FixedStringBuilder::PushBack(const StringView& str) { + for (uint64_t i = 0; i < str.size(); i++) { + PushBack(str[i]); + } +} + +void FixedStringBuilder::PushBack(const char str) { + if (size_ >= capacity_) { + // Somewhat random sequence of characters to show that we've overrun the + // buffer. + buffer_[capacity_ - 1] = '>'; + buffer_[capacity_ - 2] = '!'; + } else { + buffer_[size_++] = str; + } +} + +String FixedStringBuilder::ToString() const { return String(buffer_, size_); } + +FixedStringBuilder::operator StringView() const { + return StringView(buffer_, size_); +} + } // namespace glcr diff --git a/lib/glacier/string/string_builder.h b/lib/glacier/string/string_builder.h index 2342033..444fbc1 100644 --- a/lib/glacier/string/string_builder.h +++ b/lib/glacier/string/string_builder.h @@ -41,4 +41,29 @@ class VariableStringBuilder : public StringBuilder { Vector data_; }; +class FixedStringBuilder : public StringBuilder { + public: + FixedStringBuilder() = delete; + FixedStringBuilder(const FixedStringBuilder&) = delete; + FixedStringBuilder(FixedStringBuilder&&) = delete; + ~FixedStringBuilder() = default; + + FixedStringBuilder(char* buffer, uint64_t size) + : buffer_(buffer), capacity_(size), size_(0) {} + + virtual uint64_t size() const override { return size_; } + + virtual void PushBack(const StringView& str) override; + virtual void PushBack(const char str) override; + + virtual String ToString() const override; + + virtual operator StringView() const override; + + private: + char* buffer_; + uint64_t capacity_; + uint64_t size_; +}; + } // namespace glcr diff --git a/zion/debug/debug.h b/zion/debug/debug.h index aeace6f..2f6be94 100644 --- a/zion/debug/debug.h +++ b/zion/debug/debug.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include "include/ztypes.h" @@ -21,13 +22,22 @@ void dbgln(const glcr::StringView& str); template void dbgln(const char* str, Args... args) { + char buffer[256]; + glcr::FixedStringBuilder builder(buffer, 256); + glcr::StrFormatIntoBuffer(builder, str, args...); + dbgln(builder); +} + +template +void dbgln_large(const char* str, Args... args) { dbgln(glcr::StrFormat(str, args...)); } template void panic(const char* str, Args... args) { - dbgln(glcr::StrFormat(str, args...)); + dbgln(str, args...); dbgln("PANIC"); + asm volatile("hlt;"); } #define UNREACHABLE \ diff --git a/zion/syscall/debug.cpp b/zion/syscall/debug.cpp index e16febc..a4c728e 100644 --- a/zion/syscall/debug.cpp +++ b/zion/syscall/debug.cpp @@ -5,6 +5,6 @@ #include "debug/debug.h" z_err_t Debug(ZDebugReq* req) { - dbgln("[Debug] {}", req->message); + dbgln_large("[Debug] {}", req->message); return glcr::OK; }