lexer: Add support for DEFINE...!ENDDEFINE.
[pspp] / src / ui / terminal / terminal-reader.c
index 2f2a533d1577f4d6cf46a95e3f60cd1b26ce7dd8..e0f219826dfc4820f55e519dbc9c3c8c4d737929 100644 (file)
@@ -22,6 +22,7 @@
 #include <stdbool.h>
 #include <stdio.h>
 
+#include "libpspp/str.h"
 
 #if HAVE_READLINE
 #include <readline/readline.h>
@@ -228,6 +229,9 @@ readline_prompt (enum prompt_style style)
 
     case PROMPT_DO_REPEAT:
       return "DO REPEAT> ";
+
+    case PROMPT_DEFINE:
+      return "DEFINE> ";
     }
 
   NOT_REACHED ();
@@ -264,13 +268,13 @@ interruptible_getc (FILE *fp)
       max_fd = (max_fd > fd) ? max_fd : fd;
       FD_SET (fd, &what);
       ret = select (max_fd + 1, &what, NULL, NULL, &timeout);
-      if ( ret == -1 && errno != EINTR)
+      if (ret == -1 && errno != EINTR)
        {
          perror ("Select failed");
          continue;
        }
 
-      if (ret > 0 )
+      if (ret > 0)
        {
          if (FD_ISSET (pfd[0], &what))
            {
@@ -302,10 +306,10 @@ handler (int sig)
 static void
 readline_init (void)
 {
-  if ( 0 != pipe2 (pfd, O_NONBLOCK))
+  if (0 != pipe2 (pfd, O_NONBLOCK))
     perror ("Cannot create pipe");
 
-  if ( SIG_ERR == signal (SIGINT, handler))
+  if (SIG_ERR == signal (SIGINT, handler))
     perror ("Cannot add signal handler");
 
   rl_catch_signals = 0;
@@ -327,7 +331,7 @@ readline_init (void)
 static void
 readline_done (void)
 {
-  if (history_file != NULL && false == settings_get_testing_mode () )
+  if (history_file != NULL && false == settings_get_testing_mode ())
     write_history (history_file);
   clear_history ();
   free (history_file);
@@ -408,14 +412,26 @@ command_generator (const char *text, int state)
   if (state == 0)
     cmd = NULL;
   name = cmd_complete (text, &cmd);
-  return name ? xstrdup (name) : NULL;
+  return xstrdup_if_nonnull (name);
 }
 
 #else  /* !HAVE_READLINE */
 
+static const char * the_prompt;
+
+static void
+handler (int sig)
+{
+  if (the_prompt)
+    fputs (the_prompt, stdout);
+  fflush (stdout);
+}
+
 static void
 readline_init (void)
 {
+  if (SIG_ERR == signal (SIGINT, handler))
+    perror ("Cannot add signal handler");
 }
 
 static void
@@ -423,19 +439,22 @@ readline_done (void)
 {
 }
 
+/* Prompt the user for a line of input and return it in LINE.
+   Returns true if the LINE should be considered valid, false otherwise.
+ */
 static bool
 readline_read (struct substring *line, enum prompt_style style)
 {
   struct string string;
-  const char *prompt = readline_prompt (style);
+  the_prompt = readline_prompt (style);
 
-  fputs (prompt, stdout);
+  fputs (the_prompt, stdout);
   fflush (stdout);
   ds_init_empty (&string);
   ds_read_line (&string, stdin, SIZE_MAX);
 
   *line = string.ss;
 
-  return false;
+  return true;
 }
 #endif /* !HAVE_READLINE */