From 3c51de64fe4d5b699d231a3db56dd8441dfe0646 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Mon, 28 Jul 2003 23:00:05 +0000 Subject: [PATCH] Integrate gnulib vasnprintf(). --- ChangeLog | 24 ++ ChangeLog.pre-2-10 | 24 ++ ChangeLog.pre-2-12 | 24 ++ ChangeLog.pre-2-4 | 24 ++ ChangeLog.pre-2-6 | 24 ++ ChangeLog.pre-2-8 | 24 ++ acinclude.m4 | 296 ++++++++++++++++++++++ configure.in | 60 +++-- docs/reference/ChangeLog | 6 + docs/reference/glib/glib-sections.txt | 3 + docs/reference/glib/tmpl/macros_misc.sgml | 54 +++- glib/Makefile.am | 12 +- glib/gprintfint.h | 21 +- tests/printf-test.c | 14 +- 14 files changed, 571 insertions(+), 39 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1e32938bb..5330adae3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,27 @@ +2003-07-29 Matthias Clasen + + Replace trio printf() by gnulib vasnprintf(): (#101874) + + * configure.in: Define HAVE_LONG_LONG_FORMAT if system printf understands %llu; rename enable_trio to + enable_included_printf; add misc. tests needed for gnulib vasnprintf(); define G_GINT{16,32,64}_MODIFIER + in glibconfig.h. + + * acinclude.m4: Misc tests needed for gnulib vasnprintf(): AC_FUNC_SNPRINTF_C99, bh_C_SIGNED, jm_AC_TYPE_LONG_LONG, + gt_TYPE_LONGDOUBLE, gt_TYPE_WCHAR_T, gt_TYPE_WINT_T, gt_AC_TYPE_INTMAX_T, jm_AC_HEADER_STDINT_H, + jm_AC_HEADER_INTTYPES_H. + + * glib/Makefile.am: Replace TRIO_SUBDIR by PRINTF_SUBDIR and trio_libtrio_la by printf_la. + + * glib/gprintfint.h: Include gnulib/printf.h and use _g_gnulib_ functions instead of _g_trio_ functions. + + * glib/trio/*: Removed + + * glib/gnulib/*: vasnprintf() implementation from gnulib, patched to live in the _g_gnulib namespace, use + g_malloc instead of malloc, and support long long printing even if system printf doesn't. For more details, + see glib/gnulib/README. + + * tests/printf-test.c: Add tests for 64 bit printing. + 2003-07-28 Matthias Clasen * glib/gfileutils.h: diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 1e32938bb..5330adae3 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,27 @@ +2003-07-29 Matthias Clasen + + Replace trio printf() by gnulib vasnprintf(): (#101874) + + * configure.in: Define HAVE_LONG_LONG_FORMAT if system printf understands %llu; rename enable_trio to + enable_included_printf; add misc. tests needed for gnulib vasnprintf(); define G_GINT{16,32,64}_MODIFIER + in glibconfig.h. + + * acinclude.m4: Misc tests needed for gnulib vasnprintf(): AC_FUNC_SNPRINTF_C99, bh_C_SIGNED, jm_AC_TYPE_LONG_LONG, + gt_TYPE_LONGDOUBLE, gt_TYPE_WCHAR_T, gt_TYPE_WINT_T, gt_AC_TYPE_INTMAX_T, jm_AC_HEADER_STDINT_H, + jm_AC_HEADER_INTTYPES_H. + + * glib/Makefile.am: Replace TRIO_SUBDIR by PRINTF_SUBDIR and trio_libtrio_la by printf_la. + + * glib/gprintfint.h: Include gnulib/printf.h and use _g_gnulib_ functions instead of _g_trio_ functions. + + * glib/trio/*: Removed + + * glib/gnulib/*: vasnprintf() implementation from gnulib, patched to live in the _g_gnulib namespace, use + g_malloc instead of malloc, and support long long printing even if system printf doesn't. For more details, + see glib/gnulib/README. + + * tests/printf-test.c: Add tests for 64 bit printing. + 2003-07-28 Matthias Clasen * glib/gfileutils.h: diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index 1e32938bb..5330adae3 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,27 @@ +2003-07-29 Matthias Clasen + + Replace trio printf() by gnulib vasnprintf(): (#101874) + + * configure.in: Define HAVE_LONG_LONG_FORMAT if system printf understands %llu; rename enable_trio to + enable_included_printf; add misc. tests needed for gnulib vasnprintf(); define G_GINT{16,32,64}_MODIFIER + in glibconfig.h. + + * acinclude.m4: Misc tests needed for gnulib vasnprintf(): AC_FUNC_SNPRINTF_C99, bh_C_SIGNED, jm_AC_TYPE_LONG_LONG, + gt_TYPE_LONGDOUBLE, gt_TYPE_WCHAR_T, gt_TYPE_WINT_T, gt_AC_TYPE_INTMAX_T, jm_AC_HEADER_STDINT_H, + jm_AC_HEADER_INTTYPES_H. + + * glib/Makefile.am: Replace TRIO_SUBDIR by PRINTF_SUBDIR and trio_libtrio_la by printf_la. + + * glib/gprintfint.h: Include gnulib/printf.h and use _g_gnulib_ functions instead of _g_trio_ functions. + + * glib/trio/*: Removed + + * glib/gnulib/*: vasnprintf() implementation from gnulib, patched to live in the _g_gnulib namespace, use + g_malloc instead of malloc, and support long long printing even if system printf doesn't. For more details, + see glib/gnulib/README. + + * tests/printf-test.c: Add tests for 64 bit printing. + 2003-07-28 Matthias Clasen * glib/gfileutils.h: diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 1e32938bb..5330adae3 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,27 @@ +2003-07-29 Matthias Clasen + + Replace trio printf() by gnulib vasnprintf(): (#101874) + + * configure.in: Define HAVE_LONG_LONG_FORMAT if system printf understands %llu; rename enable_trio to + enable_included_printf; add misc. tests needed for gnulib vasnprintf(); define G_GINT{16,32,64}_MODIFIER + in glibconfig.h. + + * acinclude.m4: Misc tests needed for gnulib vasnprintf(): AC_FUNC_SNPRINTF_C99, bh_C_SIGNED, jm_AC_TYPE_LONG_LONG, + gt_TYPE_LONGDOUBLE, gt_TYPE_WCHAR_T, gt_TYPE_WINT_T, gt_AC_TYPE_INTMAX_T, jm_AC_HEADER_STDINT_H, + jm_AC_HEADER_INTTYPES_H. + + * glib/Makefile.am: Replace TRIO_SUBDIR by PRINTF_SUBDIR and trio_libtrio_la by printf_la. + + * glib/gprintfint.h: Include gnulib/printf.h and use _g_gnulib_ functions instead of _g_trio_ functions. + + * glib/trio/*: Removed + + * glib/gnulib/*: vasnprintf() implementation from gnulib, patched to live in the _g_gnulib namespace, use + g_malloc instead of malloc, and support long long printing even if system printf doesn't. For more details, + see glib/gnulib/README. + + * tests/printf-test.c: Add tests for 64 bit printing. + 2003-07-28 Matthias Clasen * glib/gfileutils.h: diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 1e32938bb..5330adae3 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,27 @@ +2003-07-29 Matthias Clasen + + Replace trio printf() by gnulib vasnprintf(): (#101874) + + * configure.in: Define HAVE_LONG_LONG_FORMAT if system printf understands %llu; rename enable_trio to + enable_included_printf; add misc. tests needed for gnulib vasnprintf(); define G_GINT{16,32,64}_MODIFIER + in glibconfig.h. + + * acinclude.m4: Misc tests needed for gnulib vasnprintf(): AC_FUNC_SNPRINTF_C99, bh_C_SIGNED, jm_AC_TYPE_LONG_LONG, + gt_TYPE_LONGDOUBLE, gt_TYPE_WCHAR_T, gt_TYPE_WINT_T, gt_AC_TYPE_INTMAX_T, jm_AC_HEADER_STDINT_H, + jm_AC_HEADER_INTTYPES_H. + + * glib/Makefile.am: Replace TRIO_SUBDIR by PRINTF_SUBDIR and trio_libtrio_la by printf_la. + + * glib/gprintfint.h: Include gnulib/printf.h and use _g_gnulib_ functions instead of _g_trio_ functions. + + * glib/trio/*: Removed + + * glib/gnulib/*: vasnprintf() implementation from gnulib, patched to live in the _g_gnulib namespace, use + g_malloc instead of malloc, and support long long printing even if system printf doesn't. For more details, + see glib/gnulib/README. + + * tests/printf-test.c: Add tests for 64 bit printing. + 2003-07-28 Matthias Clasen * glib/gfileutils.h: diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 1e32938bb..5330adae3 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,27 @@ +2003-07-29 Matthias Clasen + + Replace trio printf() by gnulib vasnprintf(): (#101874) + + * configure.in: Define HAVE_LONG_LONG_FORMAT if system printf understands %llu; rename enable_trio to + enable_included_printf; add misc. tests needed for gnulib vasnprintf(); define G_GINT{16,32,64}_MODIFIER + in glibconfig.h. + + * acinclude.m4: Misc tests needed for gnulib vasnprintf(): AC_FUNC_SNPRINTF_C99, bh_C_SIGNED, jm_AC_TYPE_LONG_LONG, + gt_TYPE_LONGDOUBLE, gt_TYPE_WCHAR_T, gt_TYPE_WINT_T, gt_AC_TYPE_INTMAX_T, jm_AC_HEADER_STDINT_H, + jm_AC_HEADER_INTTYPES_H. + + * glib/Makefile.am: Replace TRIO_SUBDIR by PRINTF_SUBDIR and trio_libtrio_la by printf_la. + + * glib/gprintfint.h: Include gnulib/printf.h and use _g_gnulib_ functions instead of _g_trio_ functions. + + * glib/trio/*: Removed + + * glib/gnulib/*: vasnprintf() implementation from gnulib, patched to live in the _g_gnulib namespace, use + g_malloc instead of malloc, and support long long printing even if system printf doesn't. For more details, + see glib/gnulib/README. + + * tests/printf-test.c: Add tests for 64 bit printing. + 2003-07-28 Matthias Clasen * glib/gfileutils.h: diff --git a/acinclude.m4 b/acinclude.m4 index 1e7207690..ed90b97fa 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -43,6 +43,49 @@ fi ])# AC_FUNC_VSNPRINTF_C99 +dnl @synopsis AC_FUNC_SNPRINTF_C99 +dnl +dnl Check whether there is a snprintf() function with C99 semantics installed. +dnl +AC_DEFUN([AC_FUNC_SNPRINTF_C99], +[AC_CACHE_CHECK(for C99 snprintf, + ac_cv_func_snprintf_c99, +[AC_TRY_RUN( +[#include +#include + +int +doit() +{ + char buffer[32]; + va_list args; + int r; + + r = snprintf(buffer, 5, "1234567"); + + if (r != 7) + exit(1); + + exit(0); +} + +int +main(void) +{ + doit(); + exit(1); +}], ac_cv_func_snprintf_c99=yes, ac_cv_func_snprintf_c99=no, ac_cv_func_snprintf_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 snprintf(), you can get around this +dnl by setting ac_func_snprintf_c99 to yes, as described in the Autoconf manual. +if test $ac_cv_func_snprintf_c99 = yes; then + AC_DEFINE(HAVE_C99_SNPRINTF, 1, + [Define if you have a version of the snprintf function + with semantics as specified by the ISO C99 standard.]) +fi +])# AC_FUNC_SNPRINTF_C99 + + dnl @synopsis AC_FUNC_PRINTF_UNIX98 dnl dnl Check whether the printf() family supports Unix98 %n$ positional parameters @@ -121,4 +164,257 @@ AC_DEFUN([JH_CHECK_XML_CATALOG], ]) +# signed.m4 serial 1 (gettext-0.10.40) +dnl Copyright (C) 2001-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +AC_DEFUN([bh_C_SIGNED], +[ + AC_CACHE_CHECK([for signed], bh_cv_c_signed, + [AC_TRY_COMPILE(, [signed char x;], bh_cv_c_signed=yes, bh_cv_c_signed=no)]) + if test $bh_cv_c_signed = no; then + AC_DEFINE(signed, , + [Define to empty if the C compiler doesn't support this keyword.]) + fi +]) + + +# longlong.m4 serial 4 +dnl Copyright (C) 1999-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Paul Eggert. + +# Define HAVE_LONG_LONG if 'long long' works. + +AC_DEFUN([jm_AC_TYPE_LONG_LONG], +[ + AC_CACHE_CHECK([for long long], ac_cv_type_long_long, + [AC_TRY_LINK([long long ll = 1LL; int i = 63;], + [long long llmax = (long long) -1; + return ll << i | ll >> i | llmax / ll | llmax % ll;], + ac_cv_type_long_long=yes, + ac_cv_type_long_long=no)]) + if test $ac_cv_type_long_long = yes; then + AC_DEFINE(HAVE_LONG_LONG, 1, + [Define if you have the 'long long' type.]) + fi +]) + + +# longdouble.m4 serial 1 (gettext-0.11.6) +dnl Copyright (C) 2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. +dnl Test whether the compiler supports the 'long double' type. +dnl Prerequisite: AC_PROG_CC + +AC_DEFUN([gt_TYPE_LONGDOUBLE], +[ + AC_CACHE_CHECK([for long double], gt_cv_c_long_double, + [if test "$GCC" = yes; then + gt_cv_c_long_double=yes + else + AC_TRY_COMPILE([ + /* The Stardent Vistra knows sizeof(long double), but does not support it. */ + long double foo = 0.0; + /* On Ultrix 4.3 cc, long double is 4 and double is 8. */ + int array [2*(sizeof(long double) >= sizeof(double)) - 1]; + ], , + gt_cv_c_long_double=yes, gt_cv_c_long_double=no) + fi]) + if test $gt_cv_c_long_double = yes; then + AC_DEFINE(HAVE_LONG_DOUBLE, 1, [Define if you have the 'long double' type.]) + fi +]) + + + +# wchar_t.m4 serial 1 (gettext-0.11.6) +dnl Copyright (C) 2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. +dnl Test whether has the 'wchar_t' type. +dnl Prerequisite: AC_PROG_CC + +AC_DEFUN([gt_TYPE_WCHAR_T], +[ + AC_CACHE_CHECK([for wchar_t], gt_cv_c_wchar_t, + [AC_TRY_COMPILE([#include + wchar_t foo = (wchar_t)'\0';], , + gt_cv_c_wchar_t=yes, gt_cv_c_wchar_t=no)]) + if test $gt_cv_c_wchar_t = yes; then + AC_DEFINE(HAVE_WCHAR_T, 1, [Define if you have the 'wchar_t' type.]) + fi +]) + + +# wint_t.m4 serial 1 +dnl Copyright (C) 2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. +dnl Test whether has the 'wint_t' type. +dnl Prerequisite: AC_PROG_CC + +AC_DEFUN([gt_TYPE_WINT_T], +[ + AC_CACHE_CHECK([for wint_t], gt_cv_c_wint_t, + [AC_TRY_COMPILE([#include + wint_t foo = (wchar_t)'\0';], , + gt_cv_c_wint_t=yes, gt_cv_c_wint_t=no)]) + if test $gt_cv_c_wint_t = yes; then + AC_DEFINE(HAVE_WINT_T, 1, [Define if you have the 'wint_t' type.]) + fi +]) + + +# intmax_t.m4 serial 1 +dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Paul Eggert. + +AC_PREREQ(2.13) + +# Define intmax_t to 'long' or 'long long' +# if it is not already defined in or . + +AC_DEFUN([jm_AC_TYPE_INTMAX_T], +[ + dnl For simplicity, we assume that a header file defines 'intmax_t' if and + dnl only if it defines 'uintmax_t'. + AC_REQUIRE([jm_AC_HEADER_INTTYPES_H]) + AC_REQUIRE([jm_AC_HEADER_STDINT_H]) + if test $jm_ac_cv_header_inttypes_h = no && test $jm_ac_cv_header_stdint_h = no; then + AC_REQUIRE([jm_AC_TYPE_LONG_LONG]) + test $ac_cv_type_long_long = yes \ + && ac_type='long long' \ + || ac_type='long' + AC_DEFINE_UNQUOTED(intmax_t, $ac_type, + [Define to long or long long if and don't define.]) + else + AC_DEFINE(HAVE_INTMAX_T, 1, + [Define if you have the 'intmax_t' type in or .]) + fi +]) + +dnl An alternative would be to explicitly test for 'intmax_t'. + +AC_DEFUN([gt_AC_TYPE_INTMAX_T], +[ + AC_REQUIRE([jm_AC_HEADER_INTTYPES_H]) + AC_REQUIRE([jm_AC_HEADER_STDINT_H]) + AC_CACHE_CHECK(for intmax_t, gt_cv_c_intmax_t, + [AC_TRY_COMPILE([ +#include +#include +#if HAVE_STDINT_H_WITH_UINTMAX +#include +#endif +#if HAVE_INTTYPES_H_WITH_UINTMAX +#include +#endif +], [intmax_t x = -1;], gt_cv_c_intmax_t=yes, gt_cv_c_intmax_t=no)]) + if test $gt_cv_c_intmax_t = yes; then + AC_DEFINE(HAVE_INTMAX_T, 1, + [Define if you have the 'intmax_t' type in or .]) + else + AC_REQUIRE([jm_AC_TYPE_LONG_LONG]) + test $ac_cv_type_long_long = yes \ + && ac_type='long long' \ + || ac_type='long' + AC_DEFINE_UNQUOTED(intmax_t, $ac_type, + [Define to long or long long if and don't define.]) + fi +]) + + +# stdint_h.m4 serial 3 (gettext-0.11.6) +dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Paul Eggert. + +# Define HAVE_STDINT_H_WITH_UINTMAX if exists, +# doesn't clash with , and declares uintmax_t. + +AC_DEFUN([jm_AC_HEADER_STDINT_H], +[ + AC_CACHE_CHECK([for stdint.h], jm_ac_cv_header_stdint_h, + [AC_TRY_COMPILE( + [#include +#include ], + [uintmax_t i = (uintmax_t) -1;], + jm_ac_cv_header_stdint_h=yes, + jm_ac_cv_header_stdint_h=no)]) + if test $jm_ac_cv_header_stdint_h = yes; then + AC_DEFINE_UNQUOTED(HAVE_STDINT_H_WITH_UINTMAX, 1, + [Define if exists, doesn't clash with , + and declares uintmax_t. ]) + fi +]) + + +# inttypes_h.m4 serial 5 (gettext-0.11.6) +dnl Copyright (C) 1997-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Paul Eggert. + +# Define HAVE_INTTYPES_H_WITH_UINTMAX if exists, +# doesn't clash with , and declares uintmax_t. + +AC_DEFUN([jm_AC_HEADER_INTTYPES_H], +[ + AC_CACHE_CHECK([for inttypes.h], jm_ac_cv_header_inttypes_h, + [AC_TRY_COMPILE( + [#include +#include ], + [uintmax_t i = (uintmax_t) -1;], + jm_ac_cv_header_inttypes_h=yes, + jm_ac_cv_header_inttypes_h=no)]) + if test $jm_ac_cv_header_inttypes_h = yes; then + AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H_WITH_UINTMAX, 1, + [Define if exists, doesn't clash with , + and declares uintmax_t. ]) + fi +]) + diff --git a/configure.in b/configure.in index c91dfe1d0..e8abad698 100644 --- a/configure.in +++ b/configure.in @@ -516,6 +516,7 @@ if test x$ac_cv_sizeof_long_long = x8; then done]) if test -n "$glib_cv_long_long_format"; then AC_MSG_RESULT(%${glib_cv_long_long_format}u) + AC_DEFINE(HAVE_LONG_LONG_FORMAT,1,[define if system printf can print long long]) else AC_MSG_RESULT(none) fi @@ -525,6 +526,7 @@ elif test x$ac_cv_sizeof___int64 = x8; then # We know this is MSVC, and what the formats are glib_cv_long_long_format=I64 AC_MSG_RESULT(%${glib_cv_long_long_format}u) + AC_DEFINE(HAVE_LONG_LONG_FORMAT,1,[define if system printf can print long long]) fi dnl long doubles were not used, and a portability problem @@ -733,51 +735,60 @@ AC_FUNC_VSNPRINTF_C99 AC_FUNC_PRINTF_UNIX98 # -# Check whether to use trio printf +# Check whether to use an included printf # AC_ARG_ENABLE(included-printf, [AC_HELP_STRING([--enable-included-printf], [use included printf [default=auto]])], - enable_trio="$enableval") + enable_included_printf="$enableval") -need_trio=no -if test "x$enable_trio" = "xyes" ; then - need_trio=yes +need_included_printf=no +if test "x$enable_included_printf" = "xyes" ; then + need_included_printf=yes fi if test "$ac_cv_func_vsnprintf_c99" != "yes" ; then - need_trio=yes + need_included_printf=yes fi if test "$ac_cv_func_printf_unix98" != "yes" ; then - need_trio=yes + need_included_printf=yes fi if test "x$ac_cv_sizeof_long_long" = "x8" && test -z "$glib_cv_long_long_format" ; then - need_trio=yes + need_included_printf=yes fi -if test "x$enable_trio" = "xno" && - test "x$need_trio" = "xyes" ; then +if test "x$enable_included_printf" = "xno" && + test "x$need_included_printf" = "xyes" ; then AC_MSG_ERROR([ *** Your C library's printf doesn't appear to have the features that *** GLib needs, but you specified --enable-included-printf=no.]) fi -enable_trio=$need_trio +enable_included_printf=$need_included_printf -AM_CONDITIONAL(HAVE_GOOD_PRINTF, test "$enable_trio" != "yes") -if test "$enable_trio" != "yes" ; then +AM_CONDITIONAL(HAVE_GOOD_PRINTF, test "$enable_included_printf" != "yes") +if test "$enable_included_printf" != "yes" ; then AC_DEFINE(HAVE_GOOD_PRINTF,1,[define to use system printf]) else glib_cv_long_long_format="ll" AC_DEFINE(HAVE_VASPRINTF,1) AC_DEFINE(HAVE_C99_VSNPRINTF,1) + AC_DEFINE(HAVE_C99_SNPRINTF,1) AC_DEFINE(HAVE_UNIX98_PRINTF,1) - if test "$glib_native_win32" != "yes" ; then - TRIO_LIBS=-lm - fi fi -AC_SUBST(TRIO_LIBS) + +# Checks needed for gnulib vasnprintf +bh_C_SIGNED +jm_AC_TYPE_LONG_LONG +gt_TYPE_LONGDOUBLE +gt_TYPE_WCHAR_T +gt_TYPE_WINT_T +AC_TYPE_SIZE_T +AC_CHECK_TYPES(ptrdiff_t) +jm_AC_TYPE_INTMAX_T +AC_CHECK_FUNCS(snprintf) +AC_FUNC_SNPRINTF_C99 # Check if bcopy can be used for overlapping copies, if memmove isn't found. # The check is borrowed from the PERL Configure script. @@ -2011,6 +2022,7 @@ _______EOF cat >>$outfile <<_______EOF typedef signed $gint16 gint16; typedef unsigned $gint16 guint16; +#define G_GINT16_MODIFIER $gint16_modifier #define G_GINT16_FORMAT $gint16_format #define G_GUINT16_FORMAT $guint16_format _______EOF @@ -2021,6 +2033,7 @@ _______EOF cat >>$outfile <<_______EOF typedef signed $gint32 gint32; typedef unsigned $gint32 guint32; +#define G_GINT32_MODIFIER $gint32_modifier #define G_GINT32_FORMAT $gint32_format #define G_GUINT32_FORMAT $guint32_format _______EOF @@ -2037,11 +2050,13 @@ _______EOF if test x$gint64_format != x ; then cat >>$outfile <<_______EOF +#define G_GINT64_MODIFIER $gint64_modifier #define G_GINT64_FORMAT $gint64_format #define G_GUINT64_FORMAT $guint64_format _______EOF else cat >>$outfile <<_______EOF +#undef G_GINT64_MODIFIER #undef G_GINT64_FORMAT #undef G_GUINT64_FORMAT _______EOF @@ -2294,11 +2309,13 @@ fi case 2 in $ac_cv_sizeof_short) gint16=short + gint16_modifier='"h"' gint16_format='"hi"' guint16_format='"hu"' ;; $ac_cv_sizeof_int) gint16=int + gint16_modifier='""' gint16_format='"i"' guint16_format='"u"' ;; @@ -2306,16 +2323,19 @@ esac case 4 in $ac_cv_sizeof_short) gint32=short + gint32_modifier='"h"' gint32_format='"hi"' guint32_format='"hu"' ;; $ac_cv_sizeof_int) gint32=int + gint32_modifier='""' gint32_format='"i"' guint32_format='"u"' ;; $ac_cv_sizeof_long) gint32=long + gint32_modifier='"l"' gint32_format='"li"' guint32_format='"lu"' ;; @@ -2323,6 +2343,7 @@ esac case 8 in $ac_cv_sizeof_int) gint64=int + gint64_modifier='""' gint64_format='"i"' guint64_format='"u"' glib_extension= @@ -2330,6 +2351,7 @@ $ac_cv_sizeof_int) ;; $ac_cv_sizeof_long) gint64=long + gint64_modifier='"l"' gint64_format='"li"' guint64_format='"lu"' glib_extension= @@ -2338,6 +2360,7 @@ $ac_cv_sizeof_long) $ac_cv_sizeof_long_long) gint64='long long' if test -n "$glib_cv_long_long_format"; then + gint64_modifier='"'$glib_cv_long_long_format'"' gint64_format='"'$glib_cv_long_long_format'i"' guint64_format='"'$glib_cv_long_long_format'u"' fi @@ -2347,6 +2370,7 @@ $ac_cv_sizeof_long_long) $ac_cv_sizeof___int64) gint64='__int64' if test -n "$glib_cv_long_long_format"; then + gint64_modifier='"'$glib_cv_long_long_format'"' gint64_format='"'$glib_cv_long_long_format'i"' guint64_format='"'$glib_cv_long_long_format'u"' fi @@ -2511,7 +2535,7 @@ build/win32/Makefile build/win32/dirent/Makefile glib/Makefile glib/libcharset/Makefile -glib/trio/Makefile +glib/gnulib/Makefile gmodule/Makefile gmodule/gmoduleconf.h gobject/Makefile diff --git a/docs/reference/ChangeLog b/docs/reference/ChangeLog index 6e197bf2d..a934da1be 100644 --- a/docs/reference/ChangeLog +++ b/docs/reference/ChangeLog @@ -1,3 +1,9 @@ +2003-07-29 Matthias Clasen + + * glib/tmpl/macros_misc.sgml: Document G_GINT{16,32,64}_MODIFIER, add note about scanning. + + * glib/glib-sections.txt: Add G_GINT{16,32,64}_MODIFIER. + 2003-07-28 Matthias Clasen * glib/glib-sections.txt: Add g_setenv(), g_unsetenv() and g_read_link(). (#100763, #72545) diff --git a/docs/reference/glib/glib-sections.txt b/docs/reference/glib/glib-sections.txt index e2c22cc52..0e5ef3534 100644 --- a/docs/reference/glib/glib-sections.txt +++ b/docs/reference/glib/glib-sections.txt @@ -311,10 +311,13 @@ G_UNLIKELY G_STRLOC +G_GINT16_MODIFIER G_GINT16_FORMAT G_GUINT16_FORMAT +G_GINT32_MODIFIER G_GINT32_FORMAT G_GUINT32_FORMAT +G_GINT64_MODIFIER G_GINT64_FORMAT G_GUINT64_FORMAT diff --git a/docs/reference/glib/tmpl/macros_misc.sgml b/docs/reference/glib/tmpl/macros_misc.sgml index 272e4ffc1..d66ff4f59 100644 --- a/docs/reference/glib/tmpl/macros_misc.sgml +++ b/docs/reference/glib/tmpl/macros_misc.sgml @@ -286,6 +286,28 @@ Expands to a string identifying the current code position. + + +The platform dependent length modifier for constructing printf() conversion +specifiers for values of type #gint16. It is a string literal, but doesn't +include the percent-sign, such that you can add precision and length +modifiers between percent-sign and conversion specifier and append a +conversion specifier. + + + +The following example prints "0x7b"; + + +gint16 value = 123; +g_print ("%#" G_GINT16_MODIFIER "x", value); + + + + +@Since: 2.4 + + This is the platform dependent conversion specifier for scanning and @@ -316,6 +338,14 @@ printing values of type #guint16. See also #G_GINT16_FORMAT. + + +The platform dependent length modifier for constructing printf() conversion +specifiers for values of type #gint32. See also #G_GINT16_MODIFIER. + + +@Since: 2.4 + This is the platform dependent conversion specifier for scanning and @@ -332,6 +362,22 @@ printing values of type #guint32. See also #G_GINT16_FORMAT. + + +The platform dependent length modifier for constructing printf() conversion +specifiers for values of type #gint32. See also #G_GINT16_MODIFIER. + + + + +Some platforms do not support printing 64 bit integers, +even though the types are supported. On such platforms #G_GINT64_MODIFIER +is not defined. + + + +@Since: 2.4 + This is the platform dependent conversion specifier for scanning and @@ -342,7 +388,9 @@ printing values of type #gint64. See also #G_GINT16_FORMAT. Some platforms do not support scanning and printing 64 bit integers, even though the types are supported. On such platforms #G_GINT64_FORMAT -is not defined. +is not defined. Note that scanf() may not support 64 bit integers, even +if #G_GINT64_FORMAT is defined. Due to its weak error handling, scanf() is not +recommended for parsing anyway; consider using g_strtoull() instead. @@ -358,7 +406,9 @@ printing values of type #guint64. See also #G_GINT16_FORMAT. Some platforms do not support scanning and printing 64 bit integers, even though the types are supported. On such platforms #G_GUINT64_FORMAT -is not defined. +is not defined. Note that scanf() may not support 64 bit integers, even +if #G_GINT64_FORMAT is defined. Due to its weak error handling, scanf() is not +recommended for parsing anyway; consider using g_strtoull() instead. diff --git a/glib/Makefile.am b/glib/Makefile.am index 0462374c5..b6b390654 100644 --- a/glib/Makefile.am +++ b/glib/Makefile.am @@ -2,13 +2,13 @@ if HAVE_GOOD_PRINTF else -TRIO_SUBDIR = trio -trio_libtrio_la = trio/libtrio.la +PRINTF_SUBDIR = gnulib +printf_la = gnulib/libgnulib.la endif -SUBDIRS = libcharset $(TRIO_SUBDIR) +SUBDIRS = libcharset $(PRINTF_SUBDIR) -DIST_SUBDIRS = libcharset trio +DIST_SUBDIRS = libcharset gnulib INCLUDES = -I$(top_srcdir) -DG_LOG_DOMAIN=\"GLib\" \ $(GLIB_DEBUG_FLAGS) -DG_DISABLE_DEPRECATED -DGLIB_COMPILATION @@ -182,8 +182,8 @@ install-libtool-import-lib: uninstall-libtool-import-lib: endif -libglib_2_0_la_LIBADD = libcharset/libcharset.la $(trio_libtrio_la) $(GIO) $(GSPAWN) $(PLATFORMDEP) $(G_LIB_WIN32_RESOURCE) $(ICONV_LIBS) $(G_LIBS_EXTRA) -libglib_2_0_la_DEPENDENCIES = libcharset/libcharset.la $(trio_libtrio_la) $(GIO) $(GSPAWN) $(PLATFORMDEP) $(G_LIB_WIN32_RESOURCE) $(GLIB_DEF) +libglib_2_0_la_LIBADD = libcharset/libcharset.la $(printf_la) @GIO@ @GSPAWN@ @PLATFORMDEP@ @G_LIB_WIN32_RESOURCE@ @ICONV_LIBS@ @G_LIBS_EXTRA@ +libglib_2_0_la_DEPENDENCIES = libcharset/libcharset.la $(printf_la) @GIO@ @GSPAWN@ @PLATFORMDEP@ @G_LIB_WIN32_RESOURCE@ @GLIB_DEF@ libglib_2_0_la_LDFLAGS = \ -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ diff --git a/glib/gprintfint.h b/glib/gprintfint.h index d6762bbf8..103981b9c 100644 --- a/glib/gprintfint.h +++ b/glib/gprintfint.h @@ -43,20 +43,19 @@ #else -#include "trio/glibtrio.h" -#include "trio/trio.h" +#include "gnulib/printf.h" -#define _g_printf _g_trio_printf -#define _g_fprintf _g_trio_fprintf -#define _g_sprintf _g_trio_sprintf -#define _g_snprintf _g_trio_snprintf +#define _g_printf _g_gnulib_printf +#define _g_fprintf _g_gnulib_fprintf +#define _g_sprintf _g_gnulib_sprintf +#define _g_snprintf _g_gnulib_snprintf -#define _g_vprintf _g_trio_vprintf -#define _g_vfprintf _g_trio_vfprintf -#define _g_vsprintf _g_trio_vsprintf -#define _g_vsnprintf _g_trio_vsnprintf +#define _g_vprintf _g_gnulib_vprintf +#define _g_vfprintf _g_gnulib_vfprintf +#define _g_vsprintf _g_gnulib_vsprintf +#define _g_vsnprintf _g_gnulib_vsnprintf -#define _g_vasprintf _g_trio_vasprintf +#define _g_vasprintf _g_gnulib_vasprintf #endif diff --git a/tests/printf-test.c b/tests/printf-test.c index 90a08bff1..b5ac8b528 100644 --- a/tests/printf-test.c +++ b/tests/printf-test.c @@ -39,7 +39,7 @@ if (failed) \ else \ g_print ("(%s:%d) failed for: %s: (%s)\n", __FILE__, __LINE__, ( # cond ), message ? (gchar*)message : ""); \ fflush (stdout); \ - any_failed = TRUE; \ + any_failed; \ } \ } G_STMT_END @@ -52,8 +52,8 @@ main (int argc, char *argv[]) { gchar buf[128]; - long l; int i; + long l; /* truncation and return value */ TEST (NULL, g_snprintf (buf, 0, "abc") == 3); @@ -190,6 +190,16 @@ main (int argc, TEST (NULL, g_snprintf (buf, 128, "%1$*2$.*3$s", "abc", 5, 2) == 5 && !strcmp (buf, " ab")); TEST (NULL, g_snprintf (buf, 128, "%1$s%1$s", "abc") == 6 && !strcmp (buf, "abcabc")); + /* 64 bit support */ + TEST (NULL, g_snprintf (buf, 128, "%" G_GINT64_FORMAT, (gint64)123456) == 6 && !strcmp (buf, "123456")); + TEST (NULL, g_snprintf (buf, 128, "%" G_GINT64_FORMAT, (gint64)-123456) == 7 && !strcmp (buf, "-123456")); + TEST (NULL, g_snprintf (buf, 128, "%" G_GUINT64_FORMAT, (guint64)123456) == 6 && !strcmp (buf, "123456")); + TEST (NULL, g_snprintf (buf, 128, "%" G_GINT64_MODIFIER "o", (gint64)123456) == 6 && !strcmp (buf, "361100")); + TEST (NULL, g_snprintf (buf, 128, "%#" G_GINT64_MODIFIER "o", (gint64)123456) == 7 && !strcmp (buf, "0361100")); + TEST (NULL, g_snprintf (buf, 128, "%" G_GINT64_MODIFIER "x", (gint64)123456) == 5 && !strcmp (buf, "1e240")); + TEST (NULL, g_snprintf (buf, 128, "%#" G_GINT64_MODIFIER "x", (gint64)123456) == 7 && !strcmp (buf, "0x1e240")); + TEST (NULL, g_snprintf (buf, 128, "%" G_GINT64_MODIFIER "X", (gint64)123456) == 5 && !strcmp (buf, "1E240")); + return any_failed; }