client: Rewrite readline configuration
authorMarkus Armbruster <armbru@pond.sub.org>
Mon, 7 Dec 2015 20:27:42 +0000 (21:27 +0100)
committerMarkus Armbruster <armbru@pond.sub.org>
Sun, 6 Aug 2017 09:22:29 +0000 (11:22 +0200)
AX_LIB_READLINE tries to cope with systems where readline lacks
history support, or lacks headers, or needs headers included in
unorthodox ways.  It puts six HAVE_ macros into config.h, and its
usage example takes 24 lines of code just to include two headers.

Way too complicated for my taste.  Replace with new MY_LIB_READLINE,
which succeeds only when you have a sane readline, and then defines
*one* macro: HAVE_LIBREADLINE.

Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
Make.mk
configure.ac
m4/ax_lib_readline.m4 [deleted file]
m4/my_lib_readline.m4 [new file with mode: 0644]
src/client/configure.ac
src/client/main.c
src/client/play.c

diff --git a/Make.mk b/Make.mk
index c1a6aa9..05547d1 100644 (file)
--- a/Make.mk
+++ b/Make.mk
@@ -432,5 +432,5 @@ $(srcdir)/src/client/config.h.in: src/client/configure.ac src/client/aclocal.m4
        cd $(dir $@) && autoheader
        touch $@
 
-$(srcdir)/src/client/aclocal.m4: m4/ax_lib_readline.m4 m4/ax_lib_socket_nsl.m4 m4/my_terminfo.m4 m4/my_windows_api.m4
+$(srcdir)/src/client/aclocal.m4: m4/ax_lib_socket_nsl.m4 m4/my_lib_readline.m4 m4/my_terminfo.m4 m4/my_windows_api.m4
        cat $^ >$@
index 589b06a..c081611 100644 (file)
@@ -73,7 +73,7 @@ LIBS_util="$LIBS"
 LIBS="$LIBS_SOCKETS $LIBS"
 AX_LIB_SOCKET_NSL
 LIBS_server="$LIBS"
-AX_LIB_READLINE
+MY_LIB_READLINE
 
 
 ### Checks for header files
