diff options
author | AnotherTest <ali.mpfard@gmail.com> | 2020-03-30 22:44:23 +0430 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-03-31 13:21:46 +0200 |
commit | 06d35d036d680850049e1891a3d15eb4eb25fc14 (patch) | |
tree | b096c22d0c0078b8cb22113f4719e1841fc6d08a /Userland | |
parent | 6f407fff321652592d4d96cc3c9976ef6ed70e0b (diff) | |
download | serenity-06d35d036d680850049e1891a3d15eb4eb25fc14.zip |
Userland/js: Use the new line editor in repl
We now get cursor movements for free!
and we're rid of that icky `free` call, yay.
Diffstat (limited to 'Userland')
-rw-r--r-- | Userland/Makefile | 2 | ||||
-rw-r--r-- | Userland/js.cpp | 32 |
2 files changed, 11 insertions, 23 deletions
diff --git a/Userland/Makefile b/Userland/Makefile index 81b72b61b6..0154977c25 100644 --- a/Userland/Makefile +++ b/Userland/Makefile @@ -4,7 +4,7 @@ APPS = ${SRCS:.cpp=} EXTRA_CLEAN = $(APPS) -LIB_DEPS = Web GUI Gfx Audio Protocol IPC Thread Pthread PCIDB Markdown JS Core +LIB_DEPS = Web GUI Gfx Audio Protocol IPC Thread Pthread PCIDB Markdown JS Core LineEdit include ../Makefile.common diff --git a/Userland/js.cpp b/Userland/js.cpp index 0029e80134..ba4dbdf5c9 100644 --- a/Userland/js.cpp +++ b/Userland/js.cpp @@ -37,36 +37,25 @@ #include <LibJS/Runtime/Object.h> #include <LibJS/Runtime/PrimitiveString.h> #include <LibJS/Runtime/Value.h> +#include <LibLineEdit/LineEditor.h> #include <stdio.h> bool dump_ast = false; +static LineEditor editor {}; String read_next_piece() { StringBuilder piece; int level = 0; + StringBuilder prompt_builder; do { - if (level == 0) - fprintf(stderr, "> "); - else - fprintf(stderr, ".%*c", 4 * level + 1, ' '); - - char* line = nullptr; - size_t allocated_size = 0; - ssize_t nread = getline(&line, &allocated_size, stdin); - if (nread < 0) { - if (errno == 0) { - // Explicit EOF; stop reading. Print a newline though, to make - // the next prompt (or the shell prompt) appear on the next - // line. - fprintf(stderr, "\n"); - break; - } else { - perror("getline"); - exit(1); - } - } + prompt_builder.clear(); + prompt_builder.append("> "); + for (auto i = 0; i < level; ++i) + prompt_builder.append(" "); + + String line = editor.get_line(prompt_builder.build()); piece.append(line); auto lexer = JS::Lexer(line); @@ -87,8 +76,6 @@ String read_next_piece() break; } } - - free(line); } while (level > 0); return piece.to_string(); @@ -207,6 +194,7 @@ int main(int argc, char** argv) interpreter.global_object().put("global", &interpreter.global_object()); if (script_path == nullptr) { + editor.initialize(); repl(interpreter); } else { auto file = Core::File::construct(script_path); |