]> git.cworth.org Git - tar/blob - gnu/realloc.c
04894fa530ae8a583d871f7138759ffabfd0ce8d
[tar] / gnu / realloc.c
1 /* -*- buffer-read-only: t -*- vi: set ro: */
2 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
3 /* realloc() function that is glibc compatible.
4
5    Copyright (C) 1997, 2003-2004, 2006-2007, 2009-2010 Free Software
6    Foundation, Inc.
7
8    This program is free software: you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20
21 /* written by Jim Meyering and Bruno Haible */
22
23 #include <config.h>
24
25 /* Only the AC_FUNC_REALLOC macro defines 'realloc' already in config.h.  */
26 #ifdef realloc
27 # define NEED_REALLOC_GNU 1
28 #endif
29
30 /* Infer the properties of the system's malloc function.
31    Only the AC_FUNC_MALLOC macro defines 'malloc' already in config.h.  */
32 #if GNULIB_MALLOC_GNU && !defined malloc
33 # define SYSTEM_MALLOC_GLIBC_COMPATIBLE 1
34 #endif
35
36 /* Below we want to call the system's malloc and realloc.
37    Undefine the symbols here so that including <stdlib.h> provides a
38    declaration of malloc(), not of rpl_malloc(), and likewise for realloc.  */
39 #undef malloc
40 #undef realloc
41
42 /* Specification.  */
43 #include <stdlib.h>
44
45 #include <errno.h>
46
47 /* Below we want to call the system's malloc and realloc.
48    Undefine the symbols, if they were defined by gnulib's <stdlib.h>
49    replacement.  */
50 #undef malloc
51 #undef realloc
52
53 /* Change the size of an allocated block of memory P to N bytes,
54    with error checking.  If N is zero, change it to 1.  If P is NULL,
55    use malloc.  */
56
57 void *
58 rpl_realloc (void *p, size_t n)
59 {
60   void *result;
61
62 #if NEED_REALLOC_GNU
63   if (n == 0)
64     {
65       n = 1;
66
67       /* In theory realloc might fail, so don't rely on it to free.  */
68       free (p);
69       p = NULL;
70     }
71 #endif
72
73   if (p == NULL)
74     {
75 #if GNULIB_REALLOC_GNU && !NEED_REALLOC_GNU && !SYSTEM_MALLOC_GLIBC_COMPATIBLE
76       if (n == 0)
77         n = 1;
78 #endif
79       result = malloc (n);
80     }
81   else
82     result = realloc (p, n);
83
84 #if !HAVE_REALLOC_POSIX
85   if (result == NULL)
86     errno = ENOMEM;
87 #endif
88
89   return result;
90 }