From 6f54758123abe9f137922df1e8d7e33835e9a9f2 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Wed, 10 Feb 2021 22:53:50 +0200 Subject: Update VGA cursor position on printk --- libk/stdlib.h | 41 ++++++++++++++++++++++++----------------- libk/types.h | 1 + 2 files changed, 25 insertions(+), 17 deletions(-) (limited to 'libk') diff --git a/libk/stdlib.h b/libk/stdlib.h index 7d89a0c..a336586 100644 --- a/libk/stdlib.h +++ b/libk/stdlib.h @@ -7,33 +7,40 @@ class Console { 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(); }; template -void printk(const T& a) { - if (auto* c = Console::get()) { - if constexpr (is_same()) { - c->write(a); - } else if constexpr (requires { StringView(a); }) { - StringView v(a); - auto iter = v.begin(); - c->write(iter); - } else if constexpr (requires { IntegerView(a); }) { - IntegerView v(a); - auto iter = v.begin(); - c->write(iter); - } else - c->write(a); - } +void print_c(Console* c, const T& a) { + if constexpr (is_same()) { + c->write(a); + } else if constexpr (requires { StringView(a); }) { + StringView v(a); + auto iter = v.begin(); + c->write(iter); + } else if constexpr (requires { IntegerView(a); }) { + IntegerView v(a); + auto iter = v.begin(); + c->write(iter); + } else + c->write(a); +} + +template +void print_c(Console* console, const T& a, const Args&... x) { + print_c(console, a); + print_c(console, x...); } template void printk(const T& a, const Args&... x) { - printk(a); - printk(x...); + if (auto* c = Console::get()) { + print_c(c, a, x...); + c->update_cursor(); + } } extern "C" __attribute__((__noreturn__)) void abort(); diff --git a/libk/types.h b/libk/types.h index 4018ab8..599f852 100644 --- a/libk/types.h +++ b/libk/types.h @@ -19,6 +19,7 @@ template struct integral_constant { constexpr T operator()() const { return v; } constexpr operator T() const { return v; } + static const T value = v; }; /* is_same */ -- cgit v1.2.1