[Glacier][Zion] Add a fix sized string builder to allow non-alloc debug.
This commit is contained in:
parent
601f29c324
commit
8d10f19312
|
@ -66,7 +66,8 @@ String StrFormat(StringView format, Args... args) {
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename... Args>
|
template <typename... Args>
|
||||||
void StrFormat(StringBuilder& builder, StringView format, Args... args) {
|
void StrFormatIntoBuffer(StringBuilder& builder, StringView format,
|
||||||
|
Args... args) {
|
||||||
StrFormatInternal(builder, format, args...);
|
StrFormatInternal(builder, format, args...);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,4 +27,27 @@ VariableStringBuilder::operator StringView() const {
|
||||||
return StringView(data_.RawPtr(), size());
|
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
|
} // namespace glcr
|
||||||
|
|
|
@ -41,4 +41,29 @@ class VariableStringBuilder : public StringBuilder {
|
||||||
Vector<char> data_;
|
Vector<char> 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
|
} // namespace glcr
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <glacier/string/str_format.h>
|
#include <glacier/string/str_format.h>
|
||||||
|
#include <glacier/string/string_builder.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
#include "include/ztypes.h"
|
#include "include/ztypes.h"
|
||||||
|
@ -21,13 +22,22 @@ void dbgln(const glcr::StringView& str);
|
||||||
|
|
||||||
template <typename... Args>
|
template <typename... Args>
|
||||||
void dbgln(const char* str, Args... args) {
|
void dbgln(const char* str, Args... args) {
|
||||||
|
char buffer[256];
|
||||||
|
glcr::FixedStringBuilder builder(buffer, 256);
|
||||||
|
glcr::StrFormatIntoBuffer(builder, str, args...);
|
||||||
|
dbgln(builder);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename... Args>
|
||||||
|
void dbgln_large(const char* str, Args... args) {
|
||||||
dbgln(glcr::StrFormat(str, args...));
|
dbgln(glcr::StrFormat(str, args...));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename... Args>
|
template <typename... Args>
|
||||||
void panic(const char* str, Args... args) {
|
void panic(const char* str, Args... args) {
|
||||||
dbgln(glcr::StrFormat(str, args...));
|
dbgln(str, args...);
|
||||||
dbgln("PANIC");
|
dbgln("PANIC");
|
||||||
|
asm volatile("hlt;");
|
||||||
}
|
}
|
||||||
|
|
||||||
#define UNREACHABLE \
|
#define UNREACHABLE \
|
||||||
|
|
|
@ -5,6 +5,6 @@
|
||||||
#include "debug/debug.h"
|
#include "debug/debug.h"
|
||||||
|
|
||||||
z_err_t Debug(ZDebugReq* req) {
|
z_err_t Debug(ZDebugReq* req) {
|
||||||
dbgln("[Debug] {}", req->message);
|
dbgln_large("[Debug] {}", req->message);
|
||||||
return glcr::OK;
|
return glcr::OK;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue