Include a dissuader for odd numbered minor releases
[pspp] / src / ui / terminal / terminal-reader.c
index a3f33e725589a005f4b4d92a115d119e327614b4..141474a95bb9f77d18b5178403127cd8c2e5cbe9 100644 (file)
@@ -26,6 +26,7 @@
 #if HAVE_READLINE
 #include <readline/readline.h>
 #include <readline/history.h>
+#include <termios.h>
 
 static char *history_file;
 
@@ -51,7 +52,6 @@ static int rl_end;
 #include <stdint.h>
 #include <stdlib.h>
 
-#include "data/file-name.h"
 #include "data/settings.h"
 #include "language/command.h"
 #include "language/lexer/lexer.h"
@@ -97,8 +97,8 @@ welcome (void)
         "it\nunder certain conditions; type \"show copying.\" to see the "
         "conditions.\nThere is ABSOLUTELY NO WARRANTY for PSPP; type \"show "
         "warranty.\" for details.\n", stdout);
-  puts (stat_version);
-  journal_enable ();
+  puts (announced_version);
+  journal_init ();
 }
 
 static struct terminal_reader *
@@ -107,6 +107,42 @@ terminal_reader_cast (struct lex_reader *r)
   return UP_CAST (r, struct terminal_reader, reader);
 }
 
+
+/* Older libreadline versions do not provide rl_outstream.
+   However, it is almost always going to be the same as stdout. */
+#if ! HAVE_RL_OUTSTREAM
+# define rl_outstream stdout
+#endif
+
+
+#if HAVE_READLINE
+/* Similarly, rl_echo_signal_char is fairly recent.
+   We provide our own crude version if it is not present. */
+#if ! HAVE_RL_ECHO_SIGNAL_CHAR
+static void
+rl_echo_signal_char (int sig)
+{
+#if HAVE_TERMIOS_H
+  struct termios t;
+  if (0 == tcgetattr (0, &t))
+    {
+      cc_t c = t.c_cc[VINTR];
+  
+      if (c >= 0  && c <= 'Z' - 'A')
+       fprintf (rl_outstream, "^%c", 'A' + c - 1);
+      else
+       fprintf (rl_outstream, "%c", c);
+    }
+  else
+#endif
+    fprintf (rl_outstream, "^C");
+
+  fflush (rl_outstream);
+}  
+#endif
+#endif
+
+
 static size_t
 terminal_reader_read (struct lex_reader *r_, char *buf, size_t n,
                       enum prompt_style prompt_style)
@@ -177,7 +213,7 @@ terminal_reader_create (void)
   r = xzalloc (sizeof *r);
   r->reader.class = &terminal_reader_class;
   r->reader.syntax = LEX_SYNTAX_INTERACTIVE;
-  r->reader.error = LEX_ERROR_INTERACTIVE;
+  r->reader.error = LEX_ERROR_TERMINAL;
   r->reader.file_name = NULL;
   r->s = ss_empty ();
   r->offset = 0;
@@ -219,15 +255,6 @@ readline_prompt (enum prompt_style style)
 static int pfd[2];
 static bool sigint_received ;
 
-static void 
-handler (int sig)
-{
-  rl_end = 0;
-
-  write (pfd[1], "x", 1);
-  rl_echo_signal_char (sig);
-}
-
 
 /* 
    A function similar to getc from stdio.
@@ -283,6 +310,16 @@ interruptible_getc (FILE *fp)
 
 #if HAVE_READLINE
 
+static void 
+handler (int sig)
+{
+  rl_end = 0;
+
+  write (pfd[1], "x", 1);
+  rl_echo_signal_char (sig);
+}
+
+
 static void
 readline_init (void)
 {