summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnotherTest <ali.mpfard@gmail.com>2020-03-30 22:44:23 +0430
committerAndreas Kling <kling@serenityos.org>2020-03-31 13:21:46 +0200
commit06d35d036d680850049e1891a3d15eb4eb25fc14 (patch)
treeb096c22d0c0078b8cb22113f4719e1841fc6d08a
parent6f407fff321652592d4d96cc3c9976ef6ed70e0b (diff)
downloadserenity-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.
-rw-r--r--Userland/Makefile2
-rw-r--r--Userland/js.cpp32
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);