git » unicorn-sparkle-basic.git » commit aa42789

use readline

author Alan Dipert
2024-01-09 20:12:58 UTC
committer Alan Dipert
2024-01-09 20:12:58 UTC
parent 4b2dfc9be1f121543c24739494ab891150d21cda

use readline

Makefile +1 -1
main.c +2 -3
parse.c +7 -7
parse.h +3 -1

diff --git a/Makefile b/Makefile
index 47fc905..f23b4ec 100644
--- a/Makefile
+++ b/Makefile
@@ -9,7 +9,7 @@ YFLAGS=-d
 all: usbasic
 
 usbasic: lex.yy.o usbasic.tab.o parse.o main.o
-	$(CC) $(CFLAGS) -o usbasic lex.yy.o usbasic.tab.o parse.o main.o -lfl
+	$(CC) $(CFLAGS) -o usbasic lex.yy.o usbasic.tab.o parse.o main.o -lfl -lreadline
 
 parse.o: parse.c usbasic.tab.h parse.h
 	$(CC) $(CFLAGS) -c parse.c
diff --git a/main.c b/main.c
index 654370e..74458ff 100644
--- a/main.c
+++ b/main.c
@@ -4,10 +4,9 @@
 void read_loop() {
   struct node_tag* line;
   while (1) {
-    printf("🦄 ");
-    if ((line = read_line_stdin())) {
+    if ((line = read_line_stdin("🦄 "))) {
       printf("It parsed 👍\n");
-      printf("linum: %d\n", line->data.line.linum);      
+      printf("linum: %d\n", line->data.line.linum);
     }
   }
 }
diff --git a/parse.c b/parse.c
index 34624b5..c923115 100644
--- a/parse.c
+++ b/parse.c
@@ -60,13 +60,13 @@ struct node_tag* read_line(char* line) {
   return yyparse_failed ? NULL : ast_last_numbered_line;
 }
 
-struct node_tag* read_line_stdin() {
+struct node_tag* read_line_stdin(char* prompt) {
   char* line = NULL;
-  size_t len = 0;
-  struct node_tag* read_node;
-  getline(&line, &len, stdin);
-  read_node = read_line(line);
-  free(line);
+  struct node_tag* read_node = NULL;
+  if ((line = readline(prompt)) != NULL) {
+    add_history(line);
+    read_node = read_line(line);
+    free(line);
+  }
   return read_node;
 }
-
diff --git a/parse.h b/parse.h
index 1839c98..e926b40 100644
--- a/parse.h
+++ b/parse.h
@@ -1,5 +1,7 @@
 #include <stdio.h>
 #include <stdlib.h>
+#include <readline/readline.h>
+#include <readline/history.h>
 #include "usbasic.tab.h"
 
 enum NODE_TYPE {
@@ -69,5 +71,5 @@ extern int yyparse();
 extern void yy_scan_string(char*);
 extern void yylex_destroy();
 
-struct node_tag* read_line(char* line); 
+struct node_tag* read_line(char* line);
 struct node_tag* read_line_stdin();