mirror of
https://github.com/wichtounet/thor-os.git
synced 2025-09-18 09:04:49 -04:00
Add a way to disable history
This commit is contained in:
parent
c7717a8ea8
commit
40a9f18219
@ -3,9 +3,10 @@ default: kernel.bin
|
|||||||
CC=x86_64-elf-g++
|
CC=x86_64-elf-g++
|
||||||
AS=x86_64-elf-as
|
AS=x86_64-elf-as
|
||||||
|
|
||||||
|
THOR_FLAGS=-DCONFIG_HISTORY=y
|
||||||
WARNING_FLAGS=-Wall -Wextra -pedantic -Wold-style-cast -Wshadow
|
WARNING_FLAGS=-Wall -Wextra -pedantic -Wold-style-cast -Wshadow
|
||||||
CPP_FLAGS=-masm=intel -Iinclude/ -nostdlib -Os -std=c++11 -fno-exceptions -fno-rtti -ffreestanding -mno-red-zone -mno-mmx -mno-sse -mno-sse2 -mno-sse3 -mno-3dnow $(WARNING_FLAGS)
|
CPP_FLAGS=-masm=intel -Iinclude/ -nostdlib -Os -std=c++11 -fno-exceptions -fno-rtti -ffreestanding -mno-red-zone -mno-mmx -mno-sse -mno-sse2 -mno-sse3 -mno-3dnow $(WARNING_FLAGS)
|
||||||
KERNEL_FLAGS=$(CPP_FLAGS)
|
KERNEL_FLAGS=$(CPP_FLAGS) $(THOR_FLAGS)
|
||||||
KERNEL_LINK_FLAGS=-lgcc -T linker.ld $(CPP_FLAGS)
|
KERNEL_LINK_FLAGS=-lgcc -T linker.ld $(CPP_FLAGS)
|
||||||
|
|
||||||
KERNEL_CPP_FILES=$(wildcard src/*.cpp)
|
KERNEL_CPP_FILES=$(wildcard src/*.cpp)
|
||||||
|
@ -23,8 +23,14 @@
|
|||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
#ifdef CONFIG_HISTORY
|
||||||
|
static constexpr bool History = true;
|
||||||
|
#else
|
||||||
|
static constexpr bool History = false;
|
||||||
|
#endif
|
||||||
|
|
||||||
vector<char*> history;
|
vector<char*> history;
|
||||||
uint64_t history_index;
|
uint64_t history_index = 0;
|
||||||
|
|
||||||
bool shift = false;
|
bool shift = false;
|
||||||
|
|
||||||
@ -79,6 +85,59 @@ char current_input[50];
|
|||||||
|
|
||||||
void exec_command();
|
void exec_command();
|
||||||
|
|
||||||
|
template<bool Enable = History>
|
||||||
|
void history_key(char key){
|
||||||
|
if(history.size() > 0){
|
||||||
|
if(key == keyboard::KEY_UP){
|
||||||
|
if(history_index == 0){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
--history_index;
|
||||||
|
} else { //KEY_DOWN
|
||||||
|
if(history_index == history.size()){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
++history_index;
|
||||||
|
}
|
||||||
|
|
||||||
|
set_column(6);
|
||||||
|
|
||||||
|
for(uint64_t i = 0; i < current_input_length; ++i){
|
||||||
|
k_print(' ');
|
||||||
|
}
|
||||||
|
|
||||||
|
set_column(6);
|
||||||
|
|
||||||
|
current_input_length = 0;
|
||||||
|
|
||||||
|
if(history_index < history.size()){
|
||||||
|
auto saved = history[history_index];
|
||||||
|
while(*saved){
|
||||||
|
current_input[current_input_length++] = *saved;
|
||||||
|
k_print(*saved);
|
||||||
|
|
||||||
|
++saved;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<> void history_key<false>(char){}
|
||||||
|
|
||||||
|
template<bool Enable = History>
|
||||||
|
void history_save(){
|
||||||
|
auto saved = new char[current_input_length + 1];
|
||||||
|
memcopy(saved, current_input, current_input_length);
|
||||||
|
saved[current_input_length] = '\0';
|
||||||
|
|
||||||
|
history.push_back(saved);
|
||||||
|
history_index = history.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<> void history_save<false>(){}
|
||||||
|
|
||||||
void start_shell(){
|
void start_shell(){
|
||||||
while(true){
|
while(true){
|
||||||
auto key = keyboard::get_char();
|
auto key = keyboard::get_char();
|
||||||
@ -112,41 +171,7 @@ void start_shell(){
|
|||||||
} else if(key == keyboard::KEY_LEFT_SHIFT || key == keyboard::KEY_RIGHT_SHIFT){
|
} else if(key == keyboard::KEY_LEFT_SHIFT || key == keyboard::KEY_RIGHT_SHIFT){
|
||||||
shift = true;
|
shift = true;
|
||||||
} else if(key == keyboard::KEY_UP || key == keyboard::KEY_DOWN){
|
} else if(key == keyboard::KEY_UP || key == keyboard::KEY_DOWN){
|
||||||
if(history.size() > 0){
|
history_key(key);
|
||||||
if(key == keyboard::KEY_UP){
|
|
||||||
if(history_index == 0){
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
--history_index;
|
|
||||||
} else { //KEY_DOWN
|
|
||||||
if(history_index == history.size()){
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
++history_index;
|
|
||||||
}
|
|
||||||
|
|
||||||
set_column(6);
|
|
||||||
|
|
||||||
for(uint64_t i = 0; i < current_input_length; ++i){
|
|
||||||
k_print(' ');
|
|
||||||
}
|
|
||||||
|
|
||||||
set_column(6);
|
|
||||||
|
|
||||||
current_input_length = 0;
|
|
||||||
|
|
||||||
if(history_index < history.size()){
|
|
||||||
auto saved = history[history_index];
|
|
||||||
while(*saved){
|
|
||||||
current_input[current_input_length++] = *saved;
|
|
||||||
k_print(*saved);
|
|
||||||
|
|
||||||
++saved;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if(key == keyboard::KEY_BACKSPACE){
|
} else if(key == keyboard::KEY_BACKSPACE){
|
||||||
if(current_input_length > 0){
|
if(current_input_length > 0){
|
||||||
k_print('\b');
|
k_print('\b');
|
||||||
@ -172,12 +197,7 @@ void start_shell(){
|
|||||||
void exec_command(){
|
void exec_command(){
|
||||||
char buffer[50];
|
char buffer[50];
|
||||||
|
|
||||||
auto saved = new char[current_input_length + 1];
|
history_save();
|
||||||
memcopy(saved, current_input, current_input_length);
|
|
||||||
saved[current_input_length] = '\0';
|
|
||||||
|
|
||||||
history.push_back(saved);
|
|
||||||
history_index = history.size();
|
|
||||||
|
|
||||||
for(auto& command : commands){
|
for(auto& command : commands){
|
||||||
const char* input_command = current_input;
|
const char* input_command = current_input;
|
||||||
@ -495,7 +515,6 @@ void cd_command(const vector<string>& params){
|
|||||||
|
|
||||||
void init_shell(){
|
void init_shell(){
|
||||||
current_input_length = 0;
|
current_input_length = 0;
|
||||||
history_index = 0;
|
|
||||||
|
|
||||||
wipeout();
|
wipeout();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user