Compare commits

...

4 Commits

11 changed files with 95 additions and 20 deletions

View File

@ -45,6 +45,8 @@ class Vector {
template <typename... Args>
void EmplaceBack(Args&&... args);
T&& PopBack();
private:
T* data_;
uint64_t size_;
@ -119,6 +121,12 @@ void Vector<T>::EmplaceBack(Args&&... args) {
data_[size_++] = T(args...);
}
template <typename T>
T&& Vector<T>::PopBack() {
size_--;
return glcr::Move(data_[size_]);
}
template <typename T>
void Vector<T>::Expand() {
uint64_t new_capacity = capacity_ == 0 ? 1 : capacity_ * 2;

View File

@ -19,6 +19,14 @@ void VariableStringBuilder::PushBack(const StringView& str) {
void VariableStringBuilder::PushBack(const char str) { data_.PushBack(str); }
void VariableStringBuilder::DeleteLast() {
if (data_.size() > 0) {
data_.PopBack();
}
}
void VariableStringBuilder::Reset() { data_ = glcr::Vector<char>(); }
String VariableStringBuilder::ToString() const {
return String(data_.RawPtr(), size());
}
@ -50,4 +58,12 @@ FixedStringBuilder::operator StringView() const {
return StringView(buffer_, size_);
}
void FixedStringBuilder::DeleteLast() {
if (size_ > 0) {
size_--;
}
}
void FixedStringBuilder::Reset() { size_ = 0; }
} // namespace glcr

View File

@ -12,6 +12,9 @@ class StringBuilder {
virtual void PushBack(const StringView& str) = 0;
virtual void PushBack(const char str) = 0;
virtual void DeleteLast() = 0;
virtual void Reset() = 0;
virtual String ToString() const = 0;
virtual operator StringView() const = 0;
@ -30,6 +33,9 @@ class VariableStringBuilder : public StringBuilder {
virtual void PushBack(const StringView& str) override;
virtual void PushBack(const char str) override;
virtual void DeleteLast() override;
virtual void Reset() override;
virtual String ToString() const override;
// Note that this could become invalidated
@ -56,6 +62,9 @@ class FixedStringBuilder : public StringBuilder {
virtual void PushBack(const StringView& str) override;
virtual void PushBack(const char str) override;
virtual void DeleteLast() override;
virtual void Reset() override;
virtual String ToString() const override;
virtual operator StringView() const override;

View File

@ -102,6 +102,8 @@ void KeyboardListenerBase::HandleKeycode(Keycode code, Action action) {
c = ' ';
} else if (code == kTab) {
c = '\t';
} else if (code == kBackspace) {
c = '\b';
} else if (code == kLShift) {
lshift_ = true;
} else if (code == kRShift) {

View File

@ -2,7 +2,7 @@ add_executable(teton
framebuffer/console.cpp
framebuffer/framebuffer.cpp
framebuffer/psf.cpp
keyboard_listener.cpp
terminal.cpp
teton.cpp
)

View File

@ -7,6 +7,16 @@ void Console::WriteChar(char c) {
CursorReturn();
return;
}
if (c == '\t') {
WriteString(" ");
return;
}
if (c == '\b') {
cursor_pos_--;
WriteChar(' ');
cursor_pos_--;
return;
}
uint64_t row = cursor_pos_ / cols();
if (row >= rows()) {

View File

@ -1,3 +0,0 @@
#include "keyboard_listener.h"
void KeyboardListener::HandleCharacter(char c) { console_.WriteChar(c); }

View File

@ -1,12 +0,0 @@
#include <mammoth/input/keyboard.h>
#include "framebuffer/console.h"
class KeyboardListener : public mmth::KeyboardListenerBase {
public:
KeyboardListener(Console& c) : mmth::KeyboardListenerBase(), console_(c) {}
virtual void HandleCharacter(char c) override;
private:
Console& console_;
};

26
sys/teton/terminal.cpp Normal file
View File

@ -0,0 +1,26 @@
#include "terminal.h"
void Terminal::HandleCharacter(char c) {
console_.WriteChar(c);
if (c == '\n') {
glcr::String str = current_command_.ToString();
ExecuteCommand(str);
current_command_.Reset();
} else if (c == '\b') {
current_command_.DeleteLast();
} else {
current_command_.PushBack(c);
}
}
void Terminal::ExecuteCommand(const glcr::String& command) {
if (command == "cwd") {
console_.WriteString(cwd_);
console_.WriteChar('\n');
} else {
console_.WriteString("Unknown command: ");
console_.WriteString(command);
console_.WriteChar('\n');
}
console_.WriteChar('>');
}

19
sys/teton/terminal.h Normal file
View File

@ -0,0 +1,19 @@
#include <glacier/string/string_builder.h>
#include <mammoth/input/keyboard.h>
#include "framebuffer/console.h"
class Terminal : public mmth::KeyboardListenerBase {
public:
Terminal(Console& c) : mmth::KeyboardListenerBase(), console_(c) {}
virtual void HandleCharacter(char c) override;
void ExecuteCommand(const glcr::String& command);
private:
Console& console_;
glcr::VariableStringBuilder current_command_;
glcr::String cwd_ = "/";
};

View File

@ -7,7 +7,7 @@
#include "framebuffer/console.h"
#include "framebuffer/framebuffer.h"
#include "framebuffer/psf.h"
#include "keyboard_listener.h"
#include "terminal.h"
uint64_t main(uint64_t init_port) {
ParseInitPort(init_port);
@ -34,10 +34,10 @@ uint64_t main(uint64_t init_port) {
Console console(fbuf, psf);
console.WriteChar('>');
KeyboardListener listener(console);
listener.Register();
Terminal terminal(console);
terminal.Register();
Thread lthread = listener.Listen();
Thread lthread = terminal.Listen();
check(lthread.Join());