From 46a5f1ee4db70a037af5038deaa1d64ad0f7862c Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Fri, 12 Feb 2021 17:55:31 +0200 Subject: Add serial0 console output --- libk/stdlib.h | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) (limited to 'libk/stdlib.h') diff --git a/libk/stdlib.h b/libk/stdlib.h index a336586..7213384 100644 --- a/libk/stdlib.h +++ b/libk/stdlib.h @@ -2,15 +2,32 @@ #include +template +class Iterator { +public: + T next() { return buffer[reverse ? pos-- : pos++]; } + operator bool() const { return reverse ? (pos >= 0) : (pos < length); } + + explicit Iterator(T* b, size_t l) : buffer(b), length(l) { + if (reverse) + pos = length - 1; + }; + +private: + ssize_t pos = 0; + T* const buffer; + const size_t length; +}; + class Console { - public: - virtual ~Console() = default; - virtual void write(char c) = 0; - virtual void write(ViewIterator& msg) = 0; - virtual void update_cursor() = 0; - - static void set(Console* ptr); - static Console* get(); +public: + virtual ~Console() = default; + virtual void write(char c) = 0; + virtual void write(ViewIterator& msg) = 0; + virtual void update_cursor() = 0; + + static void set(Console* ptr); + static Iterator begin(); }; template @@ -37,7 +54,9 @@ void print_c(Console* console, const T& a, const Args&... x) { template void printk(const T& a, const Args&... x) { - if (auto* c = Console::get()) { + auto iter = Console::begin(); + while (iter) { + auto* c = iter.next(); print_c(c, a, x...); c->update_cursor(); } -- cgit v1.2.1