Git init
[framework/multimedia/pulseaudio.git] / src / pulse / xmalloc.h
1 #ifndef foomemoryhfoo
2 #define foomemoryhfoo
3
4 /***
5   This file is part of PulseAudio.
6
7   Copyright 2004-2006 Lennart Poettering
8
9   PulseAudio is free software; you can redistribute it and/or modify
10   it under the terms of the GNU Lesser General Public License as published
11   by the Free Software Foundation; either version 2.1 of the License,
12   or (at your option) any later version.
13
14   PulseAudio is distributed in the hope that it will be useful, but
15   WITHOUT ANY WARRANTY; without even the implied warranty of
16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17   General Public License for more details.
18
19   You should have received a copy of the GNU Lesser General Public License
20   along with PulseAudio; if not, write to the Free Software
21   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
22   USA.
23 ***/
24
25 #include <sys/types.h>
26 #include <stdlib.h>
27 #include <limits.h>
28 #include <assert.h>
29
30 #include <pulse/cdecl.h>
31 #include <pulse/gccmacro.h>
32 #include <pulse/version.h>
33
34 /** \file
35  * Memory allocation functions.
36  */
37
38 PA_C_DECL_BEGIN
39
40 /** Allocate the specified number of bytes, just like malloc() does. However, in case of OOM, terminate */
41 void* pa_xmalloc(size_t l) PA_GCC_MALLOC PA_GCC_ALLOC_SIZE(1);
42
43 /** Same as pa_xmalloc(), but initialize allocated memory to 0 */
44 void *pa_xmalloc0(size_t l) PA_GCC_MALLOC PA_GCC_ALLOC_SIZE(1);
45
46 /**  The combination of pa_xmalloc() and realloc() */
47 void *pa_xrealloc(void *ptr, size_t size) PA_GCC_ALLOC_SIZE(2);
48
49 /** Free allocated memory */
50 void pa_xfree(void *p);
51
52 /** Duplicate the specified string, allocating memory with pa_xmalloc() */
53 char *pa_xstrdup(const char *s) PA_GCC_MALLOC;
54
55 /** Duplicate the specified string, but truncate after l characters */
56 char *pa_xstrndup(const char *s, size_t l) PA_GCC_MALLOC;
57
58 /** Duplicate the specified memory block */
59 void* pa_xmemdup(const void *p, size_t l) PA_GCC_MALLOC PA_GCC_ALLOC_SIZE(2);
60
61 /** Internal helper for pa_xnew() */
62 static void* _pa_xnew_internal(size_t n, size_t k) PA_GCC_MALLOC PA_GCC_ALLOC_SIZE2(1,2);
63
64 static inline void* _pa_xnew_internal(size_t n, size_t k) {
65     assert(n < INT_MAX/k);
66     return pa_xmalloc(n*k);
67 }
68
69 /** Allocate n new structures of the specified type. */
70 #define pa_xnew(type, n) ((type*) _pa_xnew_internal((n), sizeof(type)))
71
72 /** Internal helper for pa_xnew0() */
73 static void* _pa_xnew0_internal(size_t n, size_t k) PA_GCC_MALLOC PA_GCC_ALLOC_SIZE2(1,2);
74
75 static inline void* _pa_xnew0_internal(size_t n, size_t k) {
76     assert(n < INT_MAX/k);
77     return pa_xmalloc0(n*k);
78 }
79
80 /** Same as pa_xnew() but set the memory to zero */
81 #define pa_xnew0(type, n) ((type*) _pa_xnew0_internal((n), sizeof(type)))
82
83 /** Internal helper for pa_xnew0() */
84 static void* _pa_xnewdup_internal(const void *p, size_t n, size_t k) PA_GCC_MALLOC PA_GCC_ALLOC_SIZE2(2,3);
85
86 static inline void* _pa_xnewdup_internal(const void *p, size_t n, size_t k) {
87     assert(n < INT_MAX/k);
88     return pa_xmemdup(p, n*k);
89 }
90
91 /** Same as pa_xnew() but duplicate the specified data */
92 #define pa_xnewdup(type, p, n) ((type*) _pa_xnewdup_internal((p), (n), sizeof(type)))
93
94 /** Internal helper for pa_xrenew() */
95 static void* _pa_xrenew_internal(void *p, size_t n, size_t k) PA_GCC_MALLOC PA_GCC_ALLOC_SIZE2(2,3);
96
97 static inline void* _pa_xrenew_internal(void *p, size_t n, size_t k) {
98     assert(n < INT_MAX/k);
99     return pa_xrealloc(p, n*k);
100 }
101
102 /** Reallocate n new structures of the specified type. */
103 #define pa_xrenew(type, p, n) ((type*) _pa_xrenew_internal(p, (n), sizeof(type)))
104
105 PA_C_DECL_END
106
107 #endif