Hello there,

I would like to see the module readline to access also libedit,
should libreadline be missing on a particular system. The patch
contained here successfully links against libedit on NetBSD and
Debian GNU/kFreeBSD. Likewise, it still behaves correctly with
libreadline on GNU/Linux, FreeBSD, DragonFlyBSD, OpenBSD, and
OpenSolaris.

Best regards,
  Mats Erik Andersson
>From 21ac3c7a026b2b4be04bdbe62e0f7d1b0e1a0245 Mon Sep 17 00:00:00 2001
From: Mats Erik Andersson <g...@gisladisker.se>
Date: Tue, 15 Oct 2013 22:02:26 +0200
Subject: [PATCH] readline: Support libedit.

Allow libedit as an alternate source of readline().
Debian and NetBSD benefit from this extension.
* m4/readline.m4: Make libedit into a second choice,
should libreadline be missing.
* modules/readline: Update conditions to accept libedit.
---
 ChangeLog        |   18 +++++++++++++++++
 lib/readline.h   |    2 ++
 m4/readline.m4   |   58 +++++++++++++++++++++++++++++++++++++++++++++++++-----
 modules/readline |    4 ++--
 4 filer ändrade, 75 tillägg(+), 7 borttagningar(-)

diff --git a/ChangeLog b/ChangeLog
index c70f1fe..b6a0cb7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2013-10-15  Mats Erik Andersson  <g...@gisladisker.se>
+
+	readline: Support libedit.
+	Look for readline() in libedit, if it does not exist
+	within libreadline.
+	* lib/readline.h [HAVE_EDITLINE_READLINE_H]:
+	Include <editline/readline.h>.
+	* m4/readline.m4 (gl_FUNC_READLINE): Check for libedit,
+	and headers <editline/readline.h>, <editline/history.h>.
+	Check for readline in libedit.
+	(HAVE_LIBREADLINE, HAVE_LIBEDIT): New macros, stating that
+	readline exists in libreadline, or in libedit.  The macro
+	HAVE_READLINE still indicates the existence of readline().
+	(LIBEDIT, LTLIBEDIT): New local variables.
+	* modules/readline (Depends-on): Expand condition for `getline'
+	to also test gl_cv_lib_edit.
+	(configure.ac): Add test on gl_cv_lib_edit.
+
 2013-10-14  Paul Eggert  <egg...@cs.ucla.edu>
 
 	acl: allow cross-compilation to Gentoo
diff --git a/lib/readline.h b/lib/readline.h
index af91e10..f3e0853 100644
--- a/lib/readline.h
+++ b/lib/readline.h
@@ -23,6 +23,8 @@
    <stdio.h> itself. */
 # include <stdio.h>
 # include <readline/readline.h>
+#elif defined HAVE_EDITLINE_READLINE_H
+# include <editline/readline.h>
 #else
 /* Prints a prompt PROMPT and then reads and returns a single line of
    text from the user.  If PROMPT is NULL or the empty string, no
diff --git a/m4/readline.m4 b/m4/readline.m4
index dfc48a0..b734ed1 100644
--- a/m4/readline.m4
+++ b/m4/readline.m4
@@ -1,4 +1,4 @@
-# readline.m4 serial 10
+# readline.m4 serial 11
 dnl Copyright (C) 2005-2006, 2009-2013 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -17,6 +17,14 @@ AC_DEFUN([gl_FUNC_READLINE],
   dnl INCREADLINE accordingly.
   AC_LIB_LINKFLAGS_BODY([readline])
 
+  dnl Likewise for libedit.
+  AC_LIB_LINKFLAGS_BODY([edit])
+
+  dnl The headers are needed to distinguish alternate
+  dnl implementations, so check for them now.
+  AC_CHECK_HEADERS([readline/readline.h readline/history.h \
+                    editline/readline.h editline/history.h])
+
   dnl Add $INCREADLINE to CPPFLAGS before performing the following checks,
   dnl because if the user has installed libreadline and not disabled its use
   dnl via --without-libreadline-prefix, he wants to use it. The AC_LINK_IFELSE
@@ -24,7 +32,7 @@ AC_DEFUN([gl_FUNC_READLINE],
   am_save_CPPFLAGS="$CPPFLAGS"
   AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCREADLINE])
 
-  AC_CACHE_CHECK([for readline], [gl_cv_lib_readline], [
+  AC_CACHE_CHECK([for libreadline], [gl_cv_lib_readline], [
     gl_cv_lib_readline=no
     am_save_LIBS="$LIBS"
     dnl On some systems, -lreadline doesn't link without an additional
@@ -53,8 +61,40 @@ AC_DEFUN([gl_FUNC_READLINE],
     LIBS="$am_save_LIBS"
   ])
 
+  dnl Check whether libedit exists and works.
+  dnl The readline emulation comes in two flavours:
+  dnl
+  dnl  * original by NetBSD offers <readline/readline.h>,
+  dnl  * while Debian's variant uses <editline/readline.h>.
+  dnl
+  CPPFLAGS="$am_save_CPPFLAGS"
+  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCEDIT])
+
+  AC_CACHE_CHECK([for libedit], [gl_cv_lib_edit], [
+    gl_cv_lib_edit=no
+    am_save_LIBS="$LIBS"
+    LIBS="$am_save_LIBS $LIBEDIT"
+    AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <stdio.h>
+#ifdef HAVE_READLINE_READLINE_H
+# include <readline/readline.h>
+#elif defined HAVE_EDITLINE_READLINE_H
+# include <editline/readline.h>
+#endif]],
+          [[readline((char*)0);]])],
+        [gl_cv_lib_edit="yes"])
+    LIBS="$am_save_LIBS"
+  ])
+
+  dnl Is the function readline() located by now?
+  if test "$gl_cv_lib_readline" != no ||
+     test "$gl_cv_lib_edit" != no; then
+    AC_DEFINE([HAVE_READLINE], [1], [Define if you have the readline function.])
+  fi
+
+  dnl Unravel dependency on implementation.  Prefer libreadline
+  dnl over libedit.
   if test "$gl_cv_lib_readline" != no; then
-    AC_DEFINE([HAVE_READLINE], [1], [Define if you have the readline library.])
+    AC_DEFINE([HAVE_LIBREADLINE], [1], [Define if you have the readline library.])
     extra_lib=`echo "$gl_cv_lib_readline" | sed -n -e 's/yes, requires //p'`
     if test -n "$extra_lib"; then
       LIBREADLINE="$LIBREADLINE $extra_lib"
@@ -62,17 +102,25 @@ AC_DEFUN([gl_FUNC_READLINE],
     fi
     AC_MSG_CHECKING([how to link with libreadline])
     AC_MSG_RESULT([$LIBREADLINE])
+  elif test "$gl_cv_lib_edit" != no; then
+    AC_DEFINE([HAVE_LIBEDIT], [1], [Define if you have the edit library.])
+
+    dnl We have a working replacement for libreadline, so use it.
+    LIBREADLINE="$LIBEDIT"
+    LTLIBREADLINE="$LTLIBEDIT"
+    AC_MSG_CHECKING([how to link with libedit])
+    AC_MSG_RESULT([$LIBEDIT])
   else
     dnl If $LIBREADLINE didn't lead to a usable library, we don't
     dnl need $INCREADLINE either.
     CPPFLAGS="$am_save_CPPFLAGS"
     LIBREADLINE=
     LTLIBREADLINE=
+    LIBEDIT=
+    LTLIBEDIT=
   fi
   AC_SUBST([LIBREADLINE])
   AC_SUBST([LTLIBREADLINE])
-
-  AC_CHECK_HEADERS([readline/readline.h readline/history.h])
 ])
 
 # Prerequisites of lib/readline.c.
diff --git a/modules/readline b/modules/readline
index 9cee3bb..a334c43 100644
--- a/modules/readline
+++ b/modules/readline
@@ -8,11 +8,11 @@ m4/readline.m4
 
 Depends-on:
 havelib
-getline         [test "$gl_cv_lib_readline" = no]
+getline         [test "$gl_cv_lib_readline" = no && test "$gl_cv_lib_edit" = no]
 
 configure.ac:
 gl_FUNC_READLINE
-if test "$gl_cv_lib_readline" = no; then
+if test "$gl_cv_lib_readline" = no && test "$gl_cv_lib_edit" = no; then
   AC_LIBOBJ([readline])
   gl_PREREQ_READLINE
 fi
-- 
1.7.10.4

Reply via email to