a016a20432f75715d91009f5e0fe0d81cc7a523d
[silc.git] / lib / silcutil / silcmemory.h
1 /*
2
3   silcmemory.h
4
5   Author: Pekka Riikonen <priikone@silcnet.org>
6
7   Copyright (C) 1999 - 2007 Pekka Riikonen
8
9   This program is free software; you can redistribute it and/or modify
10   it under the terms of the GNU General Public License as published by
11   the Free Software Foundation; version 2 of the License.
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 */
19
20 /****h* silcutil/SILC Memory Interface
21  *
22  * DESCRIPTION
23  *
24  * Basic utility functions for allocating memory. All SILC routines, and
25  * applications use these functions when they need to allocate, manipulate
26  * and free memory.
27  *
28  ***/
29
30 #ifndef SILCMEMORY_H
31 #define SILCMEMORY_H
32
33 /* Prototypes */
34
35 #ifndef SILC_STACKTRACE
36
37 /****f* silcutil/SilcMemoryAPI/silc_malloc
38  *
39  * SYNOPSIS
40  *
41  *    void *silc_malloc(size_t size);
42  *
43  * DESCRIPTION
44  *
45  *    Allocates memory of `size' bytes and returns pointer to the allocated
46  *    memory area.  Free the memory by calling silc_free.  Returns NULL on
47  *    error.
48  *
49  ***/
50 void *silc_malloc(size_t size);
51
52 /****f* silcutil/SilcMemoryAPI/silc_calloc
53  *
54  * SYNOPSIS
55  *
56  *    void *silc_calloc(size_t items, size_t size);
57  *
58  * DESCRIPTION
59  *
60  *    Allocates memory of for an array of `items' elements of `size' bytes
61  *    and returns pointer to the allocated memory area.  The memory area is
62  *    also zeroed.  Free the memory by calling silc_free.  Returns NULL on
63  *    error.
64  *
65  ***/
66 void *silc_calloc(size_t items, size_t size);
67
68 /****f* silcutil/SilcMemoryAPI/silc_realloc
69  *
70  * SYNOPSIS
71  *
72  *    void *silc_realloc(void *ptr, size_t size);
73  *
74  * DESCRIPTION
75  *
76  *    Change the size of the memory block indicated by `ptr' to the new
77  *    size of `size' bytes.  The contents of `ptr' will not be changed.
78  *    If `ptr' is NULL the call is equivalent to silc_malloc.  If the
79  *    `size' is zero (0) the call is equivalent to silc_free.  Free the
80  *    memory by calling silc_free.
81  *
82  * NOTES
83  *
84  *    The pointer returned to the reallocated memory area might not be
85  *    same as `ptr'.
86  *
87  ***/
88 void *silc_realloc(void *ptr, size_t size);
89
90 /****f* silcutil/SilcMemoryAPI/silc_free
91  *
92  * SYNOPSIS
93  *
94  *    void silc_free(void *ptr);
95  *
96  * DESCRIPTION
97  *
98  *    Frees the memory area indicated by the `ptr'. If `ptr' is NULL no
99  *    operation is performed.
100  *
101  ***/
102 void silc_free(void *ptr);
103
104 /****f* silcutil/SilcMemoryAPI/silc_memdup
105  *
106  * SYNOPSIS
107  *
108  *    void *silc_memdup(const void *ptr, size_t size);
109  *
110  * DESCRIPTION
111  *
112  *    Duplicates the memory area indicated by `ptr' which is of size
113  *    of `size' bytes. Returns pointer to the duplicated memory area.
114  *    This NULL terminates the dupped memory area by allocating `size' + 1
115  *    bytes, so this function can be used to duplicate strings that does
116  *    not have NULL termination.
117  *
118  ***/
119 void *silc_memdup(const void *ptr, size_t size);
120
121 #else
122 #ifndef SILC_DIST_TOOLKIT
123 #error "The stack trace is not supported in this distribution"
124 #endif /* SILC_DIST_TOOLKIT */
125
126 #include "stacktrace.h"
127 #endif /* SILC_STACKTRACE */
128
129
130 /* Following functions that use SilcStack as memory source. */
131
132 /****f* silcutil/SilcMemoryAPI/silc_smalloc
133  *
134  * SYNOPSIS
135  *
136  *    void *silc_smalloc(SilcStack stack, SilcUInt32 size);
137  *
138  * DESCRIPTION
139  *
140  *    Allocate memory block of size of `size' from the stack indicated by
141  *    `stack' and return pointer to it.  Returns NULL on error.  This
142  *    function allocates aligned memory so it can be used to allocate
143  *    memory for structures, for example.
144  *
145  * NOTES
146  *
147  *    Be careful with this function:  do not free the returned pointer
148  *    explicitly and do not save the returned pointer to a permanent
149  *    location.
150  *
151  *    If `stack' is NULL this function calls silc_malloc.
152  *
153  ***/
154 void *silc_smalloc(SilcStack stack, SilcUInt32 size);
155
156 /****f* silcutil/SilcMemoryAPI/silc_scalloc
157  *
158  * SYNOPSIS
159  *
160  *    void *silc_scalloc(SilcStack stack, SilcUInt32 items, SilcUInt32 size);
161  *
162  * DESCRIPTION
163  *
164  *    Allocate memory block of size of `size' from the stack indicated by
165  *    `stack', zero the memory area and return pointer to it.  This
166  *    function allocates aligned memory.  Returns NULL on error.
167  *
168  * NOTES
169  *
170  *    Be careful with this function:  do not free the returned pointer
171  *    explicitly and do not save the returned pointer to a permanent
172  *    location.
173  *
174  *    If `stack' is NULL this function calls silc_calloc.
175  *
176  ***/
177 void *silc_scalloc(SilcStack stack, SilcUInt32 items, SilcUInt32 size);
178
179 /****f* silcutil/SilcMemoryAPI/silc_srealloc
180  *
181  * SYNOPSIS
182  *
183  *    void *silc_srealloc(SilcStack stack, SilcUInt32 old_size,
184  *                        void *ptr, SilcUInt32 size);
185  *
186  * DESCRIPTION
187  *
188  *    Change the size of the memory block indicated by `ptr' to the new
189  *    size of `size' bytes.  The contents of `ptr' will not be changed.
190  *    If `ptr' is NULL the call is equivalent to silc_smalloc.  If `size'
191  *    is zero (0) error will occur.  Returns NULL on error and the old
192  *    pointer remain intact.
193  *
194  * NOTES
195  *
196  *    This function reallocates successfully only if the previous allocation
197  *    to `stack' was `ptr'.  If there was another memory allocation between
198  *    allocating `ptr' and this call, this routine will return NULL.  The
199  *    NULL is also returned if the `size' does not fit to current stack
200  *    and allocating new block would require slow copying of the data.  It
201  *    is left to the caller to decide whether to allocate new pointer and
202  *    copy the old data in case this function returns NULL.
203  *
204  *    If `stack' is NULL this function calls silc_realloc.
205  *
206  ***/
207 void *silc_srealloc(SilcStack stack, SilcUInt32 old_size,
208                     void *ptr, SilcUInt32 size);
209
210 /****f* silcutil/SilcMemoryAPI/silc_smemdup
211  *
212  * SYNOPSIS
213  *
214  *    void *silc_smemdup(SilcStack stack, const void *ptr, SilcUInt32 size);
215  *
216  * DESCRIPTION
217  *
218  *    Duplicates the memory area indicated by `ptr' which is the size of
219  *    `size' bytes.  Returns pointer to the duplicated memory area.  This
220  *    NULL terminates the dupped memory area by allocating `size' + 1
221  *    bytes, so this function can be used to duplicate strings that does not
222  *    have NULL termination.  This function allocates aligned memory so
223  *    it can be used to duplicate also structures.  Returns NULL on error.
224  *
225  * NOTES
226  *
227  *    Be careful with this function:  do not free the returned pointer
228  *    explicitly and do not save the returned pointer to a permanent
229  *    location.
230  *
231  *    If `stack' is NULL this function calls silc_memdup.
232  *
233  ***/
234 void *silc_smemdup(SilcStack stack, const void *ptr, SilcUInt32 size);
235
236 /****f* silcutil/SilcMemoryAPI/silc_sfree
237  *
238  * SYNOPSIS
239  *
240  *    void silc_scalloc(SilcStack stack, void *ptr);
241  *
242  * DESCRIPTION
243  *
244  *    This function can be used to free the `ptr' if `stack' is NULL.  This
245  *    function does nothing if `stack' is non-NULL.  When `stack' is NULL
246  *    this function calls silc_free.
247  *
248  ***/
249 void silc_sfree(SilcStack stack, void *ptr);
250
251 /****f* silcutil/SilcMemoryAPI/silc_sstrdup
252  *
253  * SYNOPSIS
254  *
255  *    char *silc_sstrdup(SilcStack stack, const char *str);
256  *
257  * DESCRIPTION
258  *
259  *    Duplicates the string indicated by `str' and returns the duplicated
260  *    string.  Returns NULL on error.
261  *
262  * NOTES
263  *
264  *    Be careful with this function:  do not free the returned pointer
265  *    explicitly and do not save the returned pointer to a permanent
266  *    location.
267  *
268  *    If `stack' is NULL this function calls silc_strdup.
269  *
270  ***/
271 char *silc_sstrdup(SilcStack stack, const char *str);
272
273 #endif /* SILCMEMORY_H */