Include a printf implementation supporting C99 snprintf and SUS
[platform/upstream/glib.git] / acinclude.m4
index 5ef4d33..a969c70 100644 (file)
@@ -1,5 +1,5 @@
 # Macro to add for using GNU gettext.
-# Ulrich Drepper <drepper@cygnus.com>, 1995.
+# Ulrich Drepper <drepper@cygnus.com>, 1995, 1996
 #
 # Modified to never use included libintl. 
 # Owen Taylor <otaylor@redhat.com>, 12/15/1998
 # once we've installed glib-gettext.m4 :-( ]
 #
 
+AC_DEFUN([AM_GLIB_LC_MESSAGES],
+  [if test $ac_cv_header_locale_h = yes; then
+    AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES,
+      [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES],
+       am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)])
+    if test $am_cv_val_LC_MESSAGES = yes; then
+      AC_DEFINE(HAVE_LC_MESSAGES, 1,
+        [Define if your <locale.h> file defines LC_MESSAGES.])
+    fi
+  fi])
+
+dnl AM_GLIB_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
+dnl   TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
+AC_DEFUN([AM_GLIB_PATH_PROG_WITH_TEST],
+[# Extract the first word of "$2", so it can be a program name with args.
+set dummy $2; ac_word=[$]2
+AC_MSG_CHECKING([for $ac_word])
+AC_CACHE_VAL(ac_cv_path_$1,
+[case "[$]$1" in
+  /*)
+  ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
+  ;;
+  *)
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in ifelse([$5], , $PATH, [$5]); do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      if [$3]; then
+       ac_cv_path_$1="$ac_dir/$ac_word"
+       break
+      fi
+    fi
+  done
+  IFS="$ac_save_ifs"
+dnl If no 4th arg is given, leave the cache variable unset,
+dnl so AC_PATH_PROGS will keep looking.
+ifelse([$4], , , [  test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
+])dnl
+  ;;
+esac])dnl
+$1="$ac_cv_path_$1"
+if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then
+  AC_MSG_RESULT([$]$1)
+else
+  AC_MSG_RESULT(no)
+fi
+AC_SUBST($1)dnl
+])
+
 # serial 5
 
 AC_DEFUN(AM_GLIB_WITH_NLS,
-  [AC_MSG_CHECKING([whether NLS is requested])
-    dnl Default is enabled NLS
-    AC_ARG_ENABLE(nls,
-      [  --disable-nls           do not use Native Language Support],
-      USE_NLS=$enableval, USE_NLS=yes)
-    AC_MSG_RESULT($USE_NLS)
+  dnl NLS is obligatory
+  [USE_NLS=yes
     AC_SUBST(USE_NLS)
 
-    USE_INCLUDED_LIBINTL=no
-
-    dnl If we use NLS figure out what method
-    if test "$USE_NLS" = "yes"; then
-#      AC_DEFINE(ENABLE_NLS)
-#      AC_MSG_CHECKING([whether included gettext is requested])
-#      AC_ARG_WITH(included-gettext,
-#        [  --with-included-gettext use the GNU gettext library included here],
-#        nls_cv_force_use_gnu_gettext=$withval,
-#        nls_cv_force_use_gnu_gettext=no)
-#      AC_MSG_RESULT($nls_cv_force_use_gnu_gettext)
-      nls_cv_force_use_gnu_gettext="no"
-
-      nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
-      if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
-        dnl User does not insist on using GNU NLS library.  Figure out what
-        dnl to use.  If gettext or catgets are available (in this order) we
-        dnl use this.  Else we have to fall back to GNU NLS library.
-       dnl catgets is only used if permitted by option --with-catgets.
-       nls_cv_header_intl=
-       nls_cv_header_libgt=
-       CATOBJEXT=NONE
-
-       AC_CHECK_HEADER(libintl.h,
-         [AC_CACHE_CHECK([for dgettext in libc], gt_cv_func_dgettext_libc,
-           [AC_TRY_LINK([#include <libintl.h>], [return (int) dgettext ("","")],
-              gt_cv_func_dgettext_libc=yes, gt_cv_func_dgettext_libc=no)])
-
-          if test "$gt_cv_func_dgettext_libc" != "yes"; then
-            AC_CHECK_LIB(intl, bindtextdomain,
-              [AC_CACHE_CHECK([for dgettext in libintl],
-                gt_cv_func_dgettext_libintl,
-                [AC_CHECK_LIB(intl, dgettext,
-                 gt_cv_func_dgettext_libintl=yes,
-                 gt_cv_func_dgettext_libintl=no)],
-                gt_cv_func_dgettext_libintl=no)])
-          fi
-
-           if test "$gt_cv_func_dgettext_libintl" = "yes"; then
-            LIBS="$LIBS -lintl";
-           fi
-
-          if test "$gt_cv_func_dgettext_libc" = "yes" \
-             || test "$gt_cv_func_dgettext_libintl" = "yes"; then
-             AC_DEFINE(HAVE_GETTEXT)
-             AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
-               [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl
-             if test "$MSGFMT" != "no"; then
-               AC_CHECK_FUNCS(dcgettext)
-               AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
-               AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
-                 [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :)
-               AC_TRY_LINK(, [extern int _nl_msg_cat_cntr;
-                              return _nl_msg_cat_cntr],
-                 [CATOBJEXT=.gmo
-                  DATADIRNAME=share],
-                 [CATOBJEXT=.mo
-                  DATADIRNAME=lib])
-               INSTOBJEXT=.mo
-             fi
+    dnl Figure out what method
+    nls_cv_force_use_gnu_gettext="no"
+
+    nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
+    if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
+      dnl User does not insist on using GNU NLS library.  Figure out what
+      dnl to use.  If gettext or catgets are available (in this order) we
+      dnl use this.  Else we have to fall back to GNU NLS library.
+      dnl catgets is only used if permitted by option --with-catgets.
+      nls_cv_header_intl=
+      nls_cv_header_libgt=
+      CATOBJEXT=NONE
+      XGETTEXT=:
+
+      AC_CHECK_HEADER(libintl.h,
+        [AC_CACHE_CHECK([for dgettext in libc], gt_cv_func_dgettext_libc,
+         [AC_TRY_LINK([#include <libintl.h>], [return (int) dgettext ("","")],
+           gt_cv_func_dgettext_libc=yes, gt_cv_func_dgettext_libc=no)])
+
+          gt_cv_func_dgettext_libintl="no"
+          libintl_extra_libs=""
+
+         if test "$gt_cv_func_dgettext_libc" != "yes" ; then
+           AC_CHECK_LIB(intl, bindtextdomain,
+              [AC_CHECK_LIB(intl, dgettext,
+                            gt_cv_func_dgettext_libintl=yes)])
+
+           if test "$gt_cv_func_dgettext_libc" != "yes" ; then
+              AC_MSG_CHECKING([if -liconv is needed to use gettext])
+              AC_MSG_RESULT([])
+              AC_CHECK_LIB(intl, dcgettext,
+                           [gt_cv_func_dgettext_libintl=yes
+                            libintl_extra_libs=-liconv],
+                           :,-liconv)
+            fi
+          fi
+
+          if test "$gt_cv_func_dgettext_libintl" = "yes"; then
+           LIBS="$LIBS -lintl $libintl_extra_libs";
+          fi
+
+         if test "$gt_cv_func_dgettext_libc" = "yes" \
+           || test "$gt_cv_func_dgettext_libintl" = "yes"; then
+           AC_DEFINE(HAVE_GETTEXT,1,
+              [Define if the GNU gettext() function is already present or preinstalled.])
+           AM_GLIB_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
+             [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl
+           if test "$MSGFMT" != "no"; then
+             AC_CHECK_FUNCS(dcgettext)
+             AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
+             AM_GLIB_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
+               [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :)
+             AC_TRY_LINK(, [extern int _nl_msg_cat_cntr;
+                            return _nl_msg_cat_cntr],
+               [CATOBJEXT=.gmo
+                DATADIRNAME=share],
+               [CATOBJEXT=.mo
+                DATADIRNAME=lib])
+             INSTOBJEXT=.mo
            fi
-
-           # Added by Martin Baulig 12/15/98 for libc5 systems
-           if test "$gt_cv_func_dgettext_libc" != "yes" \
-              && test "$gt_cv_func_dgettext_libintl" = "yes"; then
-              INTLLIBS=-lintl
-              LIBS=`echo $LIBS | sed -e 's/-lintl//'`
-           fi
-       ])
-
-#        if test "$CATOBJEXT" = "NONE"; then
-#        AC_MSG_CHECKING([whether catgets can be used])
-#        AC_ARG_WITH(catgets,
-#          [  --with-catgets          use catgets functions if available],
-#          nls_cv_use_catgets=$withval, nls_cv_use_catgets=no)
-#        AC_MSG_RESULT($nls_cv_use_catgets)
-#
-#        if test "$nls_cv_use_catgets" = "yes"; then
-#          dnl No gettext in C library.  Try catgets next.
-#          AC_CHECK_LIB(i, main)
-#          AC_CHECK_FUNC(catgets,
-#            [AC_DEFINE(HAVE_CATGETS)
-#             INTLOBJS="\$(CATOBJS)"
-#             AC_PATH_PROG(GENCAT, gencat, no)dnl
-#             if test "$GENCAT" != "no"; then
-#               AC_PATH_PROG(GMSGFMT, gmsgfmt, no)
-#               if test "$GMSGFMT" = "no"; then
-#                 AM_PATH_PROG_WITH_TEST(GMSGFMT, msgfmt,
-#                  [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)
-#               fi
-#               AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
-#                 [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :)
-#               USE_INCLUDED_LIBINTL=yes
-#               CATOBJEXT=.cat
-#               INSTOBJEXT=.cat
-#               DATADIRNAME=lib
-#               INTLDEPS='$(top_builddir)/intl/libintl.a'
-#               INTLLIBS=$INTLDEPS
-#               LIBS=`echo $LIBS | sed -e 's/-lintl//'`
-#               nls_cv_header_intl=intl/libintl.h
-#               nls_cv_header_libgt=intl/libgettext.h
-#              fi
-#            ])
-#        fi
-#        fi
-
-        if test "$CATOBJEXT" = "NONE"; then
-         dnl Neither gettext nor catgets in included in the C library.
-         dnl Fall back on GNU gettext library.
-         nls_cv_use_gnu_gettext=yes
-        fi
+         fi
+
+         # Added by Martin Baulig 12/15/98 for libc5 systems
+         if test "$gt_cv_func_dgettext_libc" != "yes" \
+           && test "$gt_cv_func_dgettext_libintl" = "yes"; then
+           INTLLIBS="-lintl $libintl_extra_libs"
+           LIBS=`echo $LIBS | sed -e 's/-lintl//'`
+         fi
+      ])
+
+      if test "$CATOBJEXT" = "NONE"; then
+        dnl Neither gettext nor catgets in included in the C library.
+        dnl Fall back on GNU gettext library.
+        nls_cv_use_gnu_gettext=yes
       fi
+    fi
+
+    if test "$nls_cv_use_gnu_gettext" != "yes"; then
+      AC_DEFINE(ENABLE_NLS, 1,
+        [always defined to indicate that i18n is enabled])
+    else
+      dnl Unset this variable since we use the non-zero value as a flag.
+      CATOBJEXT=
+    fi
 
-      if test "$nls_cv_use_gnu_gettext" != "yes"; then
-        AC_DEFINE(ENABLE_NLS)
+    dnl Test whether we really found GNU xgettext.
+    if test "$XGETTEXT" != ":"; then
+      dnl If it is no GNU xgettext we define it as : so that the
+      dnl Makefiles still can work.
+      if $XGETTEXT --omit-header /dev/null 2> /dev/null; then
+        : ;
       else
-         dnl Unset this variable since we use the non-zero value as a flag.
-         CATOBJEXT=
-#        dnl Mark actions used to generate GNU NLS library.
-#        INTLOBJS="\$(GETTOBJS)"
-#        AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
-#        [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], msgfmt)
-#        AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
-#        AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
-#        [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :)
-#        AC_SUBST(MSGFMT)
-#      USE_INCLUDED_LIBINTL=yes
-#        CATOBJEXT=.gmo
-#        INSTOBJEXT=.mo
-#        DATADIRNAME=share
-#      INTLDEPS='$(top_builddir)/intl/libintl.a'
-#      INTLLIBS=$INTLDEPS
-#      LIBS=`echo $LIBS | sed -e 's/-lintl//'`
-#        nls_cv_header_intl=intl/libintl.h
-#        nls_cv_header_libgt=intl/libgettext.h
+        AC_MSG_RESULT(
+         [found xgettext program is not GNU xgettext; ignore it])
+        XGETTEXT=":"
       fi
+    fi
 
-      dnl Test whether we really found GNU xgettext.
-      if test "$XGETTEXT" != ":"; then
-       dnl If it is no GNU xgettext we define it as : so that the
-       dnl Makefiles still can work.
-       if $XGETTEXT --omit-header /dev/null 2> /dev/null; then
-         : ;
-       else
-         AC_MSG_RESULT(
-           [found xgettext program is not GNU xgettext; ignore it])
-         XGETTEXT=":"
-       fi
-      fi
+    # We need to process the po/ directory.
+    POSUB=po
 
-      # We need to process the po/ directory.
-      POSUB=po
-    else
-      DATADIRNAME=share
-#      nls_cv_header_intl=intl/libintl.h
-#      nls_cv_header_libgt=intl/libgettext.h
-    fi
-#    AC_LINK_FILES($nls_cv_header_libgt, $nls_cv_header_intl)
     AC_OUTPUT_COMMANDS(
-     [case "$CONFIG_FILES" in *po/Makefile.in*)
+      [case "$CONFIG_FILES" in *po/Makefile.in*)
         sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile
       esac])
 
-
-#    # If this is used in GNU gettext we have to set USE_NLS to `yes'
-#    # because some of the sources are only built for this goal.
-#    if test "$PACKAGE" = gettext; then
-#      USE_NLS=yes
-#      USE_INCLUDED_LIBINTL=yes
-#    fi
-
     dnl These rules are solely for the distribution goal.  While doing this
     dnl we only have to keep exactly one list of the available catalogs
     dnl in configure.in.
@@ -208,7 +188,6 @@ AC_DEFUN(AM_GLIB_WITH_NLS,
     done
 
     dnl Make all variables we use known to autoconf.
-    AC_SUBST(USE_INCLUDED_LIBINTL)
     AC_SUBST(CATALOGS)
     AC_SUBST(CATOBJEXT)
     AC_SUBST(DATADIRNAME)
@@ -225,7 +204,6 @@ AC_DEFUN(AM_GLIB_GNU_GETTEXT,
   [AC_REQUIRE([AC_PROG_MAKE_SET])dnl
    AC_REQUIRE([AC_PROG_CC])dnl
    AC_REQUIRE([AC_PROG_RANLIB])dnl
-#   AC_REQUIRE([AC_ISC_POSIX])dnl
    AC_REQUIRE([AC_HEADER_STDC])dnl
    AC_REQUIRE([AC_C_CONST])dnl
    AC_REQUIRE([AC_C_INLINE])dnl
@@ -239,14 +217,7 @@ unistd.h sys/param.h])
    AC_CHECK_FUNCS([getcwd munmap putenv setenv setlocale strchr strcasecmp \
 strdup __argz_count __argz_stringify __argz_next])
 
-#   if test "${ac_cv_func_stpcpy+set}" != "set"; then
-#     AC_CHECK_FUNCS(stpcpy)
-#   fi
-#   if test "${ac_cv_func_stpcpy}" = "yes"; then
-#     AC_DEFINE(HAVE_STPCPY)
-#   fi
-
-   AM_LC_MESSAGES
+   AM_GLIB_LC_MESSAGES
    AM_GLIB_WITH_NLS
 
    if test "x$CATOBJEXT" != "x"; then
@@ -270,17 +241,6 @@ strdup __argz_count __argz_stringify __argz_next])
      fi
    fi
 
-#   dnl The reference to <locale.h> in the installed <libintl.h> file
-#   dnl must be resolved because we cannot expect the users of this
-#   dnl to define HAVE_LOCALE_H.
-#   if test $ac_cv_header_locale_h = yes; then
-#     INCLUDE_LOCALE_H="#include <locale.h>"
-#   else
-#     INCLUDE_LOCALE_H="\
-#/* The system does not provide the header <locale.h>.  Take care yourself.  */"
-#   fi
-#   AC_SUBST(INCLUDE_LOCALE_H)
-
    dnl Determine which catalog format we have (if any is needed)
    dnl For now we know about two different formats:
    dnl   Linux libc-5 and the normal X/Open format
@@ -292,22 +252,6 @@ strdup __argz_count __argz_stringify __argz_next])
      dnl cannot handle comments.
      sed -e '/^#/d' $srcdir/po/$msgformat-msg.sed > po/po2msg.sed
    fi
-   dnl po2tbl.sed is always needed.
-   sed -e '/^#.*[^\\]$/d' -e '/^#$/d' \
-     $srcdir/po/po2tbl.sed.in > po/po2tbl.sed
-
-#   dnl In the intl/Makefile.in we have a special dependency which makes
-#   dnl only sense for gettext.  We comment this out for non-gettext
-#   dnl packages.
-#   if test "$PACKAGE" = "gettext"; then
-#     GT_NO="#NO#"
-#     GT_YES=
-#   else
-#     GT_NO=
-#     GT_YES="#YES#"
-#   fi
-#   AC_SUBST(GT_NO)
-#   AC_SUBST(GT_YES)
 
    dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly
    dnl find the mkinstalldirs script in another subdir but ($top_srcdir).
@@ -321,10 +265,6 @@ strdup __argz_count __argz_stringify __argz_next])
    fi
    AC_SUBST(MKINSTALLDIRS)
 
