diff --git a/Userland/Makefile b/Userland/Makefile index 81b72b61b64..0154977c250 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 0029e80134b..ba4dbdf5c97 100644 --- a/Userland/js.cpp +++ b/Userland/js.cpp @@ -37,36 +37,25 @@ #include #include #include +#include #include 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, ' '); + prompt_builder.clear(); + prompt_builder.append("> "); + for (auto i = 0; i < level; ++i) + prompt_builder.append(" "); - 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); - } - } + 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);