Add "MikMod for Rockbox 0.1" from 2007-06-29
[mikmod-rockbox.git] / apps / plugins / mikmod / mmio / mmalloc.c
1 /*      MikMod sound library\r
2         (c) 1998, 1999 Miodrag Vallat and others - see file AUTHORS for\r
3         complete list.\r
4 \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
9  \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
14  \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
18         02111-1307, USA.\r
19 */\r
20 \r
21 /*==============================================================================\r
22 \r
23   $Id: mmalloc.c,v 1.1.1.1 2004/01/21 01:36:35 raph Exp $\r
24 \r
25   Dynamic memory routines\r
26 \r
27 ==============================================================================*/\r
28 \r
29 #ifdef HAVE_CONFIG_H\r
30 #include "config.h"\r
31 #endif\r
32 \r
33 #include "mikmod_internals.h"\r
34 \r
35 \r
36 size_t mem_offset = 0;\r
37 char *mallocbuf = NULL;\r
38 size_t mallocbuflen = 0;\r
39 \r
40 \r
41 size_t mikmod_get_mbuffsize(size_t *buff)\r
42 {\r
43         return buff[-1];\r
44 }\r
45 \r
46 \r
47 void mikmod_prepare_malloc(char *buff, int bufsize)\r
48 {\r
49         mallocbuf = buff;\r
50         mallocbuflen = bufsize;\r
51         mem_offset = 0;\r
52 }\r
53 \r
54 long mikmod_get_malloc_usage(void)\r
55 {\r
56         return mem_offset;\r
57 }\r
58 \r
59 int mikmod_abs(int num)\r
60 {\r
61         if (num < 0)\r
62                 return (num * -1);\r
63         else\r
64                 return (num);\r
65 }\r
66 \r
67 void* mikmod_memset(char *buf, int val, size_t count)\r
68 {\r
69         size_t i;\r
70 \r
71         for (i = 0; i < count; i++)\r
72         {\r
73                 buf[i] = val;\r
74         }\r
75         return buf;\r
76 }\r
77 \r
78 /* 'Poor man's malloc' taken from rockbox codeclib.c */\r
79 void* mikmod_malloc(size_t size)\r
80 {\r
81     void* x;\r
82 \r
83         if (!mallocbuf)\r
84                 return NULL;\r
85     if (mem_offset + (long)size + 4 > mallocbuflen)\r
86         return NULL;\r
87 \r
88         mem_offset += 4;\r
89 \r
90     x = &mallocbuf[mem_offset];\r
91         ((size_t*)x)[-1] = size;\r
92 \r
93         mem_offset += (size + 3) & ~3; /* Keep memory 32-bit aligned */\r
94 \r
95 \r
96         memset(x, 0, size);\r
97 \r
98     return(x);\r
99 }\r
100 \r
101 void* mikmod_calloc(size_t nmemb, size_t size)\r
102 {\r
103     void *x;\r
104     x = mikmod_malloc(nmemb * size);\r
105     if (x == NULL)\r
106         return NULL;\r
107     //memset(x, 0, nmemb*size); /* already done in mikmod_malloc() */\r
108     return(x);\r
109 }\r
110 \r
111 void mikmod_free(void* ptr) {\r
112     (void)ptr;\r
113 }\r
114 \r
115 void* mikmod_realloc(void* ptr, size_t size)\r
116 {\r
117     void* x;\r
118     //(void)ptr;\r
119     x = mikmod_malloc(size);\r
120         if (ptr != NULL)\r
121         {\r
122                 if (mikmod_get_mbuffsize(ptr) < size)\r
123                 {\r
124                         memcpy(x, ptr, mikmod_get_mbuffsize(ptr));\r
125                 }\r
126                 else\r
127                 {\r
128                         memcpy(x, ptr, size);\r
129                 }\r
130         }\r
131     return(x);\r
132 }\r
133 \r
134 unsigned int mikmod_strlen(const char *string)\r
135 {\r
136         unsigned int i;\r
137         for (i = 0; string[i] != 0; i++);\r
138         return i;\r
139 }\r
140 \r
141 char* mikmod_strdup(const char *srcbuf)\r
142 {\r
143         char *newbuf;\r
144         unsigned int i, len;\r
145 \r
146         len = mikmod_strlen(srcbuf);\r
147         newbuf = mikmod_malloc(len + 1);\r
148         \r
149         if (newbuf)\r
150         {\r
151                 for (i = 0; i <= len; i++)\r
152                         newbuf[i] = srcbuf[i];\r
153         }\r
154         return newbuf;\r
155 }\r
156 \r
157 char* mikmod_strncat(char *dest, const char *src, size_t count)\r
158 {\r
159         size_t i, j;\r
160         j = mikmod_strlen(dest);\r
161 \r
162         for(i = 0; i < count; i++)\r
163         {\r
164                 if (src[i] == 0)\r
165                         break;\r
166                 dest[i + j] = src[i];\r
167         }\r
168         return dest;\r
169 }\r
170 \r
171 int mikmod_memcmp(const char *buf1, const char *buf2, size_t count)\r
172 {\r
173         size_t i;\r
174 \r
175         for(i = 0; i < count; i++)\r
176         {\r
177                 if (buf1[i] > buf2[i])\r
178                         return 1;\r
179                 if (buf1[i] < buf2[i])\r
180                         return -1;\r
181         }\r
182         return 0;\r
183 }\r
184 \r
185 char* mikmod_strstr(char *str, char *search)\r
186 {\r
187         size_t i, j, k;\r
188 \r
189         if (!mikmod_strlen(search))\r
190                 return str;\r
191 \r
192         j = mikmod_strlen(str);\r
193         k = mikmod_strlen(search);\r
194 \r
195         for (i = 0; i < (j - k); i++)\r
196         {\r
197                 if (!mikmod_memcmp(str, search, k))\r
198                         return &str[i];\r
199         }\r
200         return NULL;\r
201 }\r
202 \r
203 int mikmod_toupper(int character)\r
204 {\r
205         if ((character > 96) && (character < 123))\r
206                 return (character - 32);\r
207         else\r
208                 return character;\r
209 }\r
210 \r
211 int mikmod_isalnum(int character)\r
212 {\r
213         if ((character > 96) && (character < 123))\r
214                 return character;\r
215         if ((character > 64) && (character < 91))\r
216                 return character;\r
217         if ((character > 47) && (character < 58))\r
218                 return character;\r
219         return 0;\r
220 }\r
221 \r
222 int mikmod_isdigit(char c)\r
223 {\r
224     return (c >= '0') && (c <= '9');\r
225 }\r
226 \r
227 \r
228 /****************************************************\r
229  * 'Original' MikMod code goes here\r
230  *\r
231  ****************************************************/\r
232 \r
233 /* Same as malloc, but sets error variable _mm_error when fails */\r
234 void* _mm_malloc(size_t size)\r
235 {\r
236         void *d;\r
237 \r
238         //if(!(d=mikmod_malloc(size))) {\r
239         if(!(d=mikmod_malloc(size))) {\r
240                 _mm_errno = MMERR_OUT_OF_MEMORY;\r
241                 if(_mm_errorhandler) _mm_errorhandler();\r
242         }\r
243         memset(d, 0, size);\r
244         return d;\r
245 }\r
246 \r
247 /* Same as calloc, but sets error variable _mm_error when fails */\r
248 void* _mm_calloc(size_t nitems,size_t size)\r
249 {\r
250         void *d;\r
251    \r
252         if(!(d=mikmod_calloc(nitems,size))) {\r
253                 _mm_errno = MMERR_OUT_OF_MEMORY;\r
254                 if(_mm_errorhandler) _mm_errorhandler();\r
255         }\r
256         return d;\r
257 }\r
258 \r
259 /* ex:set ts=4: */\r