1 /* PSPP - a program for statistical analysis.
2 Copyright (C) 1997-9, 2000, 2007, 2009, 2010, 2011, 2013 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/>. */
26 #include <readline/readline.h>
27 #include <readline/history.h>
29 static char *history_file;
31 static char **complete_command_name (const char *, int, int);
32 static char **dont_complete (const char *, int, int);
33 static char *command_generator (const char *text, int state);
35 static const bool have_readline = true;
38 static const bool have_readline = false;
43 #include "ui/terminal/terminal-reader.h"
50 #include "data/file-name.h"
51 #include "data/settings.h"
52 #include "language/command.h"
53 #include "language/lexer/lexer.h"
54 #include "libpspp/assertion.h"
55 #include "libpspp/cast.h"
56 #include "libpspp/message.h"
57 #include "libpspp/prompt.h"
58 #include "libpspp/str.h"
59 #include "libpspp/version.h"
60 #include "output/driver.h"
61 #include "output/journal.h"
62 #include "ui/terminal/terminal.h"
64 #include "gl/minmax.h"
65 #include "gl/xalloc.h"
68 #define _(msgid) gettext (msgid)
70 struct terminal_reader
72 struct lex_reader reader;
78 static int n_terminal_readers;
80 static void readline_init (void);
81 static void readline_done (void);
82 static bool readline_read (struct substring *, enum prompt_style);
84 /* Display a welcoming message. */
88 static bool welcomed = false;
92 fputs ("PSPP is free software and you are welcome to distribute copies of "
93 "it\nunder certain conditions; type \"show copying.\" to see the "
94 "conditions.\nThere is ABSOLUTELY NO WARRANTY for PSPP; type \"show "
95 "warranty.\" for details.\n", stdout);
100 static struct terminal_reader *
101 terminal_reader_cast (struct lex_reader *r)
103 return UP_CAST (r, struct terminal_reader, reader);
107 terminal_reader_read (struct lex_reader *r_, char *buf, size_t n,
108 enum prompt_style prompt_style)
110 struct terminal_reader *r = terminal_reader_cast (r_);
113 if (r->offset >= r->s.length && !r->eof)
116 msg_ui_reset_counts ();
120 if (! readline_read (&r->s, prompt_style))
123 fprintf (rl_outstream, "\n");
127 r->eof = ss_is_empty (r->s);
129 /* Check whether the size of the window has changed, so that
130 the output drivers can adjust their settings as needed. We
131 only do this for the first line of a command, as it's
132 possible that the output drivers are actually in use
133 afterward, and we don't want to confuse them in the middle
135 if (prompt_style == PROMPT_FIRST)
136 terminal_check_size ();
139 chunk = MIN (n, r->s.length - r->offset);
140 memcpy (buf, r->s.string + r->offset, chunk);
146 terminal_reader_close (struct lex_reader *r_)
148 struct terminal_reader *r = terminal_reader_cast (r_);
151 free (r->reader.file_name);
154 if (!--n_terminal_readers)
158 static struct lex_reader_class terminal_reader_class =
160 terminal_reader_read,
161 terminal_reader_close
164 /* Creates a source which uses readln to get its line */
166 terminal_reader_create (void)
168 struct terminal_reader *r;
170 if (!n_terminal_readers++)
173 r = xzalloc (sizeof *r);
174 r->reader.class = &terminal_reader_class;
175 r->reader.syntax = LEX_SYNTAX_INTERACTIVE;
176 r->reader.error = LEX_ERROR_INTERACTIVE;
177 r->reader.file_name = NULL;
187 readline_prompt (enum prompt_style style)
203 case PROMPT_DOCUMENT:
206 case PROMPT_DO_REPEAT:
207 return "DO REPEAT> ";
216 static bool sigint_received ;
223 write (pfd[1], "x", 1);
224 rl_echo_signal_char (sig);
229 A function similar to getc from stdio.
230 However this one may be interrupted by SIGINT.
231 If that happens it will return EOF and the global variable
232 sigint_received will be set to true.
235 interruptible_getc (FILE *fp)
241 struct timeval timeout = {0, 50000};
247 max_fd = (max_fd > fd) ? max_fd : fd;
250 max_fd = (max_fd > fd) ? max_fd : fd;
252 ret = select (max_fd + 1, &what, NULL, NULL, &timeout);
253 if ( ret == -1 && errno != EINTR)
255 perror ("Select failed");
261 if (FD_ISSET (pfd[0], &what))
264 read (pfd[0], dummy, 1);
265 sigint_received = true;
272 /* This will not block! */
273 read (fileno (fp), &c, 1);
285 if ( 0 != pipe2 (pfd, O_NONBLOCK))
286 perror ("Cannot create pipe");
288 if ( SIG_ERR == signal (SIGINT, handler))
289 perror ("Cannot add signal handler");
291 rl_catch_signals = 0;
292 rl_getc_function = interruptible_getc;
293 rl_basic_word_break_characters = "\n";
295 stifle_history (500);
296 if (history_file == NULL)
298 const char *home_dir = getenv ("HOME");
299 if (home_dir != NULL)
301 history_file = xasprintf ("%s/.pspp_history", home_dir);
302 read_history (history_file);
310 if (history_file != NULL && false == settings_get_testing_mode () )
311 write_history (history_file);
316 /* Prompt the user for a line of input and return it in LINE.
317 Returns true if the LINE should be considered valid, false otherwise.
320 readline_read (struct substring *line, enum prompt_style style)
324 rl_attempted_completion_function = (style == PROMPT_FIRST
325 ? complete_command_name
327 sigint_received = false;
328 string = readline (readline_prompt (style));
340 add_history (string);
342 end = strchr (string, '\0');
344 *line = ss_buffer (string, end - string + 1);
352 /* Returns a set of command name completions for TEXT.
353 This is of the proper form for assigning to
354 rl_attempted_completion_function. */
356 complete_command_name (const char *text, int start, int end UNUSED)
360 /* Complete command name at start of line. */
361 return rl_completion_matches (text, command_generator);
365 /* Otherwise don't do any completion. */
366 rl_attempted_completion_over = 1;
371 /* Do not do any completion for TEXT. */
373 dont_complete (const char *text UNUSED, int start UNUSED, int end UNUSED)
375 rl_attempted_completion_over = 1;
379 /* If STATE is 0, returns the first command name matching TEXT.
380 Otherwise, returns the next command name matching TEXT.
381 Returns a null pointer when no matches are left. */
383 command_generator (const char *text, int state)
385 static const struct command *cmd;
390 name = cmd_complete (text, &cmd);
391 return name ? xstrdup (name) : NULL;
394 #else /* !HAVE_READLINE */
407 readline_read (struct substring *line, enum prompt_style style)
409 struct string string;
410 const char *prompt = readline_prompt (style);
412 fputs (prompt, stdout);
414 ds_init_empty (&string);
415 ds_read_line (&string, stdin, SIZE_MAX);
421 #endif /* !HAVE_READLINE */