Replace numerous instances of xzalloc with XZALLOC
[pspp] / src / ui / terminal / terminal-reader.c
index c23fad186f86992b164b401792ed3a1300f1706c..3225678e8707b28a0dba95064d93fae4abf6b6f0 100644 (file)
@@ -22,6 +22,7 @@
 #include <stdbool.h>
 #include <stdio.h>
 
+#include "libpspp/str.h"
 
 #if HAVE_READLINE
 #include <readline/readline.h>
@@ -188,14 +189,12 @@ static struct lex_reader_class terminal_reader_class =
 struct lex_reader *
 terminal_reader_create (void)
 {
-  struct terminal_reader *r;
-
   if (!n_terminal_readers++)
     readline_init ();
 
-  r = xzalloc (sizeof *r);
+  struct terminal_reader *r = XZALLOC (struct terminal_reader);
   r->reader.class = &terminal_reader_class;
-  r->reader.syntax = LEX_SYNTAX_INTERACTIVE;
+  r->reader.syntax = SEG_MODE_INTERACTIVE;
   r->reader.error = LEX_ERROR_TERMINAL;
   r->reader.file_name = NULL;
   r->s = ss_empty ();
@@ -228,6 +227,9 @@ readline_prompt (enum prompt_style style)
 
     case PROMPT_DO_REPEAT:
       return "DO REPEAT> ";
+
+    case PROMPT_DEFINE:
+      return "DEFINE> ";
     }
 
   NOT_REACHED ();
@@ -408,14 +410,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 +437,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 */