#
# SYNOPSIS
#
#   PANDORA_HAVE_LIBREADLINE
#
# 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 */
#
# LAST MODIFICATION
#
#   2009-11-17
#
# Based on VL_LIB_READLINE from  Ville Laurikari
#
# COPYLEFT
#
#   Copyright (C) 2009 Monty Taylor
#   Copyright (C) 2002 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.

AC_DEFUN([PANDORA_CHECK_TIOCGWINSZ],[
  AC_CACHE_CHECK([for TIOCGWINSZ in sys/ioctl.h],
    [pandora_cv_tiocgwinsz_in_ioctl],[
    AC_COMPILE_IFELSE([
      AC_LANG_PROGRAM([[
#include <sys/types.h>
#include <sys/ioctl.h>
      ]],[[
int x= TIOCGWINSZ;
      ]])
    ],[
      pandora_cv_tiocgwinsz_in_ioctl=yes
    ],[
      pandora_cv_tiocgwinsz_in_ioctl=no
    ])
  ])
  AS_IF([test "$pandora_cv_tiocgwinsz_in_ioctl" = "yes"],[   
    AC_DEFINE([GWINSZ_IN_SYS_IOCTL], [1],
              [READLINE: your system defines TIOCGWINSZ in sys/ioctl.h.])
  ])
])

AC_DEFUN([PANDORA_CHECK_RL_COMPENTRY], [
  AC_CACHE_CHECK([defined rl_compentry_func_t], [pandora_cv_rl_compentry],[
    AC_COMPILE_IFELSE([
      AC_LANG_PROGRAM([[
#include "stdio.h"
#include "readline/readline.h"
      ]],[[
rl_compentry_func_t *func2= (rl_compentry_func_t*)0;
      ]])
    ],[
      pandora_cv_rl_compentry=yes
    ],[
      pandora_cv_rl_compentry=no
    ])
  ])
  AS_IF([test "$pandora_cv_rl_compentry" = "yes"],[
    AC_DEFINE([HAVE_RL_COMPENTRY], [1],
              [Does system provide rl_compentry_func_t])
  ])

  save_CXXFLAGS="${CXXFLAGS}"
  CXXFLAGS="${AM_CXXFLAGS} ${CXXFLAGS}"
  AC_LANG_PUSH(C++)
  AC_CACHE_CHECK([rl_compentry_func_t works], [pandora_cv_rl_compentry_works],[
    AC_COMPILE_IFELSE([
      AC_LANG_PROGRAM([[
#include "stdio.h"
#include "readline/readline.h"
      ]],[[
rl_completion_entry_function= (rl_compentry_func_t*)NULL;
      ]])
    ],[
      pandora_cv_rl_compentry_works=yes
    ],[
      pandora_cv_rl_compentry_works=no
    ])
  ])
  AS_IF([test "$pandora_cv_rl_compentry_works" = "yes"],[
    AC_DEFINE([HAVE_WORKING_RL_COMPENTRY], [1],
              [Does system provide an rl_compentry_func_t that is usable])
  ])
  CXXFLAGS="${save_CXXFLAGS}"
  AC_LANG_POP()
])


AC_DEFUN([PANDORA_CHECK_RL_COMPLETION_FUNC], [
  AC_CACHE_CHECK([defined rl_completion_func_t], [pandora_cv_rl_completion],[
    AC_COMPILE_IFELSE([
      AC_LANG_PROGRAM([[
#include "stdio.h"
#include "readline/readline.h"
      ]],[[
rl_completion_func_t *func1= (rl_completion_func_t*)0;
      ]])
    ],[
      pandora_cv_rl_completion=yes
    ],[
      pandora_cv_rl_completion=no
    ])
  ])
  AS_IF([test "$pandora_cv_rl_completion" = "yes"],[
    AC_DEFINE([HAVE_RL_COMPLETION], [1],
              [Does system provide rl_completion_func_t])
  ])
])

AC_DEFUN([_PANDORA_SEARCH_LIBREADLINE], [

  save_LIBS="${LIBS}"
  LIBS=""

  AC_CACHE_CHECK([for a readline compatible library],
                 ac_cv_libreadline, [
    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, ac_cv_libreadline="$TRY_LIB")
        if test -n "$ac_cv_libreadline"; then
          break
        fi
      done
      if test -n "$ac_cv_libreadline"; then
        break
      fi
    done
    if test -z "$ac_cv_libreadline"; then
      ac_cv_libreadline="no"
      LIBS="$ORIG_LIBS"
    fi
  ])

  if test "$ac_cv_libreadline" != "no"; then
    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],
                   ac_cv_libreadline_history, [
      ac_cv_libreadline_history="no"
      AC_TRY_LINK_FUNC(add_history, ac_cv_libreadline_history="yes")
    ])
    if test "$ac_cv_libreadline_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
  PANDORA_CHECK_RL_COMPENTRY  
  PANDORA_CHECK_RL_COMPLETION_FUNC
  PANDORA_CHECK_TIOCGWINSZ


  READLINE_LIBS="${LIBS}"
  LIBS="${save_LIBS}"
  AC_SUBST(READLINE_LIBS)

  AM_CONDITIONAL(HAVE_LIBREADLINE, [test "x${ac_cv_libreadline}" = "xyes"])
])

AC_DEFUN([_PANDORA_HAVE_LIBREADLINE],[

  AC_ARG_ENABLE([libreadline],
    [AS_HELP_STRING([--disable-libreadline],
      [Build with libreadline support @<:@default=on@:>@])],
    [ac_enable_libreadline="$enableval"],
    [ac_enable_libreadline="yes"])

  _PANDORA_SEARCH_LIBREADLINE
])


AC_DEFUN([PANDORA_HAVE_LIBREADLINE],[
  AC_REQUIRE([_PANDORA_HAVE_LIBREADLINE])
])

AC_DEFUN([_PANDORA_REQUIRE_LIBREADLINE],[
  ac_enable_libreadline="yes"
  _PANDORA_SEARCH_LIBREADLINE

  AS_IF([test "x$ac_cv_libreadline" = "xno"],
    AC_MSG_ERROR([libreadline is required for ${PACKAGE}. On Debian this can be found in libreadline5-dev. On RedHat this can be found in readline-devel.]))

])

AC_DEFUN([PANDORA_REQUIRE_LIBREADLINE],[
  AC_REQUIRE([_PANDORA_REQUIRE_LIBREADLINE])
])


