forked from Bananymous/banan-os
Kernel: Add cksum to Shell for file read testing
I also removed the 'using namespace BAN'
This commit is contained in:
parent
8236598f9d
commit
b41491e205
|
@ -14,12 +14,11 @@
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
|
||||||
#define TTY_PRINT(...) Formatter::print([this](char c) { m_tty->putchar(c); }, __VA_ARGS__)
|
#define TTY_PRINT(...) BAN::Formatter::print([this](char c) { m_tty->putchar(c); }, __VA_ARGS__)
|
||||||
#define TTY_PRINTLN(...) Formatter::println([this](char c) { m_tty->putchar(c); }, __VA_ARGS__)
|
#define TTY_PRINTLN(...) BAN::Formatter::println([this](char c) { m_tty->putchar(c); }, __VA_ARGS__)
|
||||||
|
|
||||||
namespace Kernel
|
namespace Kernel
|
||||||
{
|
{
|
||||||
using namespace BAN;
|
|
||||||
|
|
||||||
static auto s_default_prompt = "\\[\e[32m\\]user\\[\e[m\\]:\\[\e[34m\\]\\w\\[\e[m\\]# "sv;
|
static auto s_default_prompt = "\\[\e[32m\\]user\\[\e[m\\]:\\[\e[34m\\]\\w\\[\e[m\\]# "sv;
|
||||||
|
|
||||||
|
@ -31,7 +30,7 @@ namespace Kernel
|
||||||
MUST(m_buffer.push_back(""sv));
|
MUST(m_buffer.push_back(""sv));
|
||||||
}
|
}
|
||||||
|
|
||||||
BAN::ErrorOr<void> Shell::set_prompt(StringView prompt)
|
BAN::ErrorOr<void> Shell::set_prompt(BAN::StringView prompt)
|
||||||
{
|
{
|
||||||
m_prompt_string = prompt;
|
m_prompt_string = prompt;
|
||||||
TRY(update_prompt());
|
TRY(update_prompt());
|
||||||
|
@ -41,7 +40,7 @@ namespace Kernel
|
||||||
BAN::ErrorOr<void> Shell::update_prompt()
|
BAN::ErrorOr<void> Shell::update_prompt()
|
||||||
{
|
{
|
||||||
m_prompt_length = 0;
|
m_prompt_length = 0;
|
||||||
m_prompt = String();
|
m_prompt.clear();
|
||||||
|
|
||||||
bool skipping = false;
|
bool skipping = false;
|
||||||
for (size_t i = 0; i < m_prompt_string.size(); i++)
|
for (size_t i = 0; i < m_prompt_string.size(); i++)
|
||||||
|
@ -89,9 +88,9 @@ namespace Kernel
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<String> Shell::parse_arguments(StringView command) const
|
BAN::Vector<BAN::String> Shell::parse_arguments(BAN::StringView command) const
|
||||||
{
|
{
|
||||||
Vector<String> result;
|
BAN::Vector<BAN::String> result;
|
||||||
|
|
||||||
while (!command.empty())
|
while (!command.empty())
|
||||||
{
|
{
|
||||||
|
@ -162,7 +161,9 @@ argument_done:
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
BAN::ErrorOr<void> Shell::process_command(const Vector<String>& arguments)
|
extern uint32_t crc32_table[256];
|
||||||
|
|
||||||
|
BAN::ErrorOr<void> Shell::process_command(const BAN::Vector<BAN::String>& arguments)
|
||||||
{
|
{
|
||||||
if (arguments.empty())
|
if (arguments.empty())
|
||||||
{
|
{
|
||||||
|
@ -207,7 +208,7 @@ argument_done:
|
||||||
{
|
{
|
||||||
Shell* shell;
|
Shell* shell;
|
||||||
SpinLock& lock;
|
SpinLock& lock;
|
||||||
const Vector<String>& arguments;
|
const BAN::Vector<BAN::String>& arguments;
|
||||||
};
|
};
|
||||||
|
|
||||||
auto function = [](void* data)
|
auto function = [](void* data)
|
||||||
|
@ -221,7 +222,7 @@ argument_done:
|
||||||
PIT::sleep(5000);
|
PIT::sleep(5000);
|
||||||
|
|
||||||
if (auto res = shell->process_command(args); res.is_error())
|
if (auto res = shell->process_command(args); res.is_error())
|
||||||
Formatter::println([&](char c) { shell->m_tty->putchar(c); }, "{}", res.error());
|
BAN::Formatter::println([&](char c) { shell->m_tty->putchar(c); }, "{}", res.error());
|
||||||
};
|
};
|
||||||
|
|
||||||
SpinLock spinlock;
|
SpinLock spinlock;
|
||||||
|
@ -358,6 +359,37 @@ argument_done:
|
||||||
TRY(Process::current()->set_working_directory(path));
|
TRY(Process::current()->set_working_directory(path));
|
||||||
TRY(update_prompt());
|
TRY(update_prompt());
|
||||||
}
|
}
|
||||||
|
else if (arguments.front() == "cksum")
|
||||||
|
{
|
||||||
|
if (arguments.size() < 2)
|
||||||
|
return BAN::Error::from_c_string("usage 'cksum paths...'");
|
||||||
|
|
||||||
|
uint8_t buffer[1024];
|
||||||
|
for (size_t i = 1; i < arguments.size(); i++)
|
||||||
|
{
|
||||||
|
int fd = TRY(Process::current()->open(arguments[i], O_RDONLY));
|
||||||
|
BAN::ScopeGuard _([fd] { MUST(Process::current()->close(fd)); });
|
||||||
|
|
||||||
|
uint32_t crc32 = 0;
|
||||||
|
uint32_t total_read = 0;
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
size_t n_read = TRY(Process::current()->read(fd, buffer, sizeof(buffer)));
|
||||||
|
if (n_read == 0)
|
||||||
|
break;
|
||||||
|
for (size_t j = 0; j < n_read; j++)
|
||||||
|
crc32 = (crc32 << 8) ^ crc32_table[((crc32 >> 24) ^ buffer[j]) & 0xFF];
|
||||||
|
total_read += n_read;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint32_t length = total_read; length; length >>= 8)
|
||||||
|
crc32 = (crc32 << 8) ^ crc32_table[((crc32 >> 24) ^ length) & 0xFF];
|
||||||
|
crc32 = ~crc32 & 0xFFFFFFFF;
|
||||||
|
|
||||||
|
TTY_PRINTLN("{} {} {}", crc32, total_read, arguments[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
else if (arguments.front() == "loadfont")
|
else if (arguments.front() == "loadfont")
|
||||||
{
|
{
|
||||||
if (arguments.size() != 2)
|
if (arguments.size() != 2)
|
||||||
|
@ -379,23 +411,23 @@ argument_done:
|
||||||
TTY_PRINT("\e[{}G{}\e[K", m_prompt_length + 1, m_buffer[m_cursor_pos.line]);
|
TTY_PRINT("\e[{}G{}\e[K", m_prompt_length + 1, m_buffer[m_cursor_pos.line]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t get_last_length(StringView sv)
|
static uint32_t get_last_length(BAN::StringView sv)
|
||||||
{
|
{
|
||||||
if (sv.size() >= 2 && ((uint8_t)sv[sv.size() - 2] >> 5) == 0b110) return 2;
|
if (sv.size() >= 2 && ((uint8_t)sv[sv.size() - 2] >> 5) == 0b110) return 2;
|
||||||
if (sv.size() >= 3 && ((uint8_t)sv[sv.size() - 3] >> 4) == 0b1110) return 3;
|
if (sv.size() >= 3 && ((uint8_t)sv[sv.size() - 3] >> 4) == 0b1110) return 3;
|
||||||
if (sv.size() >= 4 && ((uint8_t)sv[sv.size() - 4] >> 3) == 0b11110) return 4;
|
if (sv.size() >= 4 && ((uint8_t)sv[sv.size() - 4] >> 3) == 0b11110) return 4;
|
||||||
return Math::min<uint32_t>(sv.size(), 1);
|
return BAN::Math::min<uint32_t>(sv.size(), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t get_next_length(StringView sv)
|
static uint32_t get_next_length(BAN::StringView sv)
|
||||||
{
|
{
|
||||||
if (sv.size() >= 2 && ((uint8_t)sv[0] >> 5) == 0b110) return 2;
|
if (sv.size() >= 2 && ((uint8_t)sv[0] >> 5) == 0b110) return 2;
|
||||||
if (sv.size() >= 3 && ((uint8_t)sv[0] >> 4) == 0b1110) return 3;
|
if (sv.size() >= 3 && ((uint8_t)sv[0] >> 4) == 0b1110) return 3;
|
||||||
if (sv.size() >= 4 && ((uint8_t)sv[0] >> 3) == 0b11110) return 4;
|
if (sv.size() >= 4 && ((uint8_t)sv[0] >> 3) == 0b11110) return 4;
|
||||||
return Math::min<uint32_t>(sv.size(), 1);
|
return BAN::Math::min<uint32_t>(sv.size(), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t get_unicode_character_count(StringView sv)
|
static uint32_t get_unicode_character_count(BAN::StringView sv)
|
||||||
{
|
{
|
||||||
uint32_t len = 0;
|
uint32_t len = 0;
|
||||||
for (uint32_t i = 0; i < sv.size(); i++)
|
for (uint32_t i = 0; i < sv.size(); i++)
|
||||||
|
@ -414,7 +446,7 @@ argument_done:
|
||||||
if (!event.pressed)
|
if (!event.pressed)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
String& current_buffer = m_buffer[m_cursor_pos.line];
|
BAN::String& current_buffer = m_buffer[m_cursor_pos.line];
|
||||||
|
|
||||||
switch (event.key)
|
switch (event.key)
|
||||||
{
|
{
|
||||||
|
@ -497,6 +529,14 @@ argument_done:
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case Input::Key::A:
|
||||||
|
if (event.modifiers & 2)
|
||||||
|
{
|
||||||
|
m_cursor_pos.col = m_cursor_pos.index = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// fall through
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
const char* utf8 = Input::key_event_to_utf8(event);
|
const char* utf8 = Input::key_event_to_utf8(event);
|
||||||
|
|
Loading…
Reference in New Issue