From cd55aa462b112896240ab736bf60035fdb30ca2d Mon Sep 17 00:00:00 2001 From: _ov4 Date: Sun, 18 Oct 2026 14:47:46 +0000 Subject: adapt line editor --- src/eval/eval.cc | 3 +-- src/line/cursor.cc | 23 ++++++++++------------- src/line/getter.cc | 14 ++++++-------- src/line/input.cc | 8 +++----- src/line/mode.cc | 4 +--- src/main.cc | 54 ++++++++++++++++++++---------------------------------- 6 files changed, 41 insertions(+), 65 deletions(-) (limited to 'src') diff --git a/src/eval/eval.cc b/src/eval/eval.cc index 1551d1a..82ba710 100644 --- a/src/eval/eval.cc +++ b/src/eval/eval.cc @@ -37,9 +37,8 @@ namespace ov4 * background children don't receive SIGINT (SIGTSTP) from the kernel * when we type ctrl-c (ctrl-z) at the keyboard. */ -void eval(char *raw_input) +void eval(const string &s) { - string s = raw_input; T_lexer lexer_instance; try diff --git a/src/line/cursor.cc b/src/line/cursor.cc index a273843..81454ae 100644 --- a/src/line/cursor.cc +++ b/src/line/cursor.cc @@ -1,4 +1,4 @@ -#include "line/cursor.h" +#include "line/line_editor.h" #include #include @@ -9,17 +9,14 @@ #include #include -#include "line/getter.h" #include "history.h" -#include "line/mode.h" -#include "line/input.h" using namespace std; namespace ov4 { -void print_override(const std::string &s) +void T_line_editor::print_override(const std::string &s) { check_window_update(); @@ -43,7 +40,7 @@ void print_override(const std::string &s) print("\x1b" "8"); fflush(stdout); } -void move_cursor(char c) +void T_line_editor::move_cursor(char c) { check_window_update(); @@ -66,7 +63,7 @@ void move_cursor(char c) } } -void cursor_input_char(char c) +void T_line_editor::cursor_input_char(char c) { check_window_update(); @@ -97,7 +94,7 @@ void cursor_input_char(char c) -void update_window_size() +void T_line_editor::update_window_size() { winsize ws; if (ioctl(1, TIOCGWINSZ, &ws) == -1) @@ -107,7 +104,7 @@ void update_window_size() window_size_col = ws.ws_col; } -void move_cursor(T_cursor_movement_direction d) +void T_line_editor::move_cursor(T_cursor_movement_direction d) { check_window_update(); @@ -171,7 +168,7 @@ void move_cursor(T_cursor_movement_direction d) } } -void switch_history(T_cursor_movement_direction d) +void T_line_editor::switch_history(T_cursor_movement_direction d) { check_window_update(); @@ -210,7 +207,7 @@ void switch_history(T_cursor_movement_direction d) } } -void reset_editor() +void T_line_editor::reset_editor() { line_buffer = ""; buffer_index_cursor = 0; @@ -218,14 +215,14 @@ void reset_editor() cursor_skip_prompt(); } -void cursor_skip_prompt() +void T_line_editor::cursor_skip_prompt() { // move to the "start" of the zone // should skip prompt zone print("\r\x1b[{}C", prompt_pos-1); fflush(stdout); } -void check_window_update() +void T_line_editor::check_window_update() { if (windows_size_changed) { diff --git a/src/line/getter.cc b/src/line/getter.cc index f396ce1..432ddca 100644 --- a/src/line/getter.cc +++ b/src/line/getter.cc @@ -1,4 +1,4 @@ -#include "line/getter.h" +#include "line/line_editor.h" #include #include @@ -8,39 +8,37 @@ #include #include -#include "line/cursor.h" - using namespace std; namespace ov4 { -int get_terminal_pos_cursor() +int T_line_editor::get_terminal_pos_cursor() { return prompt_pos + (buffer_index_cursor - get_buffer_index_display_begin()) + 1; } -int get_buffer_index_display_begin() +int T_line_editor::get_buffer_index_display_begin() { return _buffer_index_display_begin; } -int get_buffer_index_display_end() +int T_line_editor::get_buffer_index_display_end() { int max_possible_end = get_buffer_index_display_begin() + line_buffer.size() - 1; int window_possible_end = get_buffer_index_display_begin() + (window_size_col - prompt_pos) -1; return min(max_possible_end, window_possible_end); } -int get_terminal_pos_line_end() +int T_line_editor::get_terminal_pos_line_end() { int possible = prompt_pos + line_buffer.size(); return min(possible, window_size_col); } -T_position get_cursor_position() +T_position T_line_editor::get_cursor_position() { char c; string buffer; diff --git a/src/line/input.cc b/src/line/input.cc index cc5a62b..b7dbc23 100644 --- a/src/line/input.cc +++ b/src/line/input.cc @@ -1,24 +1,22 @@ -#include "line/input.h" +#include "line/line_editor.h" #include #include #include -#include "line/cursor.h" #include "history.h" -#include "line/getter.h" using namespace std; namespace ov4 { -void clear_below() +void T_line_editor::clear_below() { print("\x1b[0J"); } -string readline() +string T_line_editor::readline() { update_window_size(); history_vec.push_back(""); diff --git a/src/line/mode.cc b/src/line/mode.cc index 208465b..626557c 100644 --- a/src/line/mode.cc +++ b/src/line/mode.cc @@ -1,12 +1,10 @@ -#include "line/mode.h" +#include "line/line_editor.h" #include #include #include #include -#include "line/cursor.h" -#include "line/getter.h" #include "history.h" #include "signal_handler.h" diff --git a/src/main.cc b/src/main.cc index 07a3f1a..55f669a 100644 --- a/src/main.cc +++ b/src/main.cc @@ -13,6 +13,7 @@ #include "all.h" #include "test.h" +#include "line/line_editor.h" using namespace std; using namespace ov4; @@ -38,22 +39,6 @@ int main([[maybe_unused]] int argc, [[maybe_unused]] char **argv) exe_option(argv); - // while ((c = getopt(argc, argv, "hvp")) != EOF) { - // switch (c) { - // case 'h': /* print help message */ - // usage(); - // break; - // case 'v': /* emit additional diagnostic info */ - // verbose = true; - // break; - // case 'p': /* don't print a prompt */ - // emit_prompt = 0; /* handy for automatic testing */ - // break; - // default: - // usage(); - // } - // } - /* Initialize the job list */ @@ -62,24 +47,25 @@ int main([[maybe_unused]] int argc, [[maybe_unused]] char **argv) /* Execute the shell's read/eval loop */ while (1) { - /* Read command line */ - print_prompt(); - - if ((fgets(cmdline, MAXLINE, stdin) == NULL) && ferror(stdin)) - app_error("fgets error"); - if (feof(stdin)) { /* End of file (ctrl-d) */ - fflush(stdout); - exit(0); - } - - - /* Evaluate the command line */ - // trim \n - if(cmdline[strlen(cmdline)-1] == '\n') - cmdline[strlen(cmdline)-1] = '\0'; - eval(cmdline); - fflush(stdout); - fflush(stdout); + /* Read command line */ + print_prompt(); + + T_line_editor line_editor_instance; + + enable_raw(); + T_position pos = line_editor_instance.get_cursor_position(); + line_editor_instance.cursor_row = pos.row; + line_editor_instance.cursor_col = pos.col; + line_editor_instance.prompt_pos = line_editor_instance.cursor_col; + string s = line_editor_instance.readline(); + disable_raw(); + cout << "\n\n\n\n" << endl; + cout << s << endl; + if (s == "quit") + break; + eval(s.c_str()); + + fflush(stdout); } exit(0); /* control never reaches here */ -- cgit v1.3.1-4-g156e