mirror of
https://git.savannah.gnu.org/git/gnulib.git
synced 2025-08-08 17:22:05 +03:00
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 <ebb9@byu.net>
This commit is contained in:
23
ChangeLog
23
ChangeLog
@@ -1,3 +1,26 @@
|
|||||||
|
2008-06-13 Eric Blake <ebb9@byu.net>
|
||||||
|
|
||||||
|
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 <bruno@clisp.org>
|
2008-06-11 Bruno Haible <bruno@clisp.org>
|
||||||
|
|
||||||
* m4/open.m4 (gl_FUNC_OPEN): Add test against trailing slash bug.
|
* m4/open.m4 (gl_FUNC_OPEN): Add test against trailing slash bug.
|
||||||
|
@@ -1845,6 +1845,8 @@ func_all_modules ()
|
|||||||
func_module linebuffer
|
func_module linebuffer
|
||||||
func_module memxor
|
func_module memxor
|
||||||
func_module obstack
|
func_module obstack
|
||||||
|
func_module obstack-printf
|
||||||
|
func_module obstack-printf-posix
|
||||||
func_module hash-pjw
|
func_module hash-pjw
|
||||||
func_module hash
|
func_module hash
|
||||||
func_module readline
|
func_module readline
|
||||||
|
@@ -2,15 +2,63 @@
|
|||||||
@subsection @code{obstack_printf}
|
@subsection @code{obstack_printf}
|
||||||
@findex obstack_printf
|
@findex obstack_printf
|
||||||
|
|
||||||
Gnulib module: ---
|
Gnulib module: obstack-printf or obstack-printf-posix
|
||||||
|
|
||||||
Portability problems fixed by Gnulib:
|
Portability problems fixed by either Gnulib module
|
||||||
@itemize
|
@code{obstack-printf} or @code{obstack-printf-posix}:
|
||||||
@end itemize
|
|
||||||
|
|
||||||
Portability problems not fixed by Gnulib:
|
|
||||||
@itemize
|
@itemize
|
||||||
@item
|
@item
|
||||||
This function is missing on all non-glibc platforms:
|
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.
|
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
|
@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
|
||||||
|
@@ -2,15 +2,63 @@
|
|||||||
@subsection @code{obstack_vprintf}
|
@subsection @code{obstack_vprintf}
|
||||||
@findex obstack_vprintf
|
@findex obstack_vprintf
|
||||||
|
|
||||||
Gnulib module: ---
|
Gnulib module: obstack-printf or obstack-printf-posix
|
||||||
|
|
||||||
Portability problems fixed by Gnulib:
|
Portability problems fixed by either Gnulib module
|
||||||
@itemize
|
@code{obstack-printf} or @code{obstack-printf-posix}:
|
||||||
@end itemize
|
|
||||||
|
|
||||||
Portability problems not fixed by Gnulib:
|
|
||||||
@itemize
|
@itemize
|
||||||
@item
|
@item
|
||||||
This function is missing on all non-glibc platforms:
|
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.
|
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
|
@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
|
||||||
|
92
lib/obstack_printf.c
Normal file
92
lib/obstack_printf.c
Normal file
@@ -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 <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "obstack.h"
|
||||||
|
#include "vasnprintf.h"
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/* 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;
|
||||||
|
}
|
@@ -212,6 +212,26 @@ extern int vsprintf (char *str, const char *format, va_list args)
|
|||||||
# endif
|
# endif
|
||||||
#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 @GNULIB_FOPEN@
|
||||||
# if @REPLACE_FOPEN@
|
# if @REPLACE_FOPEN@
|
||||||
# define fopen rpl_fopen
|
# define fopen rpl_fopen
|
||||||
|
92
m4/obstack-printf-posix.m4
Normal file
92
m4/obstack-printf-posix.m4
Normal file
@@ -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
|
||||||
|
])
|
32
m4/obstack-printf.m4
Normal file
32
m4/obstack-printf.m4
Normal file
@@ -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
|
||||||
|
])
|
@@ -1,4 +1,4 @@
|
|||||||
# stdio_h.m4 serial 10
|
# stdio_h.m4 serial 11
|
||||||
dnl Copyright (C) 2007-2008 Free Software Foundation, Inc.
|
dnl Copyright (C) 2007-2008 Free Software Foundation, Inc.
|
||||||
dnl This file is free software; the Free Software Foundation
|
dnl This file is free software; the Free Software Foundation
|
||||||
dnl gives unlimited permission to copy and/or distribute it,
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
@@ -21,6 +21,8 @@ AC_DEFUN([gl_STDIO_H_DEFAULTS],
|
|||||||
[
|
[
|
||||||
GNULIB_FPRINTF_POSIX=0; AC_SUBST([GNULIB_FPRINTF_POSIX])
|
GNULIB_FPRINTF_POSIX=0; AC_SUBST([GNULIB_FPRINTF_POSIX])
|
||||||
GNULIB_PRINTF_POSIX=0; AC_SUBST([GNULIB_PRINTF_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_SNPRINTF=0; AC_SUBST([GNULIB_SNPRINTF])
|
||||||
GNULIB_SPRINTF_POSIX=0; AC_SUBST([GNULIB_SPRINTF_POSIX])
|
GNULIB_SPRINTF_POSIX=0; AC_SUBST([GNULIB_SPRINTF_POSIX])
|
||||||
GNULIB_VFPRINTF_POSIX=0; AC_SUBST([GNULIB_VFPRINTF_POSIX])
|
GNULIB_VFPRINTF_POSIX=0; AC_SUBST([GNULIB_VFPRINTF_POSIX])
|
||||||
@@ -62,6 +64,8 @@ AC_DEFUN([gl_STDIO_H_DEFAULTS],
|
|||||||
HAVE_DECL_GETDELIM=1; AC_SUBST([HAVE_DECL_GETDELIM])
|
HAVE_DECL_GETDELIM=1; AC_SUBST([HAVE_DECL_GETDELIM])
|
||||||
HAVE_DECL_GETLINE=1; AC_SUBST([HAVE_DECL_GETLINE])
|
HAVE_DECL_GETLINE=1; AC_SUBST([HAVE_DECL_GETLINE])
|
||||||
REPLACE_GETLINE=0; AC_SUBST([REPLACE_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,
|
dnl Code shared by fseeko and ftello. Determine if large files are supported,
|
||||||
|
27
modules/obstack-printf
Normal file
27
modules/obstack-printf
Normal file
@@ -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"
|
||||||
|
<stdio.h>
|
||||||
|
|
||||||
|
License:
|
||||||
|
GPL
|
||||||
|
|
||||||
|
Maintainer:
|
||||||
|
Eric Blake
|
28
modules/obstack-printf-posix
Normal file
28
modules/obstack-printf-posix
Normal file
@@ -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"
|
||||||
|
<stdio.h>
|
||||||
|
|
||||||
|
License:
|
||||||
|
GPL
|
||||||
|
|
||||||
|
Maintainer:
|
||||||
|
Eric Blake
|
8
modules/obstack-printf-posix-tests
Normal file
8
modules/obstack-printf-posix-tests
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
Files:
|
||||||
|
|
||||||
|
Depends-on:
|
||||||
|
obstack-printf-tests
|
||||||
|
|
||||||
|
configure.ac:
|
||||||
|
|
||||||
|
Makefile.am:
|
13
modules/obstack-printf-tests
Normal file
13
modules/obstack-printf-tests
Normal file
@@ -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@
|
@@ -24,6 +24,8 @@ stdio.h: stdio.in.h
|
|||||||
-e 's|@''NEXT_STDIO_H''@|$(NEXT_STDIO_H)|g' \
|
-e 's|@''NEXT_STDIO_H''@|$(NEXT_STDIO_H)|g' \
|
||||||
-e 's|@''GNULIB_FPRINTF_POSIX''@|$(GNULIB_FPRINTF_POSIX)|g' \
|
-e 's|@''GNULIB_FPRINTF_POSIX''@|$(GNULIB_FPRINTF_POSIX)|g' \
|
||||||
-e 's|@''GNULIB_PRINTF_POSIX''@|$(GNULIB_PRINTF_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_SNPRINTF''@|$(GNULIB_SNPRINTF)|g' \
|
||||||
-e 's|@''GNULIB_SPRINTF_POSIX''@|$(GNULIB_SPRINTF_POSIX)|g' \
|
-e 's|@''GNULIB_SPRINTF_POSIX''@|$(GNULIB_SPRINTF_POSIX)|g' \
|
||||||
-e 's|@''GNULIB_VFPRINTF_POSIX''@|$(GNULIB_VFPRINTF_POSIX)|g' \
|
-e 's|@''GNULIB_VFPRINTF_POSIX''@|$(GNULIB_VFPRINTF_POSIX)|g' \
|
||||||
@@ -62,6 +64,8 @@ stdio.h: stdio.in.h
|
|||||||
-e 's|@''HAVE_DECL_GETDELIM''@|$(HAVE_DECL_GETDELIM)|g' \
|
-e 's|@''HAVE_DECL_GETDELIM''@|$(HAVE_DECL_GETDELIM)|g' \
|
||||||
-e 's|@''HAVE_DECL_GETLINE''@|$(HAVE_DECL_GETLINE)|g' \
|
-e 's|@''HAVE_DECL_GETLINE''@|$(HAVE_DECL_GETLINE)|g' \
|
||||||
-e 's|@''REPLACE_GETLINE''@|$(REPLACE_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)' \
|
-e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \
|
||||||
< $(srcdir)/stdio.in.h; \
|
< $(srcdir)/stdio.in.h; \
|
||||||
} > $@-t
|
} > $@-t
|
||||||
|
125
tests/test-obstack-printf.c
Normal file
125
tests/test-obstack-printf.c
Normal file
@@ -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 <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* Written by Eric Blake <ebb9@byu.net>, 2008. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "obstack.h"
|
||||||
|
#include "xalloc.h"
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#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;
|
||||||
|
}
|
Reference in New Issue
Block a user