##*****************************************************************************
#  AUTHOR:
#    Derived from x_ac_munge.
#
#  SYNOPSIS:
#    X_AC_JSON()
#
#  DESCRIPTION:
#    Check for JSON parser libraries.
#    Right now, just check for json-c header and library.
#
#  WARNINGS:
#    This macro must be placed after AC_PROG_CC and before AC_PROG_LIBTOOL.
##*****************************************************************************

AC_DEFUN([X_AC_JSON], [

  _x_ac_json_dirs="/usr /usr/local"
  _x_ac_json_libs="lib64 lib"

  AC_ARG_WITH(
    [json],
    AS_HELP_STRING(--with-json=PATH,Specify path to json-c installation),
    [AS_IF([test "x$with_json" != xno && test "x$with_json" != xyes],
	   [_x_ac_json_dirs="$with_json"])])

  if [test "x$with_json" = xno]; then
    AC_MSG_NOTICE([support for json disabled])
  else
    AC_CACHE_CHECK(
      [for json installation],
      [x_ac_cv_json_dir],
      [
        for d in $_x_ac_json_dirs; do
          test -d "$d" || continue
          test -d "$d/include" || continue
          test -f "$d/include/json-c/json_object.h" || test -f "$d/include/json/json_object.h" || continue
          for bit in $_x_ac_json_libs; do
            test -d "$d/$bit" || continue
            _x_ac_json_libs_save="$LIBS"
            LIBS="-L$d/$bit -ljson-c $LIBS"
            AC_LINK_IFELSE(
              [AC_LANG_CALL([], json_tokener_parse)],
              AS_VAR_SET(x_ac_cv_json_dir, $d))
            LIBS="$_x_ac_json_libs_save"
            test -n "$x_ac_cv_json_dir" && break
          done
          test -n "$x_ac_cv_json_dir" && break
        done
      ])

    if test -z "$x_ac_cv_json_dir"; then
      if [test -z "$with_json"] ; then
        AC_MSG_WARN([unable to locate json parser library])
      else
        AC_MSG_ERROR([unable to locate json parser library])
      fi
    else
      if test -f "$d/include/json-c/json_object.h" ; then
        AC_DEFINE([HAVE_JSON_C_INC], [1], [Define if headers in include/json-c.])
      fi
      if test -f "$d/include/json/json_object.h" ; then
        AC_DEFINE([HAVE_JSON_INC], [1], [Define if headers in include/json.])
      fi
      AC_DEFINE([HAVE_JSON], [1], [Define if you are compiling with json.])
      JSON_CPPFLAGS="-I$x_ac_cv_json_dir/include"
      if test "$ac_with_rpath" = "yes"; then
        JSON_LDFLAGS="-Wl,-rpath -Wl,$x_ac_cv_json_dir/$bit -L$x_ac_cv_json_dir/$bit -ljson-c"
      else
        JSON_LDFLAGS="-L$x_ac_cv_json_dir/$bit -ljson-c"
      fi
    fi

    AC_SUBST(JSON_CPPFLAGS)
    AC_SUBST(JSON_LDFLAGS)
  fi

  AM_CONDITIONAL(WITH_JSON_PARSER, test -n "$x_ac_cv_json_dir")
])
