# termcap.m4 serial 8 (gettext-0.21.1)
dnl Copyright (C) 2000-2002, 2006-2008, 2020 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.

dnl From Bruno Haible.

AC_DEFUN([gl_TERMCAP],
[
  AC_REQUIRE([gl_TERMCAP_BODY])
  if test $gl_cv_termcap_tparam = no && test $gl_cv_termcap_tparm = no; then
    AC_LIBOBJ([tparm])
  fi
  case "$gl_cv_termcap" in
    no*)
      AC_LIBOBJ([tputs])
      ;;
  esac
])

AC_DEFUN([gl_TERMCAP_BODY],
[
  dnl Some systems have tgetent(), tgetnum(), tgetstr(), tgetflag(), tparm(),
  dnl tputs(), tgoto() in libc, some have it in libtermcap, some have it in
  dnl libncurses.
  dnl When both libtermcap and libncurses exist, we prefer the latter,
  dnl because libtermcap is unsecure by design and obsolete since 1994.
  dnl libcurses is useless: all platforms which have libcurses also have
  dnl libtermcap, and libcurses is unusable on some old Unices.
  dnl Some systems have the terminfo functions setupterm(), tigetnum(),
  dnl tigetstr(), tigetflag() in the same library.
  dnl Some systems, like BeOS, use GNU termcap, which has tparam() instead of
  dnl tparm().
  dnl Some systems, like mingw, have nothing at all.

  dnl Some people want to avoid these libraries, in special situations such
  dnl as when cross-compiling.
  AC_REQUIRE([gl_CURSES])

  dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
  AC_REQUIRE([AC_LIB_RPATH])

  if test "$gl_curses_allowed" != no; then

    dnl Search for libncurses and define LIBNCURSES, LTLIBNCURSES and INCNCURSES
    dnl accordingly.
    AC_LIB_LINKFLAGS_BODY([ncurses])

    dnl Search for libtermcap and define LIBTERMCAP, LTLIBTERMCAP and INCTERMCAP
    dnl accordingly.
    AC_LIB_LINKFLAGS_BODY([termcap])

  else

    LIBNCURSES=
    LTLIBNCURSES=
    INCNCURSES=

    LIBTERMCAP=
    LTLIBTERMCAP=
    INCTERMCAP=

  fi

  AC_CACHE_CHECK([where termcap library functions come from], [gl_cv_termcap], [
    gl_cv_termcap="not found, consider installing GNU ncurses"
    AC_LINK_IFELSE(
      [AC_LANG_PROGRAM(
         [[extern
           #ifdef __cplusplus
           "C"
           #endif
           int tgetent (char *, const char *);
         ]],
         [[return tgetent ((char *) 0, "xterm");]])],
      [gl_cv_termcap=libc])
    if test "$gl_cv_termcap" != libc; then
      gl_save_LIBS="$LIBS"
      LIBS="$LIBS $LIBNCURSES"
      AC_LINK_IFELSE(
        [AC_LANG_PROGRAM(
           [[extern
             #ifdef __cplusplus
             "C"
             #endif
             int tgetent (char *, const char *);
           ]],
           [[return tgetent ((char *) 0, "xterm");]])],
        [gl_cv_termcap=libncurses])
      LIBS="$gl_save_LIBS"
      if test "$gl_cv_termcap" != libncurses; then
        gl_save_LIBS="$LIBS"
        LIBS="$LIBS $LIBTERMCAP"
        AC_LINK_IFELSE(
          [AC_LANG_PROGRAM(
             [[extern
               #ifdef __cplusplus
               "C"
               #endif
               int tgetent (char *, const char *);
             ]],
             [[return tgetent ((char *) 0, "xterm");]])],
          [gl_cv_termcap=libtermcap])
        LIBS="$gl_save_LIBS"
      fi
    fi
  ])
  case "$gl_cv_termcap" in
    libc)
      LIBTERMCAP=
      LTLIBTERMCAP=
      INCTERMCAP=
      ;;
    libncurses)
      LIBTERMCAP="$LIBNCURSES"
      LTLIBTERMCAP="$LTLIBNCURSES"
      INCTERMCAP="$INCNCURSES"
      ;;
    libtermcap)
      ;;
  esac
  case "$gl_cv_termcap" in
    libc | libncurses | libtermcap)
      AC_DEFINE([HAVE_TERMCAP], 1,
        [Define if tgetent(), tgetnum(), tgetstr(), tgetflag()
         are among the termcap library functions.])
      ;;
  esac
  AC_SUBST([LIBTERMCAP])
  AC_SUBST([LTLIBTERMCAP])
  AC_SUBST([INCTERMCAP])

  dnl Test whether the terminfo functions are available from the same library.
  AC_CACHE_CHECK([for terminfo functions], [gl_cv_func_terminfo], [
    gl_save_LIBS="$LIBS"
    LIBS="$LIBS $LIBTERMCAP"
    gl_save_CPPFLAGS="$CPPFLAGS"
    CPPFLAGS="$CPPFLAGS $INCTERMCAP"
    AC_LINK_IFELSE(
      [AC_LANG_PROGRAM(
         [[extern
           #ifdef __cplusplus
           "C"
           #endif
           int setupterm (const char *, int, int *);
           extern
           #ifdef __cplusplus
           "C"
           #endif
           int tigetnum (const char *);
           extern
           #ifdef __cplusplus
           "C"
           #endif
           int tigetflag (const char *);
           extern
           #ifdef __cplusplus
           "C"
           #endif
           const char * tigetstr (const char *);
         ]],
         [[return setupterm ("xterm", 0, (int *)0)
                  + tigetnum ("colors") + tigetflag ("hc") + * tigetstr("oc");]])],
      [gl_cv_func_terminfo=yes], [gl_cv_func_terminfo=no])
    CPPFLAGS="$gl_save_CPPFLAGS"
    LIBS="$gl_save_LIBS"
  ])
  if test $gl_cv_func_terminfo = yes; then
    AC_DEFINE([HAVE_TERMINFO], 1,
      [Define if setupterm(), tigetnum(), tigetstr(), tigetflag()
       are among the termcap library functions.])
  fi

  dnl Test against the old GNU termcap, which provides a tparam() function
  dnl instead of the classical tparm() function.
  AC_CACHE_CHECK([for tparam], [gl_cv_termcap_tparam], [
    gl_save_LIBS="$LIBS"
    LIBS="$LIBS $LIBTERMCAP"
    gl_save_CPPFLAGS="$CPPFLAGS"
    CPPFLAGS="$CPPFLAGS $INCTERMCAP"
    AC_LINK_IFELSE(
      [AC_LANG_PROGRAM(
         [[extern
           #ifdef __cplusplus
           "C"
           #endif
           char * tparam (const char *, void *, int, ...);
           char buf;
         ]],
         [[return tparam ("\033\133%dm", &buf, 1, 8);]])],
      [gl_cv_termcap_tparam=yes], [gl_cv_termcap_tparam=no])
    CPPFLAGS="$gl_save_CPPFLAGS"
    LIBS="$gl_save_LIBS"
  ])
  if test $gl_cv_termcap_tparam = yes; then
    AC_DEFINE([HAVE_TPARAM], 1,
      [Define if tparam() is among the termcap library functions.])
  else
    dnl Test whether a tparm() function is provided. It is missing e.g.
    dnl in NetBSD 3.0 libtermcap.
    AC_CACHE_CHECK([for tparm], [gl_cv_termcap_tparm], [
      gl_save_LIBS="$LIBS"
      LIBS="$LIBS $LIBTERMCAP"
      gl_save_CPPFLAGS="$CPPFLAGS"
      CPPFLAGS="$CPPFLAGS $INCTERMCAP"
      AC_LINK_IFELSE(
        [AC_LANG_PROGRAM(
           [[extern
             #ifdef __cplusplus
             "C"
             #endif
             char * tparm (const char *, ...);
           ]],
           [[return tparm ("\033\133%dm", 8);]])],
        [gl_cv_termcap_tparm=yes], [gl_cv_termcap_tparm=no])
      CPPFLAGS="$gl_save_CPPFLAGS"
      LIBS="$gl_save_LIBS"
    ])
  fi
])
