1 /* PSPP - a program for statistical analysis.
2 Copyright (C) 1997-9, 2000, 2007 Free Software Foundation, Inc.
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 #include "read-line.h"
28 #include <data/file-name.h>
29 #include <data/settings.h>
30 #include <language/command.h>
31 #include <libpspp/message.h>
32 #include <libpspp/str.h>
33 #include <libpspp/version.h>
34 #include <language/prompt.h>
35 #include <output/journal.h>
36 #include <output/manager.h>
37 #include <ui/terminal/terminal.h>
42 #define _(msgid) gettext (msgid)
45 #include <readline/readline.h>
46 #include <readline/history.h>
48 static char *history_file;
50 static char **complete_command_name (const char *, int, int);
51 static char **dont_complete (const char *, int, int);
52 #endif /* HAVE_READLINE */
57 struct getl_interface parent ;
59 bool (*interactive_func) (struct string *line,
64 static bool initialised = false;
66 /* Initialize getl. */
68 readln_initialize (void)
73 rl_basic_word_break_characters = "\n";
76 if (history_file == NULL)
78 const char *home_dir = getenv ("HOME");
81 history_file = xasprintf ("%s/.pspp_history", home_dir);
82 read_history (history_file);
90 readln_uninitialize (void)
95 if (history_file != NULL && false == get_testing_mode() )
96 write_history (history_file);
104 read_interactive (struct getl_interface *s,
107 struct readln_source *is =
108 (struct readln_source *) s ;
110 return is->interactive_func (line, prompt_get_style ());
114 always_true (const struct getl_interface *s UNUSED)
119 /* Display a welcoming message. */
123 static bool welcomed = false;
127 fputs ("PSPP is free software and you are welcome to distribute copies of "
128 "it\nunder certain conditions; type \"show copying.\" to see the "
129 "conditions.\nThere is ABSOLUTELY NO WARRANTY for PSPP; type \"show "
130 "warranty.\" for details.\n", stdout);
132 readln_initialize ();
136 /* Gets a line from the user and stores it into LINE.
137 Prompts the user with PROMPT.
138 Returns true if successful, false at end of file.
141 readln_read (struct string *line, enum prompt_style style)
143 const char *prompt = prompt_get (style);
149 assert (initialised);
155 if (style == PROMPT_FIRST)
159 rl_attempted_completion_function = (style == PROMPT_FIRST
160 ? complete_command_name
162 string = readline (prompt);
168 add_history (string);
169 ds_assign_cstr (line, string);
174 fputs (prompt, stdout);
176 if (ds_read_line (line, stdin))
178 ds_chomp (line, '\n');
185 /* Check whether the size of the window has changed, so that
186 the output drivers can adjust their settings as needed. We
187 only do this for the first line of a command, as it's
188 possible that the output drivers are actually in use
189 afterward, and we don't want to confuse them in the middle
191 if (style == PROMPT_FIRST)
192 terminal_check_size ();
198 readln_close (struct getl_interface *i)
203 /* Creates a source which uses readln to get its line */
204 struct getl_interface *
205 create_readln_source (void)
207 struct readln_source *rlns = xzalloc (sizeof (*rlns));
209 rlns->interactive_func = readln_read;
211 rlns->parent.interactive = always_true;
212 rlns->parent.read = read_interactive;
213 rlns->parent.close = readln_close;
215 return (struct getl_interface *) rlns;
220 static char *command_generator (const char *text, int state);
222 /* Returns a set of command name completions for TEXT.
223 This is of the proper form for assigning to
224 rl_attempted_completion_function. */
226 complete_command_name (const char *text, int start, int end UNUSED)
230 /* Complete command name at start of line. */
231 return rl_completion_matches (text, command_generator);
235 /* Otherwise don't do any completion. */
236 rl_attempted_completion_over = 1;
241 /* Do not do any completion for TEXT. */
243 dont_complete (const char *text UNUSED, int start UNUSED, int end UNUSED)
245 rl_attempted_completion_over = 1;
249 /* If STATE is 0, returns the first command name matching TEXT.
250 Otherwise, returns the next command name matching TEXT.
251 Returns a null pointer when no matches are left. */
253 command_generator (const char *text, int state)
255 static const struct command *cmd;
260 name = cmd_complete (text, &cmd);
261 return name ? xstrdup (name) : NULL;
263 #endif /* HAVE_READLINE */