-#   dnl *** For now the libtool support in intl/Makefile is not for real.
-#   l=
-#   AC_SUBST(l)
-
    dnl Generate list of files to be processed by xgettext which will
    dnl be included in po/Makefile.
    test -d po || mkdir po
@@ -342,3 +282,82 @@ strdup __argz_count __argz_stringify __argz_next])
        < $srcdir/po/POTFILES.in > po/POTFILES
   ])
 
+
+dnl @synopsis AC_FUNC_VSNPRINTF_C99
+dnl
+dnl Check whether there is a vsnprintf() function with C99 semantics installed.
+dnl
+AC_DEFUN([AC_FUNC_VSNPRINTF_C99],
+[AC_CACHE_CHECK(for C99 vsnprintf,
+  ac_cv_func_vsnprintf_c99,
+[AC_TRY_RUN(
+[#include <stdio.h>
+#include <stdarg.h>
+
+int
+doit(char * s, ...)
+{
+  char buffer[32];
+  va_list args;
+  int r;
+
+  va_start(args, s);
+  r = vsnprintf(buffer, 5, s, args);
+  va_end(args);
+
+  if (r != 7)
+    exit(1);
+
+  exit(0);
+}
+
+int
+main(void)
+{
+  doit("1234567");
+  exit(1);
+}], ac_cv_func_vsnprintf_c99=yes, ac_cv_func_vsnprintf_c99=no, ac_cv_func_vsnprintf_c99=no)])
+dnl Note that the default is to be pessimistic in the case of cross compilation.
+dnl If you know that the target has a C99 vsnprintf(), you can get around this
+dnl by setting ac_func_vsnprintf_c99 to yes, as described in the Autoconf manual.
+if test $ac_cv_func_vsnprintf_c99 = yes; then
+  AC_DEFINE(HAVE_C99_VSNPRINTF, 1,
+            [Define if you have a version of the vsnprintf function
+             with semantics as specified by the ISO C99 standard.])
+fi
+])# AC_FUNC_VSNPRINTF_C99
+
+
+dnl @synopsis AC_FUNC_PRINTF_UNIX98
+dnl
+dnl Check whether the printf() family supports Unix98 %n$ positional parameters 
+dnl
+AC_DEFUN([AC_FUNC_PRINTF_UNIX98],
+[AC_CACHE_CHECK(whether printf supports positional parameters,
+  ac_cv_func_printf_unix98,
+[AC_TRY_RUN(
+[#include <stdio.h>
+
+int
+main (void)
+{
+  char buffer[128];
+
+  sprintf (buffer, "%2\$d %3\$d %1\$d", 1, 2, 3);
+  if (strcmp ("2 3 1", buffer) == 0)
+    exit (0);
+  exit (1);
+}], ac_cv_func_printf_unix98=yes, ac_cv_func_printf_unix98=no, ac_cv_func_printf_unix98=no)])
+dnl Note that the default is to be pessimistic in the case of cross compilation.
+dnl If you know that the target printf() supports positional parameters, you can get around 
+dnl this by setting ac_func_printf_unix98 to yes, as described in the Autoconf manual.
+if test $ac_cv_func_printf_unix98 = yes; then
+  AC_DEFINE(HAVE_UNIX98_PRINTF, 1,
+            [Define if your printf function family supports positional parameters
+             as specified by Unix98.])
+fi
+])# AC_FUNC_PRINTF_UNIX98
+
+
+
+