aboutsummaryrefslogtreecommitdiff
path: root/libk
diff options
context:
space:
mode:
authorAqua-sama <aqua@iserlohn-fortress.net>2021-02-10 22:53:50 +0200
committerAqua-sama <aqua@iserlohn-fortress.net>2021-02-10 22:53:50 +0200
commit6f54758123abe9f137922df1e8d7e33835e9a9f2 (patch)
treee21b553a826c7ae67cc4b41ffde921e39ed4022b /libk
parentAdd some compiler warnings (diff)
downloadkernel.cpp-6f54758123abe9f137922df1e8d7e33835e9a9f2.tar.xz
Update VGA cursor position on printk
Diffstat (limited to 'libk')
-rw-r--r--libk/stdlib.h41
-rw-r--r--libk/types.h1
2 files changed, 25 insertions, 17 deletions
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 <typename T>
-void printk(const T& a) {
- if (auto* c = Console::get()) {
- if constexpr (is_same<T, char>()) {
- 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<T, char>()) {
+ 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 <typename T, typename... Args>
+void print_c(Console* console, const T& a, const Args&... x) {
+ print_c(console, a);
+ print_c(console, x...);
}
template <typename T, typename... Args>
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 <class T, T v>
struct integral_constant {
constexpr T operator()() const { return v; }
constexpr operator T() const { return v; }
+ static const T value = v;
};
/* is_same */