# HG changeset patch # User Eric Blake # Date 1213360853 21600 # Node ID 3384541effec2e6ae57783c9e888446563c1c20e # Parent 93c97f09dc9ca17cd440a388263c22f5b5084187 Add obstack-printf and obstack-printf-posix modules. * modules/obstack-printf: New file. * modules/obstack-printf-posix: Likewise. * MODULES.html.sh (Misc): Mention them. * doc/glibc-functions/obstack_printf.texi (obstack_printf): Likewise. * doc/glibc-functions/obstack_vprintf.texi (obstack_vprintf): Likewise. * modules/stdio (Makefile.am): Accomodate new modules. * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Likewise. * lib/stdio.in.h (rpl_obstack_printf, rpl_obstack_vprintf): Declare. * lib/obstack_printf.c (obstack_printf, obstack_vprintf): New functions. * m4/obstack-printf.m4 (gl_OBSTACK_PRINTF) (gl_REPLACE_OBSTACK_PRINTF): New macros * m4/obstack-printf-posix.m4 (gl_OBSTACK_PRINTF_POSIX): Likewise. * tests/test-obstack-printf.c: New file. * modules/obstack-printf-tests: Likewise. * modules/obstack-printf-posix-tests: Likewise. Signed-off-by: Eric Blake diff -r 93c97f09dc9c -r 3384541effec ChangeLog --- a/ChangeLog Fri Jun 13 05:59:04 2008 -0700 +++ b/ChangeLog Fri Jun 13 06:40:53 2008 -0600 @@ -1,3 +1,26 @@ +2008-06-13 Eric Blake + + Add obstack-printf and obstack-printf-posix modules. + * modules/obstack-printf: New file. + * modules/obstack-printf-posix: Likewise. + * MODULES.html.sh (Misc): Mention them. + * doc/glibc-functions/obstack_printf.texi (obstack_printf): + Likewise. + * doc/glibc-functions/obstack_vprintf.texi (obstack_vprintf): + Likewise. + * modules/stdio (Makefile.am): Accomodate new modules. + * m4/stdio_h.m4 (gl_STDIO_H_DEFAULTS): Likewise. + * lib/stdio.in.h (rpl_obstack_printf, rpl_obstack_vprintf): + Declare. + * lib/obstack_printf.c (obstack_printf, obstack_vprintf): New + functions. + * m4/obstack-printf.m4 (gl_OBSTACK_PRINTF) + (gl_REPLACE_OBSTACK_PRINTF): New macros + * m4/obstack-printf-posix.m4 (gl_OBSTACK_PRINTF_POSIX): Likewise. + * tests/test-obstack-printf.c: New file. + * modules/obstack-printf-tests: Likewise. + * modules/obstack-printf-posix-tests: Likewise. + 2008-06-11 Bruno Haible * m4/open.m4 (gl_FUNC_OPEN): Add test against trailing slash bug. diff -r 93c97f09dc9c -r 3384541effec MODULES.html.sh --- a/MODULES.html.sh Fri Jun 13 05:59:04 2008 -0700 +++ b/MODULES.html.sh Fri Jun 13 06:40:53 2008 -0600 @@ -1845,6 +1845,8 @@ func_module linebuffer func_module memxor func_module obstack + func_module obstack-printf + func_module obstack-printf-posix func_module hash-pjw func_module hash func_module readline diff -r 93c97f09dc9c -r 3384541effec doc/glibc-functions/obstack_printf.texi --- a/doc/glibc-functions/obstack_printf.texi Fri Jun 13 05:59:04 2008 -0700 +++ b/doc/glibc-functions/obstack_printf.texi Fri Jun 13 06:40:53 2008 -0600 @@ -2,15 +2,63 @@ @subsection @code{obstack_printf} @findex obstack_printf -Gnulib module: --- +Gnulib module: obstack-printf or obstack-printf-posix -Portability problems fixed by Gnulib: -@itemize -@end itemize - -Portability problems not fixed by Gnulib: +Portability problems fixed by either Gnulib module +@code{obstack-printf} or @code{obstack-printf-posix}: @itemize @item This function is missing on all non-glibc platforms: MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS. @end itemize + +Portability problems fixed by Gnulib module @code{ostack-printf-posix}: +@itemize +@item +This function does not support size specifiers as in C99 (@code{hh}, @code{ll}, +@code{j}, @code{t}, @code{z}) on some platforms: +AIX 5.1, HP-UX 11.23, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin 2006, mingw, BeOS. +@item +printf of @samp{long double} numbers is unsupported on some platforms: +mingw, BeOS. +@item +printf @code{"%f"}, @code{"%e"}, @code{"%g"} of Infinity and NaN yields an +incorrect result on some platforms: +AIX 5.2, OSF/1 5.1, Solaris 10, mingw. +@item +This function does not support the @samp{a} and @samp{A} directives on some +platforms: +glibc-2.3.6, MacOS X 10.3, NetBSD 3.0, OpenBSD 4.0, AIX 5.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, BeOS. +@item +This function does not support the @samp{F} directive on some platforms: +NetBSD 3.0, AIX 5.1, HP-UX 11.23, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, BeOS. +@item +This function does not support format directives that access arguments in an +arbitrary order, such as @code{"%2$s"}, on some platforms: +NetBSD 3.0, mingw, BeOS. +@item +This function doesn't support the @code{'} flag on some platforms: +NetBSD 3.0, Cygwin 2006, mingw. +@item +This function behaves incorrectly when a @samp{-} flag and a negative width +are specified together, on some platforms: +HP-UX 10.20. +@item +printf @code{"%010f"} of NaN and Infinity yields an incorrect result (padded +with zeroes) on some platforms: +MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, AIX 5.2, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 2007, mingw. +@item +This function does not support precisions larger than 512 or 1024 in integer, +floating-point and pointer output on some platforms: +mingw, BeOS. +@item +This function can crash in out-of-memory conditions on some platforms: +MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0. +@item +This function does not fully support the @samp{n} directive on some platforms: +HP-UX 11, mingw. +@end itemize + +Portability problems not fixed by Gnulib: +@itemize +@end itemize diff -r 93c97f09dc9c -r 3384541effec doc/glibc-functions/obstack_vprintf.texi --- a/doc/glibc-functions/obstack_vprintf.texi Fri Jun 13 05:59:04 2008 -0700 +++ b/doc/glibc-functions/obstack_vprintf.texi Fri Jun 13 06:40:53 2008 -0600 @@ -2,15 +2,63 @@ @subsection @code{obstack_vprintf} @findex obstack_vprintf -Gnulib module: --- +Gnulib module: obstack-printf or obstack-printf-posix -Portability problems fixed by Gnulib: -@itemize -@end itemize - -Portability problems not fixed by Gnulib: +Portability problems fixed by either Gnulib module +@code{obstack-printf} or @code{obstack-printf-posix}: @itemize @item This function is missing on all non-glibc platforms: MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, Interix 3.5, BeOS. @end itemize + +Portability problems fixed by Gnulib module @code{ostack-printf-posix}: +@itemize +@item +This function does not support size specifiers as in C99 (@code{hh}, @code{ll}, +@code{j}, @code{t}, @code{z}) on some platforms: +AIX 5.1, HP-UX 11.23, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin 2006, mingw, BeOS. +@item +printf of @samp{long double} numbers is unsupported on some platforms: +mingw, BeOS. +@item +printf @code{"%f"}, @code{"%e"}, @code{"%g"} of Infinity and NaN yields an +incorrect result on some platforms: +AIX 5.2, OSF/1 5.1, Solaris 10, mingw. +@item +This function does not support the @samp{a} and @samp{A} directives on some +platforms: +glibc-2.3.6, MacOS X 10.3, NetBSD 3.0, OpenBSD 4.0, AIX 5.2, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin, mingw, BeOS. +@item +This function does not support the @samp{F} directive on some platforms: +NetBSD 3.0, AIX 5.1, HP-UX 11.23, IRIX 6.5, OSF/1 5.1, Solaris 9, Cygwin, mingw, BeOS. +@item +This function does not support format directives that access arguments in an +arbitrary order, such as @code{"%2$s"}, on some platforms: +NetBSD 3.0, mingw, BeOS. +@item +This function doesn't support the @code{'} flag on some platforms: +NetBSD 3.0, Cygwin 2006, mingw. +@item +This function behaves incorrectly when a @samp{-} flag and a negative width +are specified together, on some platforms: +HP-UX 10.20. +@item +printf @code{"%010f"} of NaN and Infinity yields an incorrect result (padded +with zeroes) on some platforms: +MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, AIX 5.2, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 2007, mingw. +@item +This function does not support precisions larger than 512 or 1024 in integer, +floating-point and pointer output on some platforms: +mingw, BeOS. +@item +This function can crash in out-of-memory conditions on some platforms: +MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0. +@item +This function does not fully support the @samp{n} directive on some platforms: +HP-UX 11, mingw. +@end itemize + +Portability problems not fixed by Gnulib: +@itemize +@end itemize diff -r 93c97f09dc9c -r 3384541effec lib/obstack_printf.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/obstack_printf.c Fri Jun 13 06:40:53 2008 -0600 @@ -0,0 +1,92 @@ +/* Formatted output to obstacks. + Copyright (C) 2008 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include + +/* Specification. */ +#include + +#include "obstack.h" +#include "vasnprintf.h" + +#include +#include +#include + +/* Grow an obstack with formatted output. Return the number of bytes + added to OBS. No trailing nul byte is added, and the object should + be closed with obstack_finish before use. + + Upon memory allocation error, call obstack_alloc_failed_handler. + Upon other error, return -1. */ +int +obstack_printf (struct obstack *obs, const char *format, ...) +{ + va_list args; + int result; + + va_start (args, format); + result = obstack_vprintf (obs, format, args); + va_end (args); + return result; +} + +/* Grow an obstack with formatted output. Return the number of bytes + added to OBS. No trailing nul byte is added, and the object should + be closed with obstack_finish before use. + + Upon memory allocation error, call obstack_alloc_failed_handler. + Upon other error, return -1. */ +int +obstack_vprintf (struct obstack *obs, const char *format, va_list args) +{ + /* If we are close to the end of the current obstack chunk, use a + 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]; + char *base = obstack_next_free (obs); + size_t len = obstack_room (obs); + char *str; + + if (len < cutoff) + { + base = buf; + len = cutoff; + } + str = vasnprintf (base, &len, format, args); + if (!str) + { + if (errno == ENOMEM) + obstack_alloc_failed_handler (); + return -1; + } + if (str == base && str != buf) + /* The output was already computed in place, but we need to + account for its size. */ + obstack_blank_fast (obs, len); + else + { + /* The output exceeded available obstack space or we used buf; + copy the resulting string. */ + obstack_grow (obs, str, len); + if (str != buf) + free (str); + } + return len; +} diff -r 93c97f09dc9c -r 3384541effec lib/stdio.in.h --- a/lib/stdio.in.h Fri Jun 13 05:59:04 2008 -0700 +++ b/lib/stdio.in.h Fri Jun 13 06:40:53 2008 -0600 @@ -212,6 +212,26 @@ # endif #endif +#if @GNULIB_OBSTACK_PRINTF@ +# if @REPLACE_OBSTACK_PRINTF@ +# define obstack_printf rpl_osbtack_printf +# define obstack_vprintf rpl_obstack_vprintf +# endif +# if @REPLACE_OBSTACK_PRINTF@ || !@HAVE_DECL_OBSTACK_PRINTF@ + struct obstack; + /* Grow an obstack with formatted output. Return the number of + bytes added to OBS. No trailing nul byte is added, and the + object should be closed with obstack_finish before use. Upon + memory allocation error, call obstack_alloc_failed_handler. Upon + other error, return -1. */ + extern int obstack_printf (struct obstack *obs, const char *format, ...) + __attribute__ ((__format__ (__printf__, 2, 3))); + extern int obstack_vprintf (struct obstack *obs, const char *format, + va_list args) + __attribute__ ((__format__ (__printf__, 2, 0))); +# endif +#endif + #if @GNULIB_FOPEN@ # if @REPLACE_FOPEN@ # define fopen rpl_fopen diff -r 93c97f09dc9c -r 3384541effec m4/obstack-printf-posix.m4 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m4/obstack-printf-posix.m4 Fri Jun 13 06:40:53 2008 -0600 @@ -0,0 +1,92 @@ +# obstack-printf-posix.m4 serial 1 +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, +dnl with or without modifications, as long as this notice is preserved. + +AC_DEFUN([gl_FUNC_OBSTACK_PRINTF_POSIX], +[ + AC_REQUIRE([gl_PRINTF_SIZES_C99]) + AC_REQUIRE([gl_PRINTF_LONG_DOUBLE]) + AC_REQUIRE([gl_PRINTF_INFINITE]) + AC_REQUIRE([gl_PRINTF_INFINITE_LONG_DOUBLE]) + AC_REQUIRE([gl_PRINTF_DIRECTIVE_A]) + AC_REQUIRE([gl_PRINTF_DIRECTIVE_F]) + AC_REQUIRE([gl_PRINTF_DIRECTIVE_N]) + AC_REQUIRE([gl_PRINTF_POSITIONS]) + AC_REQUIRE([gl_PRINTF_FLAG_GROUPING]) + AC_REQUIRE([gl_PRINTF_FLAG_LEFTADJUST]) + AC_REQUIRE([gl_PRINTF_FLAG_ZERO]) + 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 + if test $gl_cv_func_obstack_printf_posix = no; then + gl_PREREQ_VASNPRINTF_LONG_DOUBLE + gl_PREREQ_VASNPRINTF_INFINITE_DOUBLE + gl_PREREQ_VASNPRINTF_INFINITE_LONG_DOUBLE + gl_PREREQ_VASNPRINTF_DIRECTIVE_A + gl_PREREQ_VASNPRINTF_DIRECTIVE_F + gl_PREREQ_VASNPRINTF_FLAG_GROUPING + gl_PREREQ_VASNPRINTF_FLAG_LEFTADJUST + gl_PREREQ_VASNPRINTF_FLAG_ZERO + gl_PREREQ_VASNPRINTF_PRECISION + gl_PREREQ_VASNPRINTF_ENOMEM + gl_REPLACE_VASNPRINTF + gl_REPLACE_OBSTACK_PRINTF + fi +]) diff -r 93c97f09dc9c -r 3384541effec m4/obstack-printf.m4 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m4/obstack-printf.m4 Fri Jun 13 06:40:53 2008 -0600 @@ -0,0 +1,32 @@ +# obstack-printf.m4 serial 1 +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, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Eric Blake. +dnl Test whether obstack_printf() exists. For now, we assume that +dnl obstack_vprintf behaves identically, so we only test for one. + +AC_DEFUN([gl_FUNC_OBSTACK_PRINTF], +[ + AC_REQUIRE([gl_STDIO_H_DEFAULTS]) + AC_CHECK_FUNCS_ONCE([obstack_printf]) + if test $ac_cv_func_obstack_printf = no ; then + gl_REPLACE_OBSTACK_PRINTF + fi + + AC_CHECK_DECLS_ONCE([obstack_printf]) + if test $ac_cv_have_decl_obstack_printf = no; then + HAVE_DECL_OBSTACK_PRINTF=0 + fi +]) + +AC_DEFUN([gl_REPLACE_OBSTACK_PRINTF], +[ + AC_REQUIRE([gl_STDIO_H_DEFAULTS]) + AC_LIBOBJ([obstack_printf]) + if test $ac_cv_func_obstack_printf = yes; then + REPLACE_OBSTACK_PRINTF=1 + fi +]) diff -r 93c97f09dc9c -r 3384541effec m4/stdio_h.m4 --- a/m4/stdio_h.m4 Fri Jun 13 05:59:04 2008 -0700 +++ b/m4/stdio_h.m4 Fri Jun 13 06:40:53 2008 -0600 @@ -1,4 +1,4 @@ -# stdio_h.m4 serial 10 +# stdio_h.m4 serial 11 dnl Copyright (C) 2007-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, @@ -21,6 +21,8 @@ [ GNULIB_FPRINTF_POSIX=0; AC_SUBST([GNULIB_FPRINTF_POSIX]) GNULIB_PRINTF_POSIX=0; AC_SUBST([GNULIB_PRINTF_POSIX]) + GNULIB_OBSTACK_PRINTF=0; AC_SUBST([GNULIB_OBSTACK_PRINTF]) + GNULIB_OBSTACK_PRINTF_POSIX=0; AC_SUBST([GNULIB_OBSTACK_PRINTF_POSIX]) GNULIB_SNPRINTF=0; AC_SUBST([GNULIB_SNPRINTF]) GNULIB_SPRINTF_POSIX=0; AC_SUBST([GNULIB_SPRINTF_POSIX]) GNULIB_VFPRINTF_POSIX=0; AC_SUBST([GNULIB_VFPRINTF_POSIX]) @@ -62,6 +64,8 @@ HAVE_DECL_GETDELIM=1; AC_SUBST([HAVE_DECL_GETDELIM]) HAVE_DECL_GETLINE=1; AC_SUBST([HAVE_DECL_GETLINE]) REPLACE_GETLINE=0; AC_SUBST([REPLACE_GETLINE]) + HAVE_DECL_OBSTACK_PRINTF=1; AC_SUBST([HAVE_DECL_OBSTACK_PRINTF]) + REPLACE_OBSTACK_PRINTF=0; AC_SUBST([REPLACE_OBSTACK_PRINTF]) ]) dnl Code shared by fseeko and ftello. Determine if large files are supported, diff -r 93c97f09dc9c -r 3384541effec modules/obstack-printf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/modules/obstack-printf Fri Jun 13 06:40:53 2008 -0600 @@ -0,0 +1,27 @@ +Description: +Formatted printing into an obstack. + +Files: +m4/obstack-printf.m4 +lib/obstack_printf.c + +Depends-on: +obstack +stdio +vasnprintf + +configure.ac: +gl_FUNC_OBSTACK_PRINTF +gl_STDIO_MODULE_INDICATOR([obstack-printf]) + +Makefile.am: + +Include: +"obstack.h" + + +License: +GPL + +Maintainer: +Eric Blake diff -r 93c97f09dc9c -r 3384541effec modules/obstack-printf-posix --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/modules/obstack-printf-posix Fri Jun 13 06:40:53 2008 -0600 @@ -0,0 +1,28 @@ +Description: +POSIX formatted printing into an obstack. + +Files: +m4/obstack-printf.m4 +m4/obstack-printf-posix.m4 +lib/obstack_printf.c + +Depends-on: +obstack +stdio +vasnprintf-posix + +configure.ac: +gl_FUNC_OBSTACK_PRINTF_POSIX +gl_STDIO_MODULE_INDICATOR([obstack-printf-posix]) + +Makefile.am: + +Include: +"obstack.h" + + +License: +GPL + +Maintainer: +Eric Blake diff -r 93c97f09dc9c -r 3384541effec modules/obstack-printf-posix-tests --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/modules/obstack-printf-posix-tests Fri Jun 13 06:40:53 2008 -0600 @@ -0,0 +1,8 @@ +Files: + +Depends-on: +obstack-printf-tests + +configure.ac: + +Makefile.am: diff -r 93c97f09dc9c -r 3384541effec modules/obstack-printf-tests --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/modules/obstack-printf-tests Fri Jun 13 06:40:53 2008 -0600 @@ -0,0 +1,13 @@ +Files: +tests/test-obstack-printf.c + +Depends-on: +progname +xalloc + +configure.ac: + +Makefile.am: +TESTS += test-obstack-printf +check_PROGRAMS += test-obstack-printf +test_obstack_printf_LDADD = $(LDADD) @LIBINTL@ diff -r 93c97f09dc9c -r 3384541effec modules/stdio --- a/modules/stdio Fri Jun 13 05:59:04 2008 -0700 +++ b/modules/stdio Fri Jun 13 06:40:53 2008 -0600 @@ -24,6 +24,8 @@ -e 's|@''NEXT_STDIO_H''@|$(NEXT_STDIO_H)|g' \ -e 's|@''GNULIB_FPRINTF_POSIX''@|$(GNULIB_FPRINTF_POSIX)|g' \ -e 's|@''GNULIB_PRINTF_POSIX''@|$(GNULIB_PRINTF_POSIX)|g' \ + -e 's|@''GNULIB_OBSTACK_PRINTF''@|$(GNULIB_OBSTACK_PRINTF)|g' \ + -e 's|@''GNULIB_OBSTACK_PRINTF_POSIX''@|$(GNULIB_OBSTACK_PRINTF_POSIX)|g' \ -e 's|@''GNULIB_SNPRINTF''@|$(GNULIB_SNPRINTF)|g' \ -e 's|@''GNULIB_SPRINTF_POSIX''@|$(GNULIB_SPRINTF_POSIX)|g' \ -e 's|@''GNULIB_VFPRINTF_POSIX''@|$(GNULIB_VFPRINTF_POSIX)|g' \ @@ -62,6 +64,8 @@ -e 's|@''HAVE_DECL_GETDELIM''@|$(HAVE_DECL_GETDELIM)|g' \ -e 's|@''HAVE_DECL_GETLINE''@|$(HAVE_DECL_GETLINE)|g' \ -e 's|@''REPLACE_GETLINE''@|$(REPLACE_GETLINE)|g' \ + -e 's|@''HAVE_DECL_OBSTACK_PRINTF''@|$(HAVE_DECL_OBSTACK_PRINTF)|g' \ + -e 's|@''REPLACE_OBSTACK_PRINTF''@|$(REPLACE_OBSTACK_PRINTF)|g' \ -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \ < $(srcdir)/stdio.in.h; \ } > $@-t diff -r 93c97f09dc9c -r 3384541effec tests/test-obstack-printf.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-obstack-printf.c Fri Jun 13 06:40:53 2008 -0600 @@ -0,0 +1,125 @@ +/* Test of obstack_printf() and obstack_vprintf() functions. + Copyright (C) 2008 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* Written by Eric Blake , 2008. */ + +#include + +#include + +#include "obstack.h" +#include "xalloc.h" + +#include +#include +#include + +#define ASSERT(expr) \ + do \ + { \ + if (!(expr)) \ + { \ + fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \ + fflush (stderr); \ + abort (); \ + } \ + } \ + while (0) + +#define obstack_chunk_alloc xmalloc +#define obstack_chunk_free free + +static void +test_function (int (*my_obstack_printf) (struct obstack *, const char *, ...)) +{ + struct obstack obs; + obstack_init (&obs); + /* In general, don't invoke obstack_* functions inside ASSERT, as + not all compilers can avoid multiple side effects. */ + + /* Grow the obstack to near its boundary, then check that output + longer than the obstack free space grows the obstack. */ + { + char *base = obstack_base (&obs); + char *new_base; + int result; + int size; + int room = obstack_room (&obs) - 4; + + obstack_blank_fast (&obs, room); + result = my_obstack_printf (&obs, "%d %s", 123, "456"); + ASSERT (result == 7); + size = obstack_object_size (&obs); + ASSERT (result + room == size); + obstack_1grow (&obs, 0); + new_base = obstack_finish (&obs); + ASSERT (base != new_base); + ASSERT (strcmp (new_base + room, "123 456") == 0); + } + + /* Check that strings shorter than the obstack free space don't + cause a reshuffling of the obstack. */ + { + char *base = obstack_base (&obs); + char *new_base; + int result; + int size; + int room = obstack_room (&obs); + + ASSERT (8 < room); + result = my_obstack_printf (&obs, "%d %s", 123, "456"); + ASSERT (result == 7); + size = obstack_object_size (&obs); + ASSERT (result == size); + new_base = obstack_base (&obs); + ASSERT (base == new_base); + ASSERT (strncmp (base, "123 456", result) == 0); + } + + obstack_free (&obs, NULL); +} + +static int +my_obstack_printf (struct obstack *obs, const char *format, ...) +{ + va_list args; + int ret; + + va_start (args, format); + ret = obstack_vprintf (obs, format, args); + va_end (args); + return ret; +} + +static void +test_obstack_vprintf () +{ + test_function (my_obstack_printf); +} + +static void +test_obstack_printf () +{ + test_function (obstack_printf); +} + +int +main (int argc, char *argv[]) +{ + test_obstack_vprintf (); + test_obstack_printf (); + return 0; +}