diff --git a/m4/ax_lib_readline.m4 b/m4/ax_lib_readline.m4
deleted file mode 100644 (file)
index 056f25c..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-# ===========================================================================
-#      http://www.gnu.org/software/autoconf-archive/ax_lib_readline.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-#   AX_LIB_READLINE
-#
-# DESCRIPTION
-#
-#   Searches for a readline compatible library. If found, defines
-#   `HAVE_LIBREADLINE'. If the found library has the `add_history' function,
-#   sets also `HAVE_READLINE_HISTORY'. Also checks for the locations of the
-#   necessary include files and sets `HAVE_READLINE_H' or
-#   `HAVE_READLINE_READLINE_H' and `HAVE_READLINE_HISTORY_H' or
-#   'HAVE_HISTORY_H' if the corresponding include files exists.
-#
-#   The libraries that may be readline compatible are `libedit',
-#   `libeditline' and `libreadline'. Sometimes we need to link a termcap
-#   library for readline to work, this macro tests these cases too by trying
-#   to link with `libtermcap', `libcurses' or `libncurses' before giving up.
-#
-#   Here is an example of how to use the information provided by this macro
-#   to perform the necessary includes or declarations in a C file:
-#
-#     #ifdef HAVE_LIBREADLINE
-#     #  if defined(HAVE_READLINE_READLINE_H)
-#     #    include <readline/readline.h>
-#     #  elif defined(HAVE_READLINE_H)
-#     #    include <readline.h>
-#     #  else /* !defined(HAVE_READLINE_H) */
-#     extern char *readline ();
-#     #  endif /* !defined(HAVE_READLINE_H) */
-#     char *cmdline = NULL;
-#     #else /* !defined(HAVE_READLINE_READLINE_H) */
-#       /* no readline */
-#     #endif /* HAVE_LIBREADLINE */
-#
-#     #ifdef HAVE_READLINE_HISTORY
-#     #  if defined(HAVE_READLINE_HISTORY_H)
-#     #    include <readline/history.h>
-#     #  elif defined(HAVE_HISTORY_H)
-#     #    include <history.h>
-#     #  else /* !defined(HAVE_HISTORY_H) */
-#     extern void add_history ();
-#     extern int write_history ();
-#     extern int read_history ();
-#     #  endif /* defined(HAVE_READLINE_HISTORY_H) */
-#       /* no history */
-#     #endif /* HAVE_READLINE_HISTORY */
-#
-# LICENSE
-#
-#   Copyright (c) 2008 Ville Laurikari <vl@iki.fi>
-#
-#   Copying and distribution of this file, with or without modification, are
-#   permitted in any medium without royalty provided the copyright notice
-#   and this notice are preserved. This file is offered as-is, without any
-#   warranty.
-
-#serial 6
-
-AU_ALIAS([VL_LIB_READLINE], [AX_LIB_READLINE])
-AC_DEFUN([AX_LIB_READLINE], [
-  AC_CACHE_CHECK([for a readline compatible library],
-                 ax_cv_lib_readline, [
-    ORIG_LIBS="$LIBS"
-    for readline_lib in readline edit editline; do
-      for termcap_lib in "" termcap curses ncurses; do
-        if test -z "$termcap_lib"; then
-          TRY_LIB="-l$readline_lib"
-        else
-          TRY_LIB="-l$readline_lib -l$termcap_lib"
-        fi
-        LIBS="$ORIG_LIBS $TRY_LIB"
-        AC_TRY_LINK_FUNC(readline, ax_cv_lib_readline="$TRY_LIB")
-        if test -n "$ax_cv_lib_readline"; then
-          break
-        fi
-      done
-      if test -n "$ax_cv_lib_readline"; then
-        break
-      fi
-    done
-    if test -z "$ax_cv_lib_readline"; then
-      ax_cv_lib_readline="no"
-    fi
-    LIBS="$ORIG_LIBS"
-  ])
-
-  if test "$ax_cv_lib_readline" != "no"; then
-    LIBS="$LIBS $ax_cv_lib_readline"
-    AC_DEFINE(HAVE_LIBREADLINE, 1,
-              [Define if you have a readline compatible library])
-    AC_CHECK_HEADERS(readline.h readline/readline.h)
-    AC_CACHE_CHECK([whether readline supports history],
-                   ax_cv_lib_readline_history, [
-      ax_cv_lib_readline_history="no"
-      AC_TRY_LINK_FUNC(add_history, ax_cv_lib_readline_history="yes")
-    ])
-    if test "$ax_cv_lib_readline_history" = "yes"; then
-      AC_DEFINE(HAVE_READLINE_HISTORY, 1,
-                [Define if your readline library has \`add_history'])
-      AC_CHECK_HEADERS(history.h readline/history.h)
-    fi
-  fi
-])dnl
diff --git a/m4/my_lib_readline.m4 b/m4/my_lib_readline.m4
new file mode 100644 (file)
index 0000000..5d570e5
--- /dev/null
@@ -0,0 +1,25 @@
+AC_DEFUN([MY_LIB_READLINE], [
+    have_readline=no
+    for readline_lib in readline edit editline; do
+       for termcap_lib in "" termlib termcap curses ncurses; do
+         AC_CHECK_LIB([$readline_lib], [add_history],
+             [have_readline=yes; break 2], [], [$termcap_lib])
+       done
+    done
+
+    if test "$have_readline" = yes; then
+       AC_CHECK_HEADER([readline/readline.h], [], [have_readline=no],
+                       [AC_INCLUDES_DEFAULT])
+       AC_CHECK_HEADER([readline/history.h], [], [have_readline=no],
+                       [AC_INCLUDES_DEFAULT])
+    fi
+
+    if test "$have_readline" = yes; then
+       if test "x$termcap_lib" != x; then
+           LIBS="-l$termcap_lib $LIBS"
+       fi
+       LIBS="-l$readline_lib $LIBS"
+       AC_DEFINE([HAVE_LIBREADLINE], [1],
+                 [Define if you have libreadline])
+    fi
+])
index ddd49fc..90cc518 100644 (file)
@@ -58,7 +58,7 @@ if test "$Windows_API" = yes; then
        AC_LIBOBJ([w32/w32io])
        AC_LIBOBJ([w32/w32sockets])
 fi
-AX_LIB_READLINE
+MY_LIB_READLINE
 
 
 ### Checks for header files.
index cb81f1b..cdffc8a 100644 (file)
@@ -75,9 +75,9 @@ print_usage(char *program_name)
           "  -r              Restricted mode, no redirections\n"
           "  -s [HOST:]PORT  Specify server HOST and PORT\n"
           "  -u              Use UTF-8\n"
-#ifdef HAVE_READLINE_HISTORY
+#ifdef HAVE_LIBREADLINE
           "  -H              Save readline command history to file\n"
-#endif /* HAVE_READLINE_HISTORY */
+#endif /* HAVE_LIBREADLINE */
           "  -h              display this help and exit\n"
           "  -v              display version information and exit\n",
           program_name);
@@ -107,11 +107,11 @@ main(int argc, char **argv)
        case '2':
            auxfname = optarg;
            break;
-#ifdef HAVE_READLINE_HISTORY
+#ifdef HAVE_LIBREADLINE
        case 'H':
            use_history_file = 1;
            break;
-#endif /* HAVE_READLINE_HISTORY */
+#endif /* HAVE_LIBREADLINE */
        case 'k':
            send_kill = 1;
            break;
index 9979ad6..2f75b78 100644 (file)
 #include "secure.h"
 
 #ifdef HAVE_LIBREADLINE
-#  if defined(HAVE_READLINE_READLINE_H)
-#    include <readline/readline.h>
-#  elif defined(HAVE_READLINE_H)
-#    include <readline.h>
-#  else /* !defined(HAVE_READLINE_H) */
-extern char *readline ();
-#  endif /* !defined(HAVE_READLINE_H) */
-#endif /* HAVE_LIBREADLINE */
-
-#ifdef HAVE_READLINE_HISTORY
-#  if defined(HAVE_READLINE_HISTORY_H)
-#    include <readline/history.h>
-#  elif defined(HAVE_HISTORY_H)
-#    include <history.h>
-#  else /* !defined(HAVE_HISTORY_H) */
-extern void add_history ();
-extern int write_history ();
-extern int read_history ();
-#  endif /* !defined(HAVE_HISTORY_H) */
-#endif /* HAVE_READLINE_HISTORY */
+#include <readline/readline.h>
+#include <readline/history.h>
+#endif
 
 #define EOF_COOKIE "ctld\n"
 #define INTR_COOKIE "aborted\n"
@@ -446,10 +429,8 @@ input_handler(char *line)
 {
     input_from_rl = line;
     has_rl_input = 1;
-#ifdef HAVE_READLINE_HISTORY
     if (line && *line)
        add_history(line);
-#endif /* HAVE_READLINE_HISTORY */
 }
 
 static int
@@ -583,10 +564,8 @@ play(int sock, char *history_file)
     sigaction(SIGPIPE, &sa, NULL);
 #ifdef HAVE_LIBREADLINE
     rl_already_prompted = 1;
-#ifdef HAVE_READLINE_HISTORY
     if (history_file)
        read_history(history_file);
-#endif /* HAVE_READLINE_HISTORY */
     rl_bind_key('\t', rl_insert);  /* Disable tab completion */
     rl_callback_handler_install("", input_handler);
 #endif /* HAVE_LIBREADLINE */
@@ -692,10 +671,8 @@ play(int sock, char *history_file)
 
 #ifdef HAVE_LIBREADLINE
     rl_callback_handler_remove();
-#ifdef HAVE_READLINE_HISTORY
     if (history_file)
        write_history(history_file);
-#endif /* HAVE_READLINE_HISTORY */
 #endif
     return ret;
 }