maint: update copyright
[gnulib.git] / lib / safe-alloc.h
1 /* safe-alloc.h: safer memory allocation
2
3    Copyright (C) 2009-2014 Free Software Foundation, Inc.
4
5    This program is free software: you can redistribute it and/or modify it
6    under the terms of the GNU General Public License as published by the
7    Free Software Foundation; either version 3 of the License, or any
8    later version.
9
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14
15    You should have received a copy of the GNU General Public License
16    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
17
18 /* Written by Daniel Berrange <berrange@redhat.com>, 2008 */
19
20 #ifndef SAFE_ALLOC_H_
21 # define SAFE_ALLOC_H_
22
23 # include <stdlib.h>
24
25 #ifndef __GNUC_PREREQ
26 # if defined __GNUC__ && defined __GNUC_MINOR__
27 #  define __GNUC_PREREQ(maj, min)                                       \
28   ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
29 # else
30 #  define __GNUC_PREREQ(maj, min) 0
31 # endif
32 #endif
33
34 # ifndef _GL_ATTRIBUTE_RETURN_CHECK
35 #  if __GNUC_PREREQ (3, 4)
36 #   define _GL_ATTRIBUTE_RETURN_CHECK __attribute__((__warn_unused_result__))
37 #  else
38 #   define _GL_ATTRIBUTE_RETURN_CHECK
39 #  endif
40 # endif
41
42 /* Don't call these directly - use the macros below */
43 int
44 safe_alloc_alloc_n (void *ptrptr, size_t size, size_t count, int zeroed)
45   _GL_ATTRIBUTE_RETURN_CHECK;
46
47 int
48 safe_alloc_realloc_n (void *ptrptr, size_t size, size_t count)
49   _GL_ATTRIBUTE_RETURN_CHECK;
50
51 /**
52  * ALLOC:
53  * @ptr: pointer to hold address of allocated memory
54  *
55  * Allocate sizeof(*ptr) bytes of memory and store
56  * the address of allocated memory in 'ptr'. Fill the
57  * newly allocated memory with zeros.
58  *
59  * Return -1 on failure to allocate, zero on success
60  */
61 # define ALLOC(ptr)                                     \
62   safe_alloc_alloc_n (&(ptr), sizeof (*(ptr)), 1, 1)
63
64 /**
65  * ALLOC_N:
66  * @ptr: pointer to hold address of allocated memory
67  * @count: number of elements to allocate
68  *
69  * Allocate an array of 'count' elements, each sizeof(*ptr)
70  * bytes long and store the address of allocated memory in
71  * 'ptr'. Fill the newly allocated memory with zeros.
72  *
73  * Return -1 on failure, 0 on success
74  */
75 # define ALLOC_N(ptr, count)                                    \
76   safe_alloc_alloc_n (&(ptr), sizeof (*(ptr)), (count), 1)
77
78 /**
79  * ALLOC_N_UNINITIALIZED:
80  * @ptr: pointer to hold address of allocated memory
81  * @count: number of elements to allocate
82  *
83  * Allocate an array of 'count' elements, each sizeof(*ptr)
84  * bytes long and store the address of allocated memory in
85  * 'ptr'. Do not initialize the new memory at all.
86  *
87  * Return -1 on failure to allocate, zero on success
88  */
89 # define ALLOC_N_UNINITIALIZED(ptr, count)                      \
90   safe_alloc_alloc_n (&(ptr), sizeof (*(ptr)), (count), 0)
91
92 /**
93  * REALLOC_N:
94  * @ptr: pointer to hold address of allocated memory
95  * @count: number of elements to allocate
96  *
97  * Re-allocate an array of 'count' elements, each sizeof(*ptr)
98  * bytes long and store the address of allocated memory in
99  * 'ptr'. Fill the newly allocated memory with zeros
100  *
101  * Return -1 on failure to reallocate, zero on success
102  */
103 # define REALLOC_N(ptr, count)                                  \
104   safe_alloc_realloc_n (&(ptr), sizeof (*(ptr)), (count))
105
106 /**
107  * FREE:
108  * @ptr: pointer holding address to be freed
109  *
110  * Free the memory stored in 'ptr' and update to point
111  * to NULL.
112  */
113 # define FREE(ptr)                              \
114   do                                            \
115     {                                           \
116       free (ptr);                               \
117       (ptr) = NULL;                             \
118     }                                           \
119   while (0)
120
121 #endif /* SAFE_ALLOC_H_ */