X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fterminal%2Fread-line.c;h=97427c6c1a59754a1f5ce20cfa31596566b8cb5c;hb=2d4dd90964061defa92972156ae2a12323708519;hp=46b53b7008ebfe0a865b1906c8b679f177a9e801;hpb=2997cc6481d0744e910eccb6f23d56efe93d32d3;p=pspp-builds.git diff --git a/src/ui/terminal/read-line.c b/src/ui/terminal/read-line.c index 46b53b70..97427c6c 100644 --- a/src/ui/terminal/read-line.c +++ b/src/ui/terminal/read-line.c @@ -28,14 +28,13 @@ #include "msg-ui.h" -#include #include #include #include #include #include #include -#include +#include #include "xalloc.h" @@ -52,6 +51,16 @@ static char **complete_command_name (const char *, int, int); static char **dont_complete (const char *, int, int); #endif /* HAVE_READLINE */ + +struct readln_source +{ + struct getl_interface parent ; + + bool (*interactive_func) (struct string *line, + enum prompt_style) ; +}; + + static bool initialised = false; /* Initialize getl. */ @@ -81,13 +90,29 @@ readln_uninitialize (void) initialised = false; #if HAVE_READLINE && unix - if (history_file != NULL) + if (history_file != NULL && false == get_testing_mode() ) write_history (history_file); clear_history (); free (history_file); #endif } + +static bool +read_interactive (struct getl_interface *s, struct string *line) +{ + struct readln_source *is = + (struct readln_source *) s ; + + return is->interactive_func (line, prompt_get_style ()); +} + +static bool +always_true (const struct getl_interface *s UNUSED) +{ + return true; +} + /* Display a welcoming message. */ static void welcome (void) @@ -113,14 +138,19 @@ welcome (void) #endif } + + + + + /* Gets a line from the user and stores it into LINE. Prompts the user with PROMPT. Returns true if successful, false at end of file. - Suitable for passing to getl_append_interactive(). */ -bool -readln_read (struct string *line, enum getl_prompt_style style) + */ +static bool +readln_read (struct string *line, enum prompt_style style) { - const char *prompt = getl_get_prompt (style); + const char *prompt = prompt_get (style); #if HAVE_READLINE char *string; #endif @@ -132,7 +162,7 @@ readln_read (struct string *line, enum getl_prompt_style style) welcome (); #if HAVE_READLINE - rl_attempted_completion_function = (style == GETL_PROMPT_FIRST + rl_attempted_completion_function = (style == PROMPT_FIRST ? complete_command_name : dont_complete); string = readline (prompt); @@ -159,6 +189,29 @@ readln_read (struct string *line, enum getl_prompt_style style) #endif } + +static void +readln_close (struct getl_interface *i) +{ + free (i); +} + +/* Creates a source which uses readln to get its line */ +struct getl_interface * +create_readln_source (void) +{ + struct readln_source *rlns = xzalloc (sizeof (*rlns)); + + rlns->interactive_func = readln_read; + + rlns->parent.interactive = always_true; + rlns->parent.read = read_interactive; + rlns->parent.close = readln_close; + + return (struct getl_interface *) rlns; +} + + #if HAVE_READLINE static char *command_generator (const char *text, int state);