Provide home grown rl_echo_signal_char if readline does not provide it
authorJohn Darrington <john@darrington.wattle.id.au>
Tue, 8 Oct 2013 19:34:28 +0000 (21:34 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Tue, 8 Oct 2013 19:34:28 +0000 (21:34 +0200)
acinclude.m4
src/ui/terminal/terminal-reader.c

index ee7c9b0be68b98ad8ec071497da577f9cf3c29bd..bc4d5b9d37c8a287343a41c447b137c899b2ddb6 100644 (file)
@@ -124,8 +124,9 @@ AC_DEFUN([PSPP_READLINE],
     AC_MSG_CHECKING([how to link with libreadline])
     AC_MSG_RESULT([$LIBREADLINE])
     AC_SEARCH_LIBS([rl_outstream], [readline],
-        AC_DEFINE(HAVE_RL_OUTSTREAM, 1, [Define if the readline library provides rl_outstream.])
-    )
+        AC_DEFINE(HAVE_RL_OUTSTREAM, 1, [Define if the readline library provides rl_outstream.]))
+    AC_SEARCH_LIBS([rl_echo_signal_char], [readline],
+        AC_DEFINE(HAVE_RL_ECHO_SIGNAL_CHAR, 1, [Define if the readline library provides rl_echo_signal_char.]))
   else
     dnl If $LIBREADLINE didn't lead to a usable library, we don't
     dnl need $INCREADLINE either.
index 2d72acf39cddbe654555e3525edc582a3f9b00b3..b4eae73add6b59e375d4fce089be9cc5c16ce0c4 100644 (file)
@@ -26,6 +26,7 @@
 #if HAVE_READLINE
 #include <readline/readline.h>
 #include <readline/history.h>
+#include <termios.h>
 
 static char *history_file;
 
@@ -107,14 +108,36 @@ 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
+/* 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
 
+/* 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)
+{
+  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
+    fprintf (rl_outstream, "^C");
+
+  fflush (rl_outstream);
+}  
+#endif
+
+
 static size_t
 terminal_reader_read (struct lex_reader *r_, char *buf, size_t n,
                       enum prompt_style prompt_style)