*** empty log message ***
[gnulib.git] / lib / eealloc.h
1 /* Memory allocation with expensive empty allocations.
2    Copyright (C) 2003 Free Software Foundation, Inc.
3    Written by Bruno Haible <bruno@clisp.org>, 2003,
4    based on prior work by Jim Meyering.
5
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2, or (at your option)
9    any later version.
10
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software Foundation,
18    Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
19
20 #ifndef _EEALLOC_H
21 #define _EEALLOC_H
22
23 /* malloc() and realloc() are allowed to return NULL when asked to allocate
24    a memory block of 0 bytes; this is not an out-of-memory condition.
25    (See ISO C 99 section 7.20.3.)  In some places, this is not welcome,
26    because it requires extra checking (so as not to confuse a zero-sized
27    allocation with an out-of-memory condition).  This file provides
28    malloc()/realloc() workalikes which return non-NULL pointers for
29    succeeding zero-sized allocations.  GNU libc already defines malloc()
30    and realloc() this way; on such platforms the workalikes are aliased
31    to the original malloc()/realloc() functions.  */
32
33 #include <stdlib.h>
34
35 #if MALLOC_0_IS_NONNULL
36 # define eemalloc malloc
37 #else
38 static inline void *
39 eemalloc (size_t n)
40 {
41   /* If n is zero, allocate a 1-byte block.  */
42   if (n == 0)
43     n = 1;
44   return malloc (n);
45 }
46 #endif
47
48 #if REALLOC_0_IS_NONNULL
49 # define eerealloc realloc
50 #else
51 static inline void *
52 eerealloc (void *p, size_t n)
53 {
54   /* If n is zero, allocate or keep a 1-byte block.  */
55   if (n == 0)
56     n = 1;
57   return realloc (p, n);
58 }
59 #endif
60
61 /* Maybe we should also define variants
62     eenmalloc (size_t n, size_t s) - behaves like eemalloc (n * s)
63     eezalloc (size_t n) - like eemalloc followed by memset 0
64     eecalloc (size_t n, size_t s) - like eemalloc (n * s) followed by memset 0
65     eenrealloc (void *p, size_t n, size_t s) - like eerealloc (p, n * s)
66    If this would be useful in your application. please speak up.  */
67
68 #endif /* _EEALLOC_H */