author | Alan Dipert
<alan@dipert.org> 2024-01-09 20:12:58 UTC |
committer | Alan Dipert
<alan@dipert.org> 2024-01-09 20:12:58 UTC |
parent | 4b2dfc9be1f121543c24739494ab891150d21cda |
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();