From b6ee20a97a58f1f4cadd3a292532cf2673f6b26a Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Sat, 14 Jun 2008 15:06:19 +0200 Subject: [PATCH] Fix various problems in 'obstack-printf' module. --- ChangeLog | 13 ++++ lib/obstack_printf.c | 8 +-- m4/obstack-printf-posix.m4 | 118 ++++++++++++++++++----------------- m4/obstack-printf.m4 | 5 +- modules/obstack-printf | 2 +- modules/obstack-printf-posix | 2 +- 6 files changed, 85 insertions(+), 63 deletions(-) diff --git a/ChangeLog b/ChangeLog index caaef9a01f..f82c9442e5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2008-06-14 Bruno Haible + + * lib/obstack_printf.c (obstack_vprintf): Define the stack-allocated + array size as a constant, not as a const variable. + * m4/obstack-printf.m4 (gl_FUNC_OBSTACK_PRINTF): Require + AC_USE_SYSTEM_EXTENSIONS. + * m4/obstack-printf-posix.m4 (gl_FUNC_OBSTACK_PRINTF_POSIX): Likewise. + Test whether the obstack_printf function actually exists. + * modules/obstack-printf (Depends-on): Add extensions. + (Include): Remove obstack.h. + * modules/obstack-printf-posix (Depends-on): Add extensions. + (Include): Remove obstack.h. + 2008-06-13 Eric Blake Add obstack-printf and obstack-printf-posix modules. diff --git a/lib/obstack_printf.c b/lib/obstack_printf.c index f546f006b9..c2d0b50646 100644 --- a/lib/obstack_printf.c +++ b/lib/obstack_printf.c @@ -58,16 +58,16 @@ obstack_vprintf (struct obstack *obs, const char *format, va_list args) stack-allocated buffer and copy, to reduce the likelihood of a small-size malloc. Otherwise, print directly into the obstack. */ - const size_t cutoff = 1024; - char buf[cutoff]; + enum { CUTOFF = 1024 }; + char buf[CUTOFF]; char *base = obstack_next_free (obs); size_t len = obstack_room (obs); char *str; - if (len < cutoff) + if (len < CUTOFF) { base = buf; - len = cutoff; + len = CUTOFF; } str = vasnprintf (base, &len, format, args); if (!str) diff --git a/m4/obstack-printf-posix.m4 b/m4/obstack-printf-posix.m4 index b5678b48a2..5fa740f5ad 100644 --- a/m4/obstack-printf-posix.m4 +++ b/m4/obstack-printf-posix.m4 @@ -1,4 +1,4 @@ -# obstack-printf-posix.m4 serial 1 +# obstack-printf-posix.m4 serial 2 dnl Copyright (C) 2008 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -6,6 +6,9 @@ dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_OBSTACK_PRINTF_POSIX], [ + dnl Persuade glibc to declare obstack_printf(), obstack_vprintf(). + AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) + AC_REQUIRE([gl_PRINTF_SIZES_C99]) AC_REQUIRE([gl_PRINTF_LONG_DOUBLE]) AC_REQUIRE([gl_PRINTF_INFINITE]) @@ -20,61 +23,64 @@ AC_DEFUN([gl_FUNC_OBSTACK_PRINTF_POSIX], AC_REQUIRE([gl_PRINTF_PRECISION]) AC_REQUIRE([gl_PRINTF_ENOMEM]) gl_cv_func_obstack_printf_posix=no - case "$gl_cv_func_printf_sizes_c99" in - *yes) - case "$gl_cv_func_printf_long_double" in - *yes) - case "$gl_cv_func_printf_infinite" in - *yes) - case "$gl_cv_func_printf_infinite_long_double" in - *yes) - case "$gl_cv_func_printf_directive_a" in - *yes) - case "$gl_cv_func_printf_directive_f" in - *yes) - case "$gl_cv_func_printf_directive_n" in - *yes) - case "$gl_cv_func_printf_positions" in - *yes) - case "$gl_cv_func_printf_flag_grouping" in - *yes) - case "$gl_cv_func_printf_flag_leftadjust" in - *yes) - case "$gl_cv_func_printf_flag_zero" in - *yes) - case "$gl_cv_func_printf_precision" in - *yes) - case "$gl_cv_func_printf_enomem" in - *yes) - # obstack_printf exists and is - # already POSIX compliant. - gl_cv_func_obstack_printf_posix= yes - ;; - esac - ;; - esac - ;; - esac - ;; - esac - ;; - esac - ;; - esac - ;; - esac - ;; - esac - ;; - esac - ;; - esac - ;; - esac - ;; - esac - ;; - esac + AC_CHECK_FUNCS_ONCE([obstack_printf]) + if test $ac_cv_func_obstack_printf = yes ; then + case "$gl_cv_func_printf_sizes_c99" in + *yes) + case "$gl_cv_func_printf_long_double" in + *yes) + case "$gl_cv_func_printf_infinite" in + *yes) + case "$gl_cv_func_printf_infinite_long_double" in + *yes) + case "$gl_cv_func_printf_directive_a" in + *yes) + case "$gl_cv_func_printf_directive_f" in + *yes) + case "$gl_cv_func_printf_directive_n" in + *yes) + case "$gl_cv_func_printf_positions" in + *yes) + case "$gl_cv_func_printf_flag_grouping" in + *yes) + case "$gl_cv_func_printf_flag_leftadjust" in + *yes) + case "$gl_cv_func_printf_flag_zero" in + *yes) + case "$gl_cv_func_printf_precision" in + *yes) + case "$gl_cv_func_printf_enomem" in + *yes) + # obstack_printf exists and is + # already POSIX compliant. + gl_cv_func_obstack_printf_posix= yes + ;; + esac + ;; + esac + ;; + esac + ;; + esac + ;; + esac + ;; + esac + ;; + esac + ;; + esac + ;; + esac + ;; + esac + ;; + esac + ;; + esac + ;; + esac + fi if test $gl_cv_func_obstack_printf_posix = no; then gl_PREREQ_VASNPRINTF_LONG_DOUBLE gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE diff --git a/m4/obstack-printf.m4 b/m4/obstack-printf.m4 index 98860c2e66..969d62027c 100644 --- a/m4/obstack-printf.m4 +++ b/m4/obstack-printf.m4 @@ -1,4 +1,4 @@ -# obstack-printf.m4 serial 1 +# obstack-printf.m4 serial 2 dnl Copyright (C) 2008 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -10,6 +10,9 @@ dnl obstack_vprintf behaves identically, so we only test for one. AC_DEFUN([gl_FUNC_OBSTACK_PRINTF], [ + dnl Persuade glibc to declare obstack_printf(), obstack_vprintf(). + AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS]) + AC_REQUIRE([gl_STDIO_H_DEFAULTS]) AC_CHECK_FUNCS_ONCE([obstack_printf]) if test $ac_cv_func_obstack_printf = no ; then diff --git a/modules/obstack-printf b/modules/obstack-printf index 44414b7fa1..3604ce29bc 100644 --- a/modules/obstack-printf +++ b/modules/obstack-printf @@ -9,6 +9,7 @@ Depends-on: obstack stdio vasnprintf +extensions configure.ac: gl_FUNC_OBSTACK_PRINTF @@ -17,7 +18,6 @@ gl_STDIO_MODULE_INDICATOR([obstack-printf]) Makefile.am: Include: -"obstack.h" License: diff --git a/modules/obstack-printf-posix b/modules/obstack-printf-posix index e4c595b489..eb7bef530f 100644 --- a/modules/obstack-printf-posix +++ b/modules/obstack-printf-posix @@ -10,6 +10,7 @@ Depends-on: obstack stdio vasnprintf-posix +extensions configure.ac: gl_FUNC_OBSTACK_PRINTF_POSIX @@ -18,7 +19,6 @@ gl_STDIO_MODULE_INDICATOR([obstack-printf-posix]) Makefile.am: Include: -"obstack.h" License: -- 2.30.2