# terminfo.m4 serial 4 (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_TERMINFO],
[
  AC_REQUIRE([gl_TERMINFO_BODY])
  if test $gl_cv_terminfo_tparam = no && test $gl_cv_terminfo_tparm = no; then
    AC_LIBOBJ([tparm])
  fi
  case "$gl_cv_terminfo" in
    no*)
      case "$gl_cv_termcap" in
        no*)
          AC_LIBOBJ([tputs])
          ;;
      esac
      ;;
  esac
])

AC_DEFUN([gl_TERMINFO_BODY],
[
  dnl Some systems have setupterm(), tigetnum(), tigetstr(), tigetflag(),
  dnl tputs(), tgoto() in the same library as tgetent(), tgetnum(), tgetstr(),
  dnl tgetflag(), e.g. Linux (in libncurses) or Solaris (in libtermcap =
  dnl libncurses).
  dnl Some systems have them in a different library, e.g. OSF/1 (in libcurses,
  dnl not in libtermcap) or HP-UX (in libxcurses, not in libtermcap).
  dnl Some systems, like NetBSD or BeOS, don't have these functions at all;
  dnl they have only a libtermcap.
  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])

    dnl Search for libxcurses and define LIBXCURSES, LTLIBXCURSES and INCXCURSES
    dnl accordingly.
    AC_LIB_LINKFLAGS_BODY([xcurses])

    dnl Search for libcurses and define LIBCURSES, LTLIBCURSES and INCCURSES
    dnl accordingly.
    AC_LIB_LINKFLAGS_BODY([curses])

  else

    LIBNCURSES=
    LTLIBNCURSES=
    INCNCURSES=

    LIBTERMCAP=
    LTLIBTERMCAP=
    INCTERMCAP=

    LIBXCURSES=
    LTLIBXCURSES=
    INCXCURSES=

    LIBCURSES=
    LTLIBCURSES=
    INCCURSES=

  fi

  dnl When searching for the terminfo functions, prefer libtermcap over
  dnl libxcurses and libcurses, because it is smaller.
  AC_CACHE_CHECK([where terminfo library functions come from], [gl_cv_terminfo], [
    gl_cv_terminfo="not found, consider installing GNU ncurses"
    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_terminfo=libc])
    if test "$gl_cv_terminfo" != libc; then
      gl_save_LIBS="$LIBS"
      LIBS="$LIBS $LIBNCURSES"
      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_terminfo=libncurses])
      LIBS="$gl_save_LIBS"
      if test "$gl_cv_terminfo" != libncurses; then
        gl_save_LIBS="$LIBS"
        LIBS="$LIBS $LIBTERMCAP"
        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_terminfo=libtermcap])
        LIBS="$gl_save_LIBS"
        if test "$gl_cv_terminfo" != libtermcap; then
          gl_save_LIBS="$LIBS"
          LIBS="$LIBS $LIBXCURSES"
          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_terminfo=libxcurses])
          LIBS="$gl_save_LIBS"
          if test "$gl_cv_terminfo" != libxcurses; then
            gl_save_LIBS="$LIBS"
            LIBS="$LIBS $LIBCURSES"
            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_terminfo=libcurses])
            LIBS="$gl_save_LIBS"
          fi
        fi
      fi
    fi
  ])
  case "$gl_cv_terminfo" in
    libc)
      LIBTERMINFO=
      LTLIBTERMINFO=
      INCTERMINFO=
      ;;
    libncurses)
      LIBTERMINFO="$LIBNCURSES"
      LTLIBTERMINFO="$LTLIBNCURSES"
      INCTERMINFO="$INCNCURSES"
      ;;
    libtermcap)
      LIBTERMINFO="$LIBTERMCAP"
      LTLIBTERMINFO="$LTLIBTERMCAP"
      INCTERMINFO="$INCTERMCAP"
      ;;
    libxcurses)
      LIBTERMINFO="$LIBXCURSES"
      LTLIBTERMINFO="$LTLIBXCURSES"
      INCTERMINFO="$INCXCURSES"
      ;;
    libcurses)
      LIBTERMINFO="$LIBCURSES"
      LTLIBTERMINFO="$LTLIBCURSES"
      INCTERMINFO="$INCCURSES"
      ;;
  esac
  case "$gl_cv_terminfo" in
    libc | libncurses | libtermcap | libxcurses | libcurses)
      AC_DEFINE([HAVE_TERMINFO], 1,
        [Define if setupterm(), tigetnum(), tigetstr(), tigetflag()
         are among the termcap library functions.])
      ;;
    *)
      dnl Use the termcap functions as a fallback.
      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)
          LIBTERMINFO=
          LTLIBTERMINFO=
          INCTERMINFO=
          ;;
        libncurses)
          LIBTERMINFO="$LIBNCURSES"
          LTLIBTERMINFO="$LTLIBNCURSES"
          INCTERMINFO="$INCNCURSES"
          ;;
        libtermcap)
          LIBTERMINFO="$LIBTERMCAP"
          LTLIBTERMINFO="$LTLIBTERMCAP"
          INCTERMINFO="$INCTERMCAP"
          ;;
      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
      ;;
  esac
  AC_SUBST([LIBTERMINFO])
  AC_SUBST([LTLIBTERMINFO])
  AC_SUBST([INCTERMINFO])

  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_terminfo_tparam], [
    gl_save_LIBS="$LIBS"
    LIBS="$LIBS $LIBTERMINFO"
    gl_save_CPPFLAGS="$CPPFLAGS"
    CPPFLAGS="$CPPFLAGS $INCTERMINFO"
    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_terminfo_tparam=yes],
      [gl_cv_terminfo_tparam=no])
    CPPFLAGS="$gl_save_CPPFLAGS"
    LIBS="$gl_save_LIBS"
  ])
  if test $gl_cv_terminfo_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_terminfo_tparm], [
      gl_save_LIBS="$LIBS"
      LIBS="$LIBS $LIBTERMINFO"
      gl_save_CPPFLAGS="$CPPFLAGS"
      CPPFLAGS="$CPPFLAGS $INCTERMINFO"
      AC_LINK_IFELSE(
        [AC_LANG_PROGRAM(
           [[extern
             #ifdef __cplusplus
             "C"
             #endif
             char * tparm (const char *, ...);
           ]],
           [[return tparm ("\033\133%dm", 8);]])],
        [gl_cv_terminfo_tparm=yes], [gl_cv_terminfo_tparm=no])
      CPPFLAGS="$gl_save_CPPFLAGS"
      LIBS="$gl_save_LIBS"
    ])
  fi
])
