1 /* MikMod sound library
\r
2 (c) 1998, 1999 Miodrag Vallat and others - see file AUTHORS for
\r
5 This library is free software; you can redistribute it and/or modify
\r
6 it under the terms of the GNU Library General Public License as
\r
7 published by the Free Software Foundation; either version 2 of
\r
8 the License, or (at your option) any later version.
\r
10 This program is distributed in the hope that it will be useful,
\r
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
13 GNU Library General Public License for more details.
\r
15 You should have received a copy of the GNU Library General Public
\r
16 License along with this library; if not, write to the Free Software
\r
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
\r
21 /*==============================================================================
\r
23 $Id: mmalloc.c,v 1.1.1.1 2004/01/21 01:36:35 raph Exp $
\r
25 Dynamic memory routines
\r
27 ==============================================================================*/
\r
29 #ifdef HAVE_CONFIG_H
\r
33 #include "mikmod_internals.h"
\r
36 size_t mem_offset = 0;
\r
37 char *mallocbuf = NULL;
\r
38 size_t mallocbuflen = 0;
\r
41 size_t offsettable[OTMAX];
\r
44 size_t mikmod_get_mbuffsize(void *buff)
\r
48 for (i = 0; i < otcounter; i++)
\r
50 if (offsettable[i] == (size_t)buff - (size_t)mallocbuf)
\r
52 if (i < (otcounter - 1))
\r
54 return (size_t)(offsettable[i + 1] - offsettable[i]);
\r
56 else // i == (otcounter - 1)
\r
58 return mem_offset - offsettable[i];
\r
63 return 0; // i >= otcounter
\r
67 void mikmod_prepare_malloc(char *buff, int bufsize)
\r
70 mallocbuflen = bufsize;
\r
75 long mikmod_get_malloc_usage(void)
\r
80 int mikmod_abs(int num)
\r
88 void* mikmod_memset(char *buf, int val, size_t count)
\r
92 for (i = 0; i < count; i++)
\r
99 /* 'Poor man's malloc' taken from rockbox codeclib.c */
\r
100 void* mikmod_malloc(size_t size)
\r
106 if (mem_offset + (long)size > mallocbuflen)
\r
109 x = &mallocbuf[mem_offset];
\r
112 if (otcounter < OTMAX)
\r
114 offsettable[otcounter] = mem_offset;
\r
119 if (otcounter == OTMAX)
\r
121 rb->splash(HZ * 2, "Offset Table FULL !\n");
\r
124 mem_offset += (size + 3) & ~3; /* Keep memory 32-bit aligned */
\r
127 memset(x, 0, size);
\r
132 void* mikmod_calloc(size_t nmemb, size_t size)
\r
135 x = mikmod_malloc(nmemb * size);
\r
138 //memset(x, 0, nmemb*size);
\r
142 void mikmod_free(void* ptr) {
\r
146 void* mikmod_realloc(void* ptr, size_t size)
\r
150 x = mikmod_malloc(size);
\r
153 if (mikmod_get_mbuffsize(ptr))
\r
155 memcpy(x, ptr, mikmod_get_mbuffsize(ptr));
\r
159 memcpy(x, ptr, size); //FIXME: size has to be the size of the original buffer.....
\r
165 unsigned int mikmod_strlen(const char *string)
\r
168 for (i = 0; string[i] != 0; i++);
\r
172 char* mikmod_strdup(const char *srcbuf)
\r
175 unsigned int i, len;
\r
177 len = mikmod_strlen(srcbuf);
\r
178 newbuf = mikmod_malloc(len + 1);
\r
182 for (i = 0; i <= len; i++)
\r
183 newbuf[i] = srcbuf[i];
\r
188 char* mikmod_strncat(char *dest, const char *src, size_t count)
\r
191 j = mikmod_strlen(dest);
\r
193 for(i = 0; i < count; i++)
\r
197 dest[i + j] = src[i];
\r
202 int mikmod_memcmp(const char *buf1, const char *buf2, size_t count)
\r
206 for(i = 0; i < count; i++)
\r
208 if (buf1[i] > buf2[i])
\r
210 if (buf1[i] < buf2[i])
\r
216 char* mikmod_strstr(char *str, char *search)
\r
220 if (!mikmod_strlen(search))
\r
223 j = mikmod_strlen(str);
\r
224 k = mikmod_strlen(search);
\r
226 for (i = 0; i < (j - k); i++)
\r
228 if (!mikmod_memcmp(str, search, k))
\r
234 int mikmod_toupper(int character)
\r
236 if ((character > 96) && (character < 123))
\r
237 return (character - 32);
\r
242 int mikmod_isalnum(int character)
\r
244 if ((character > 96) && (character < 123))
\r
246 if ((character > 64) && (character < 91))
\r
248 if ((character > 47) && (character < 58))
\r
253 int mikmod_isdigit(char c)
\r
255 return (c >= '0') && (c <= '9');
\r
259 /****************************************************
\r
260 * 'Original' MikMod code goes here
\r
262 ****************************************************/
\r
264 /* Same as malloc, but sets error variable _mm_error when fails */
\r
265 void* _mm_malloc(size_t size)
\r
269 //if(!(d=mikmod_malloc(size))) {
\r
270 if(!(d=mikmod_malloc(size))) {
\r
271 _mm_errno = MMERR_OUT_OF_MEMORY;
\r
272 if(_mm_errorhandler) _mm_errorhandler();
\r
274 memset(d, 0, size);
\r
278 /* Same as calloc, but sets error variable _mm_error when fails */
\r
279 void* _mm_calloc(size_t nitems,size_t size)
\r
283 if(!(d=mikmod_calloc(nitems,size))) {
\r
284 _mm_errno = MMERR_OUT_OF_MEMORY;
\r
285 if(_mm_errorhandler) _mm_errorhandler();
\r