From 738e53849d39db2cba7c7fd97dd74a64bcafe363 Mon Sep 17 00:00:00 2001 From: Daniel Cerqueira Date: Tue, 18 Aug 2026 11:59:36 +0100 Subject: use readline --- lali.c | 62 +++++++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 39 insertions(+), 23 deletions(-) (limited to 'lali.c') diff --git a/lali.c b/lali.c index 4ffa35b..48d4731 100644 --- a/lali.c +++ b/lali.c @@ -33,8 +33,13 @@ #include "liblali.h" + #include +#include +#include + + #define YEARS "2025, 2026" // MAIN /////////////////////////////////////////////////////////////////////// @@ -58,31 +63,42 @@ void runFile(int infd, Object **env, GC_PARAM) { } void runREPL(int infd, Object **env, GC_PARAM) { - Stream stream = { STREAM_TYPE_FILE, .fd = infd }; + /// STRING + char *replLine = (char *)NULL; + Stream stream = { STREAM_TYPE_STRING, .buffer = "" }; GC_TRACE(gcObject, nil); - for (;;) { - if (setjmp(exceptionEnv)) - continue; - - for (;;) { - *gcObject = nil; - - fputs("lali> ", stdout); - fflush(stdout); - - if (peekNext(&stream) == EOF) { - fputc('\n', stdout); - return; - } - - *gcObject = readExpr(&stream, GC_ROOTS); - *gcObject = evalExpr(gcObject, env, GC_ROOTS); - - writeObject(*gcObject, true, stdout); - fputc('\n', stdout); - } - } + do { + /* If the buffer has already been allocated, + return the memory to the free pool. */ + if (replLine) { + free(replLine); + replLine = (char *)NULL; + } + + replLine = readline("lali> "); + + stream.length = 0; + stream.offset = 0; + stream.buffer = replLine; + + while (peekNext(&stream) != EOF) { + *gcObject = nil; + *gcObject = readExpr(&stream, GC_ROOTS); + *gcObject = evalExpr(gcObject, env, GC_ROOTS); + writeObject(*gcObject, true, stdout); + fputc('\n', stdout); + } + + // If the line has any text in it, save it on the history. + if (replLine && *replLine) + add_history (replLine); + + } while (replLine != NULL); + + fputc('\n', stdout); + stream.buffer = (char *)NULL; + free(replLine); } int main(int argc, char *argv[]) { -- cgit