# HG changeset patch # User Bruno Haible # Date 1189342587 0 # Node ID c7875dab3c3eb9ce6bfd7d73d6771d5ab4e8c223 # Parent a4f83e0e605cee6ec84ca52dbcc2e4c33703b308 New module 'realloc-posix'. diff -r a4f83e0e605c -r c7875dab3c3e ChangeLog --- a/ChangeLog Sun Sep 09 12:29:37 2007 +0000 +++ b/ChangeLog Sun Sep 09 12:56:27 2007 +0000 @@ -1,3 +1,19 @@ +2007-09-09 Bruno Haible + + * modules/realloc-posix: New file. + * modules/realloc (Depends-on): Add realloc-posix. + * lib/realloc.c: Include errno.h. + (rpl_realloc): Merge the requirements of a glibc-compatible realloc + and a POSIX-compatible realloc into a single function. Set ENOMEM + when returning NULL. + * m4/realloc.m4: New file. + * doc/functions/realloc.texi: Mention the realloc-posix module. + * lib/stdlib_.h (realloc): New declaration. + * m4/stdlib_h.m4 (gl_STDLIB_H_DEFAULTS): Initialize + GNULIB_REALLOC_POSIX and HAVE_REALLOC_POSIX. + * modules/stdlib (stdlib.h): Substitute also GNULIB_REALLOC_POSIX + and HAVE_REALLOC_POSIX. + 2007-09-09 Bruno Haible * modules/calloc-posix: New file. diff -r a4f83e0e605c -r c7875dab3c3e doc/functions/realloc.texi --- a/doc/functions/realloc.texi Sun Sep 09 12:29:37 2007 +0000 +++ b/doc/functions/realloc.texi Sun Sep 09 12:56:27 2007 +0000 @@ -4,10 +4,14 @@ POSIX specification: @url{http://www.opengroup.org/susv3xsh/realloc.html} -Gnulib module: --- +Gnulib module: realloc-posix Portability problems fixed by Gnulib: @itemize +@item +Upon failure, the function does not set @code{errno} to @code{ENOMEM} on +some platforms: +mingw. @end itemize Portability problems not fixed by Gnulib: diff -r a4f83e0e605c -r c7875dab3c3e lib/realloc.c --- a/lib/realloc.c Sun Sep 09 12:29:37 2007 +0000 +++ b/lib/realloc.c Sun Sep 09 12:56:27 2007 +0000 @@ -1,6 +1,6 @@ /* realloc() function that is glibc compatible. - Copyright (C) 1997, 2003, 2004, 2006 Free Software Foundation, Inc. + Copyright (C) 1997, 2003, 2004, 2006, 2007 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 @@ -16,13 +16,20 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -/* written by Jim Meyering */ +/* written by Jim Meyering and Bruno Haible */ #include -#undef realloc +/* Only the AC_FUNC_REALLOC macro defines 'realloc' already in config.h. */ +#ifdef realloc +# define NEED_REALLOC_GNU +# undef realloc +#endif +/* Specification. */ #include +#include + /* Change the size of an allocated block of memory P to N bytes, with error checking. If N is zero, change it to 1. If P is NULL, use malloc. */ @@ -30,6 +37,9 @@ void * rpl_realloc (void *p, size_t n) { + void *result; + +#ifdef NEED_REALLOC_GNU if (n == 0) { n = 1; @@ -38,8 +48,14 @@ free (p); p = NULL; } +#endif - if (p == NULL) - return malloc (n); - return realloc (p, n); + result = (p == NULL ? malloc (n) : realloc (p, n)); + +#if !HAVE_REALLOC_POSIX + if (result == NULL) + errno = ENOMEM; +#endif + + return result; } diff -r a4f83e0e605c -r c7875dab3c3e lib/stdlib_.h --- a/lib/stdlib_.h Sun Sep 09 12:29:37 2007 +0000 +++ b/lib/stdlib_.h Sun Sep 09 12:56:27 2007 +0000 @@ -55,6 +55,21 @@ #endif +#if @GNULIB_REALLOC_POSIX@ +# if !@HAVE_REALLOC_POSIX@ +# undef realloc +# define realloc rpl_realloc +extern void * realloc (void *ptr, size_t size); +# endif +#elif defined GNULIB_POSIXCHECK +# undef realloc +# define realloc(p,s) \ + (GL_LINK_WARNING ("realloc is not POSIX compliant everywhere - " \ + "use gnulib module realloc-posix for portability"), \ + realloc (p, s)) +#endif + + #if @GNULIB_CALLOC_POSIX@ # if !@HAVE_CALLOC_POSIX@ # undef calloc diff -r a4f83e0e605c -r c7875dab3c3e m4/realloc.m4 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m4/realloc.m4 Sun Sep 09 12:56:27 2007 +0000 @@ -0,0 +1,34 @@ +# realloc.m4 serial 8 +dnl Copyright (C) 2007 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. + +# gl_FUNC_REALLOC_POSIX +# -------------------- +# Test whether 'realloc' is POSIX compliant (sets errno to ENOMEM when it +# fails), and replace realloc if it is not. +AC_DEFUN([gl_FUNC_REALLOC_POSIX], +[ + AC_CACHE_CHECK([whether malloc, realloc, calloc are POSIX compliant], + [gl_cv_func_malloc_posix], + [ + dnl It is too dangerous to try to allocate a large amount of memory: + dnl some systems go to their knees when you do that. So assume that + dnl all Unix implementations of the function are POSIX compliant. + AC_TRY_COMPILE([], + [#if !((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__) + choke me + #endif + ], [gl_cv_func_malloc_posix=yes], [gl_cv_func_malloc_posix=no]) + ]) + if test $gl_cv_func_malloc_posix = yes; then + HAVE_REALLOC_POSIX=1 + AC_DEFINE([HAVE_REALLOC_POSIX], 1, + [Define if the 'realloc' function is POSIX compliant.]) + else + AC_LIBOBJ([realloc]) + HAVE_REALLOC_POSIX=0 + fi + AC_SUBST([HAVE_REALLOC_POSIX]) +]) diff -r a4f83e0e605c -r c7875dab3c3e m4/stdlib_h.m4 --- a/m4/stdlib_h.m4 Sun Sep 09 12:29:37 2007 +0000 +++ b/m4/stdlib_h.m4 Sun Sep 09 12:56:27 2007 +0000 @@ -19,13 +19,15 @@ AC_DEFUN([gl_STDLIB_H_DEFAULTS], [ - GNULIB_CALLOC_POSIX=0; AC_SUBST([GNULIB_CALLOC_POSIX]) - GNULIB_GETSUBOPT=0; AC_SUBST([GNULIB_GETSUBOPT]) - GNULIB_MKDTEMP=0; AC_SUBST([GNULIB_MKDTEMP]) - GNULIB_MKSTEMP=0; AC_SUBST([GNULIB_MKSTEMP]) + GNULIB_REALLOC_POSIX=0; AC_SUBST([GNULIB_REALLOC_POSIX]) + GNULIB_CALLOC_POSIX=0; AC_SUBST([GNULIB_CALLOC_POSIX]) + GNULIB_GETSUBOPT=0; AC_SUBST([GNULIB_GETSUBOPT]) + GNULIB_MKDTEMP=0; AC_SUBST([GNULIB_MKDTEMP]) + GNULIB_MKSTEMP=0; AC_SUBST([GNULIB_MKSTEMP]) dnl Assume proper GNU behavior unless another module says otherwise. - HAVE_CALLOC_POSIX=1; AC_SUBST([HAVE_CALLOC_POSIX]) - HAVE_GETSUBOPT=1; AC_SUBST([HAVE_GETSUBOPT]) - HAVE_MKDTEMP=1; AC_SUBST([HAVE_MKDTEMP]) - REPLACE_MKSTEMP=0; AC_SUBST([REPLACE_MKSTEMP]) + HAVE_CALLOC_POSIX=1; AC_SUBST([HAVE_CALLOC_POSIX]) + HAVE_GETSUBOPT=1; AC_SUBST([HAVE_GETSUBOPT]) + HAVE_MKDTEMP=1; AC_SUBST([HAVE_MKDTEMP]) + HAVE_REALLOC_POSIX=1; AC_SUBST([HAVE_REALLOC_POSIX]) + REPLACE_MKSTEMP=0; AC_SUBST([REPLACE_MKSTEMP]) ]) diff -r a4f83e0e605c -r c7875dab3c3e modules/realloc --- a/modules/realloc Sun Sep 09 12:29:37 2007 +0000 +++ b/modules/realloc Sun Sep 09 12:56:27 2007 +0000 @@ -5,6 +5,7 @@ lib/realloc.c Depends-on: +realloc-posix configure.ac: AC_FUNC_REALLOC diff -r a4f83e0e605c -r c7875dab3c3e modules/realloc-posix --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/modules/realloc-posix Sun Sep 09 12:56:27 2007 +0000 @@ -0,0 +1,25 @@ +Description: +realloc() function: allocate memory with indefinite extent. + +Files: +lib/realloc.c +m4/realloc.m4 + +Depends-on: +stdlib + +configure.ac: +gl_FUNC_REALLOC_POSIX +gl_STDLIB_MODULE_INDICATOR([realloc-posix]) + +Makefile.am: + +Include: + + +License: +LGPL + +Maintainer: +Bruno Haible + diff -r a4f83e0e605c -r c7875dab3c3e modules/stdlib --- a/modules/stdlib Sun Sep 09 12:29:37 2007 +0000 +++ b/modules/stdlib Sun Sep 09 12:56:27 2007 +0000 @@ -23,6 +23,7 @@ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \ sed -e 's/@''INCLUDE_NEXT''@/$(INCLUDE_NEXT)/g' \ -e 's|@''NEXT_STDLIB_H''@|$(NEXT_STDLIB_H)|g' \ + -e 's|@''GNULIB_REALLOC_POSIX''@|$(GNULIB_REALLOC_POSIX)|g' \ -e 's|@''GNULIB_CALLOC_POSIX''@|$(GNULIB_CALLOC_POSIX)|g' \ -e 's|@''GNULIB_GETSUBOPT''@|$(GNULIB_GETSUBOPT)|g' \ -e 's|@''GNULIB_MKDTEMP''@|$(GNULIB_MKDTEMP)|g' \ @@ -30,6 +31,7 @@ -e 's|@''HAVE_CALLOC_POSIX''@|$(HAVE_CALLOC_POSIX)|g' \ -e 's|@''HAVE_GETSUBOPT''@|$(HAVE_GETSUBOPT)|g' \ -e 's|@''HAVE_MKDTEMP''@|$(HAVE_MKDTEMP)|g' \ + -e 's|@''HAVE_REALLOC_POSIX''@|$(HAVE_REALLOC_POSIX)|g' \ -e 's|@''REPLACE_MKSTEMP''@|$(REPLACE_MKSTEMP)|g' \ -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \ < $(srcdir)/stdlib_.h; \