1 /* Memory allocation with expensive empty allocations. 2 Copyright (C) 2003, 2008, 2010-2021 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 3 of the License, or 9 (at your option) 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, see <https://www.gnu.org/licenses/>. */ 18 19 #ifndef _EEALLOC_H 20 #define _EEALLOC_H 21 22 /* malloc() and realloc() are allowed to return NULL when asked to allocate 23 a memory block of 0 bytes; this is not an out-of-memory condition. 24 (See ISO C 99 section 7.20.3.) In some places, this is not welcome, 25 because it requires extra checking (so as not to confuse a zero-sized 26 allocation with an out-of-memory condition). This file provides 27 malloc()/realloc() workalikes which return non-NULL pointers for 28 succeeding zero-sized allocations. GNU libc already defines malloc() 29 and realloc() this way; on such platforms the workalikes are aliased 30 to the original malloc()/realloc() functions. */ 31 32 #include <stdlib.h> 33 34 #ifndef _GL_INLINE_HEADER_BEGIN 35 #error "Please include config.h first." 36 #endif 37 _GL_INLINE_HEADER_BEGIN 38 #ifndef EEALLOC_INLINE 39 # define EEALLOC_INLINE _GL_INLINE 40 #endif 41 42 #if MALLOC_0_IS_NONNULL 43 # define eemalloc malloc 44 #else 45 EEALLOC_INLINE void *eemalloc (size_t n) /* */ 46 _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1)) 47 _GL_ATTRIBUTE_DEALLOC_FREE; 48 EEALLOC_INLINE void * 49 eemalloc (size_t n) 50 { 51 /* If n is zero, allocate a 1-byte block. */ 52 if (n == 0) 53 n = 1; 54 return malloc (n); 55 } 56 #endif 57 58 #if REALLOC_0_IS_NONNULL 59 # define eerealloc realloc 60 #else 61 EEALLOC_INLINE void *eerealloc (void *p, size_t n) /* */ 62 _GL_ATTRIBUTE_ALLOC_SIZE ((2)); 63 EEALLOC_INLINE void * 64 eerealloc (void *p, size_t n) 65 { 66 /* If n is zero, allocate or keep a 1-byte block. */ 67 if (n == 0) 68 n = 1; 69 return realloc (p, n); 70 } 71 #endif 72 73 /* Maybe we should also define variants 74 eenmalloc (size_t n, size_t s) - behaves like eemalloc (n * s) 75 eezalloc (size_t n) - like eemalloc followed by memset 0 76 eecalloc (size_t n, size_t s) - like eemalloc (n * s) followed by memset 0 77 eenrealloc (void *p, size_t n, size_t s) - like eerealloc (p, n * s) 78 If this would be useful in your application. please speak up. */ 79 80 _GL_INLINE_HEADER_END 81 82 #endif /* _EEALLOC_H */