#include "fs/devices/ConsoleDevice.h" #include "video/TextConsole.h" #include #include #include static Buffer g_console_input; Result> ConsoleDevice::create() { return (SharedPtr)TRY(make_shared()); } Result ConsoleDevice::read(u8* buf, usize, usize length) const { if (length > g_console_input.size()) length = g_console_input.size(); memcpy(buf, g_console_input.data(), length); memmove(g_console_input.data(), g_console_input.data() + length, g_console_input.size() - length); g_console_input.try_resize(g_console_input.size() - length).release_value(); return length; } Result ConsoleDevice::write(const u8* buf, usize, usize length) { TextConsole::write((const char*)buf, length); return length; } bool ConsoleDevice::blocking() const { return g_console_input.size() == 0; } static Vector g_temp_input; void ConsoleDevice::did_press_key(char key) { if (key == '\b') { if (g_temp_input.try_pop().has_value()) TextConsole::putwchar(L'\b'); return; } g_temp_input.try_append((u8)key).value(); if (key == '\n') { g_console_input.append_data(g_temp_input.data(), g_temp_input.size()).value(); g_temp_input.clear(); } TextConsole::putchar(key); }