source: roaraudio/libroar/memmgr.c @ 4992:59dd7fe37631

Last change on this file since 4992:59dd7fe37631 was 4992:59dd7fe37631, checked in by phi, 13 years ago

STRDUP vs. STRNDUP

File size: 5.5 KB
Line 
1//memmgr.c:
2
3/*
4 *      Copyright (C) Philipp 'ph3-der-loewe' Schafft - 2010-2011
5 *
6 *  This file is part of libroar a part of RoarAudio,
7 *  a cross-platform sound system for both, home and professional use.
8 *  See README for details.
9 *
10 *  This file is free software; you can redistribute it and/or modify
11 *  it under the terms of the GNU General Public License version 3
12 *  as published by the Free Software Foundation.
13 *
14 *  libroar is distributed in the hope that it will be useful,
15 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 *  GNU General Public License for more details.
18 *
19 *  You should have received a copy of the GNU General Public License
20 *  along with this software; see the file COPYING.  If not, write to
21 *  the Free Software Foundation, 51 Franklin Street, Fifth Floor,
22 *  Boston, MA 02110-1301, USA.
23 *
24 *  NOTE for everyone want's to change something and send patches:
25 *  read README and HACKING! There a addition information on
26 *  the license of this document you need to read before you send
27 *  any patches.
28 *
29 *  NOTE for uses of non-GPL (LGPL,...) software using libesd, libartsc
30 *  or libpulse*:
31 *  The libs libroaresd, libroararts and libroarpulse link this lib
32 *  and are therefore GPL. Because of this it may be illigal to use
33 *  them with any software that uses libesd, libartsc or libpulse*.
34 */
35
36#include "libroar.h"
37
38#ifdef ROAR_USE_MEMMGR
39#define NULL_BUFFER_CONST "RoarAudio"
40static char _libroar_null_buffer[] = NULL_BUFFER_CONST; // A byte sequense >= 8 byte.
41
42static inline void _libroar_null_buffer_check(void) {
43 if ( memcmp(_libroar_null_buffer, NULL_BUFFER_CONST, sizeof(_libroar_null_buffer)) != 0 )
44  roar_panic(ROAR_FATAL_ERROR_MEMORY_CORRUPTION_GUARD, NULL);
45 memcpy(_libroar_null_buffer, NULL_BUFFER_CONST, sizeof(_libroar_null_buffer));
46}
47#endif
48
49#define _err(x) do { roar_err_set((x)); return NULL; } while (0)
50
51#ifdef ROAR_USE_MEMMGR
52void * roar_mm_calloc(size_t nmemb, size_t size) {
53 void * ret;
54
55 if ( nmemb == 0 || size == 0 ) {
56  _libroar_null_buffer_check();
57  return _libroar_null_buffer;
58 }
59
60#ifdef ROAR_HAVE_CALLOC
61 roar_err_clear_all();
62 ret = calloc(nmemb, size);
63
64 if ( ret == NULL )
65  roar_err_update();
66
67 return ret;
68#else
69 ret = roar_mm_malloc(nmemb*size);
70 if ( ret == NULL )
71  return NULL;
72
73 memset(ret, 0, nmemb*size);
74
75 return ret;
76#endif
77}
78
79void * roar_mm_malloc(size_t size) {
80 void * ret;
81
82 if ( size == 0 ) {
83  _libroar_null_buffer_check();
84  return _libroar_null_buffer;
85 }
86
87#ifdef ROAR_HAVE_MALLOC
88 roar_err_clear_all();
89 ret = malloc(size);
90
91 if ( ret == NULL )
92  roar_err_update();
93
94 return ret;
95#elif defined(ROAR_HAVE_CALLOC)
96 return roar_mm_calloc(1, size);
97#elif defined(ROAR_HAVE_REALLOC)
98 return roar_mm_realloc(NULL, size);
99#else
100 _err(ROAR_ERROR_NOSYS);
101#endif
102}
103
104int    roar_mm_free(void *ptr) {
105
106 if ( ptr == _libroar_null_buffer ) {
107  _libroar_null_buffer_check();
108  return 0;
109 }
110
111#ifdef ROAR_HAVE_FREE
112 free(ptr);
113 return 0;
114#elif defined(ROAR_HAVE_REALLOC)
115 if ( roar_mm_realloc(ptr, 0) != _libroar_null_buffer )
116  return -1;
117 return 0;
118#else
119 roar_err_set(ROAR_ERROR_NOSYS);
120 return -1;
121#endif
122}
123
124void * roar_mm_realloc(void *ptr, size_t size) {
125#ifdef ROAR_HAVE_REALLOC
126 void * ret;
127#endif
128
129 if ( ptr == NULL )
130  return roar_mm_malloc(size);
131
132 if ( size == 0 ) {
133  roar_mm_free(ptr);
134  _libroar_null_buffer_check();
135  return _libroar_null_buffer;
136 }
137
138#ifdef ROAR_HAVE_REALLOC
139 roar_err_clear_all();
140 ret = realloc(ptr, size);
141
142 if ( ret == NULL )
143  roar_err_update();
144
145 return ret;
146#else
147 _err(ROAR_ERROR_NOTSUP);
148#endif
149}
150#endif
151
152void * roar_mm_memdup(const void * s, size_t len) {
153 void * ret;
154
155 if ( s == NULL )
156  _err(ROAR_ERROR_FAULT);
157
158#ifdef ROAR_USE_MEMMGR
159 if ( len == 0 ) {
160  _libroar_null_buffer_check();
161  return _libroar_null_buffer;
162 }
163#endif
164
165 ret = roar_mm_malloc(len);
166
167 if ( ret == NULL )
168  return NULL;
169
170 memcpy(ret, s, len);
171
172 return ret;
173}
174
175void roar_mm_free_retvoid(void *ptr) {
176 roar_mm_free(ptr);
177}
178
179#if defined(ROAR_USE_MEMMGR) || !defined(ROAR_HAVE_STRDUP)
180char * roar_mm_strdup(const char *s) {
181 void * ret;
182#ifndef ROAR_HAVE_STRDUP
183 ssize_t len;
184#endif
185
186 if ( s == NULL )
187  _err(ROAR_ERROR_FAULT);
188
189#ifdef ROAR_HAVE_STRDUP
190 roar_err_clear_all();
191 ret = strdup(s);
192
193 if ( ret == NULL )
194  roar_err_update();
195#else
196 len = roar_mm_strlen(s);
197 if ( len == -1 )
198  return NULL;
199
200 ret = roar_mm_memdup(s, len+1);
201#endif
202
203 return ret;
204}
205#endif
206
207#if defined(ROAR_USE_MEMMGR) || !defined(ROAR_HAVE_STRNDUP)
208char *roar_mm_strndup(const char *s, size_t n) {
209 void * ret;
210#ifndef ROAR_HAVE_STRNDUP
211 ssize_t len;
212#endif
213
214 if ( s == NULL )
215  _err(ROAR_ERROR_FAULT);
216
217#ifdef ROAR_USE_MEMMGR
218 if ( n == 0 ) {
219  _libroar_null_buffer_check();
220  return _libroar_null_buffer;
221 }
222#endif
223
224#ifdef ROAR_HAVE_STRNDUP
225 roar_err_clear_all();
226 ret = strndup(s, n);
227
228 if ( ret == NULL )
229  roar_err_update();
230#else
231 len = roar_mm_strnlen(s, n);
232 if ( len == -1 )
233  return NULL;
234
235 ret = roar_mm_memdup(s, len+1);
236#endif
237
238 return ret;
239}
240#endif
241
242#ifndef ROAR_HAVE_STRLEN
243ssize_t roar_mm_strlen(const char *s) {
244 size_t ret = 0;
245
246 if ( s == NULL ) {
247  roar_err_set(ROAR_ERROR_FAULT);
248  return -1;
249 }
250
251 for (; *s != 0; s++, ret++);
252
253 return ret;
254}
255#endif
256
257ssize_t roar_mm_strnlen(const char *s, size_t maxlen) {
258 size_t ret = 0;
259
260 if ( s == NULL ) {
261  roar_err_set(ROAR_ERROR_FAULT);
262  return -1;
263 }
264
265#ifdef ROAR_HAVE_STRNLEN
266 ret = strnlen(s, maxlen);
267#else
268 for (; ret < maxlen && *s != 0; s++, ret++);
269#endif
270
271 if ( ret == maxlen ) {
272  roar_err_set(ROAR_ERROR_MSGSIZE);
273  return -1;
274 }
275
276 return ret;
277}
278
279//ll
Note: See TracBrowser for help on using the repository browser.