Fix a compilation error of realloc.c on OSF/1 4.0d and similar bugs.
authorBruno Haible <bruno@clisp.org>
Mon, 5 Nov 2007 23:27:27 +0000 (00:27 +0100)
committerBruno Haible <bruno@clisp.org>
Mon, 5 Nov 2007 23:27:27 +0000 (00:27 +0100)
ChangeLog
lib/realloc.c
modules/malloc
modules/realloc

index 66e77a1..3d17132 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2007-10-27  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
+            Bruno Haible  <bruno@clisp.org>
+
+       * modules/malloc (configure.ac): Define GNULIB_MALLOC_GNU always.
+       * modules/realloc (configure.ac): Define GNULIB_REALLOC_GNU always.
+       * lib/realloc.c (SYSTEM_MALLOC_GLIBC_COMPATIBLE): New macro.
+       (malloc): Undefine also before including <stdlib.h>.
+       (rpl_realloc): Turn malloc(0) into malloc(1) if necessary.
+       Needed on OSF/1 4.0.
+
 2007-11-05  Jim Meyering  <meyering@redhat.com>
 
        git-version-gen: sync from coreutils.
index 18cc628..b61c2ca 100644 (file)
 /* written by Jim Meyering and Bruno Haible */
 
 #include <config.h>
+
 /* Only the AC_FUNC_REALLOC macro defines 'realloc' already in config.h.  */
 #ifdef realloc
-# define NEED_REALLOC_GNU
-# undef realloc
+# define NEED_REALLOC_GNU 1
+#endif
+
+/* Infer the properties of the system's malloc function.
+   Only the AC_FUNC_MALLOC macro defines 'malloc' already in config.h.  */
+#if GNULIB_MALLOC_GNU && !defined malloc
+# define SYSTEM_MALLOC_GLIBC_COMPATIBLE 1
 #endif
 
+/* Below we want to call the system's malloc and realloc.
+   Undefine the symbols here so that including <stdlib.h> provides a
+   declaration of malloc(), not of rpl_malloc(), and likewise for realloc.  */
+#undef malloc
+#undef realloc
+
 /* Specification.  */
 #include <stdlib.h>
 
 #include <errno.h>
 
-/* Call the system's malloc and realloc below.  */
+/* Below we want to call the system's malloc and realloc.
+   Undefine the symbols, if they were defined by gnulib's <stdlib.h>
+   replacement.  */
 #undef malloc
 #undef realloc
 
@@ -42,7 +56,7 @@ rpl_realloc (void *p, size_t n)
 {
   void *result;
 
-#ifdef NEED_REALLOC_GNU
+#if NEED_REALLOC_GNU
   if (n == 0)
     {
       n = 1;
@@ -53,7 +67,16 @@ rpl_realloc (void *p, size_t n)
     }
 #endif
 
-  result = (p == NULL ? malloc (n) : realloc (p, n));
+  if (p == NULL)
+    {
+#if GNULIB_REALLOC_GNU && !NEED_REALLOC_GNU && !SYSTEM_MALLOC_GLIBC_COMPATIBLE
+      if (n == 0)
+       n = 1;
+#endif
+      result = malloc (n);
+    }
+  else
+    result = realloc (p, n);
 
 #if !HAVE_REALLOC_POSIX
   if (result == NULL)
index e571d3b..cc78668 100644 (file)
@@ -9,6 +9,7 @@ malloc-posix
 
 configure.ac:
 AC_FUNC_MALLOC
+AC_DEFINE([GNULIB_MALLOC_GNU], 1, [Define to indicate the 'malloc' module.])
 
 Makefile.am:
 
index aa5baf6..4596b4c 100644 (file)
@@ -9,6 +9,7 @@ realloc-posix
 
 configure.ac:
 AC_FUNC_REALLOC
+AC_DEFINE([GNULIB_REALLOC_GNU], 1, [Define to indicate the 'realloc' module.])
 
 Makefile.am: