--- /dev/null
+/* MikMod sound library\r
+ (c) 1998, 1999 Miodrag Vallat and others - see file AUTHORS for\r
+ complete list.\r
+\r
+ This library is free software; you can redistribute it and/or modify\r
+ it under the terms of the GNU Library General Public License as\r
+ published by the Free Software Foundation; either version 2 of\r
+ the License, or (at your option) any later version.\r
+ \r
+ This program is distributed in the hope that it will be useful,\r
+ but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ GNU Library General Public License for more details.\r
+ \r
+ You should have received a copy of the GNU Library General Public\r
+ License along with this library; if not, write to the Free Software\r
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA\r
+ 02111-1307, USA.\r
+*/\r
+\r
+/*==============================================================================\r
+\r
+ $Id: mmalloc.c,v 1.1.1.1 2004/01/21 01:36:35 raph Exp $\r
+\r
+ Dynamic memory routines\r
+\r
+==============================================================================*/\r
+\r
+#ifdef HAVE_CONFIG_H\r
+#include "config.h"\r
+#endif\r
+\r
+#include "mikmod_internals.h"\r
+\r
+\r
+size_t mem_offset = 0;\r
+char *mallocbuf = NULL;\r
+size_t mallocbuflen = 0;\r
+\r
+#define OTMAX 8192\r
+size_t offsettable[OTMAX];\r
+int otcounter = 0;\r
+\r
+size_t mikmod_get_mbuffsize(void *buff)\r
+{\r
+ int i;\r
+\r
+ for (i = 0; i < otcounter; i++)\r
+ {\r
+ if (offsettable[i] == (size_t)buff - (size_t)mallocbuf)\r
+ {\r
+ if (i < (otcounter - 1))\r
+ {\r
+ return (size_t)(offsettable[i + 1] - offsettable[i]);\r
+ }\r
+ else // i == (otcounter - 1)\r
+ {\r
+ return mem_offset - offsettable[i];\r
+ }\r
+ }\r
+ }\r
+\r
+ return 0; // i >= otcounter\r
+}\r
+\r
+\r
+void mikmod_prepare_malloc(char *buff, int bufsize)\r
+{\r
+ mallocbuf = buff;\r
+ mallocbuflen = bufsize;\r
+ mem_offset = 0;\r
+ otcounter = 0;\r
+}\r
+\r
+long mikmod_get_malloc_usage(void)\r
+{\r
+ return mem_offset;\r
+}\r
+\r
+int mikmod_abs(int num)\r
+{\r
+ if (num < 0)\r
+ return (num * -1);\r
+ else\r
+ return (num);\r
+}\r
+\r
+void* mikmod_memset(char *buf, int val, size_t count)\r
+{\r
+ size_t i;\r
+\r
+ for (i = 0; i < count; i++)\r
+ {\r
+ buf[i] = val;\r
+ }\r
+ return buf;\r
+}\r
+\r
+/* 'Poor man's malloc' taken from rockbox codeclib.c */\r
+void* mikmod_malloc(size_t size)\r
+{\r
+ void* x;\r
+\r
+ if (!mallocbuf)\r
+ return NULL;\r
+ if (mem_offset + (long)size > mallocbuflen)\r
+ return NULL;\r
+ \r
+ x = &mallocbuf[mem_offset];\r
+\r
+\r
+ if (otcounter < OTMAX)\r
+ {\r
+ offsettable[otcounter] = mem_offset;\r
+ otcounter++;\r
+ }\r
+ else\r
+ {\r
+ if (otcounter == OTMAX)\r
+ {\r
+ rb->splash(HZ * 2, "Offset Table FULL !\n");\r
+ }\r
+ }\r
+ mem_offset += (size + 3) & ~3; /* Keep memory 32-bit aligned */\r
+\r
+\r
+ memset(x, 0, size);\r
+\r
+ return(x);\r
+}\r
+\r
+void* mikmod_calloc(size_t nmemb, size_t size)\r
+{\r
+ void *x;\r
+ x = mikmod_malloc(nmemb * size);\r
+ if (x == NULL)\r
+ return NULL;\r
+ //memset(x, 0, nmemb*size);\r
+ return(x);\r
+}\r
+\r
+void mikmod_free(void* ptr) {\r
+ (void)ptr;\r
+}\r
+\r
+void* mikmod_realloc(void* ptr, size_t size)\r
+{\r
+ void* x;\r
+ //(void)ptr;\r
+ x = mikmod_malloc(size);\r
+ if (ptr != NULL)\r
+ {\r
+ if (mikmod_get_mbuffsize(ptr))\r
+ {\r
+ memcpy(x, ptr, mikmod_get_mbuffsize(ptr));\r
+ }\r
+ else\r
+ {\r
+ memcpy(x, ptr, size); //FIXME: size has to be the size of the original buffer.....\r
+ }\r
+ }\r
+ return(x);\r
+}\r
+\r
+unsigned int mikmod_strlen(const char *string)\r
+{\r
+ unsigned int i;\r
+ for (i = 0; string[i] != 0; i++);\r
+ return i;\r
+}\r
+\r
+char* mikmod_strdup(const char *srcbuf)\r
+{\r
+ char *newbuf;\r
+ unsigned int i, len;\r
+\r
+ len = mikmod_strlen(srcbuf);\r
+ newbuf = mikmod_malloc(len + 1);\r
+ \r
+ if (newbuf)\r
+ {\r
+ for (i = 0; i <= len; i++)\r
+ newbuf[i] = srcbuf[i];\r
+ }\r
+ return newbuf;\r
+}\r
+\r
+char* mikmod_strncat(char *dest, const char *src, size_t count)\r
+{\r
+ size_t i, j;\r
+ j = mikmod_strlen(dest);\r
+\r
+ for(i = 0; i < count; i++)\r
+ {\r
+ if (src[i] == 0)\r
+ break;\r
+ dest[i + j] = src[i];\r
+ }\r
+ return dest;\r
+}\r
+\r
+int mikmod_memcmp(const char *buf1, const char *buf2, size_t count)\r
+{\r
+ size_t i;\r
+\r
+ for(i = 0; i < count; i++)\r
+ {\r
+ if (buf1[i] > buf2[i])\r
+ return 1;\r
+ if (buf1[i] < buf2[i])\r
+ return -1;\r
+ }\r
+ return 0;\r
+}\r
+\r
+char* mikmod_strstr(char *str, char *search)\r
+{\r
+ size_t i, j, k;\r
+\r
+ if (!mikmod_strlen(search))\r
+ return str;\r
+\r
+ j = mikmod_strlen(str);\r
+ k = mikmod_strlen(search);\r
+\r
+ for (i = 0; i < (j - k); i++)\r
+ {\r
+ if (!mikmod_memcmp(str, search, k))\r
+ return &str[i];\r
+ }\r
+ return NULL;\r
+}\r
+\r
+int mikmod_toupper(int character)\r
+{\r
+ if ((character > 96) && (character < 123))\r
+ return (character - 32);\r
+ else\r
+ return character;\r
+}\r
+\r
+int mikmod_isalnum(int character)\r
+{\r
+ if ((character > 96) && (character < 123))\r
+ return character;\r
+ if ((character > 64) && (character < 91))\r
+ return character;\r
+ if ((character > 47) && (character < 58))\r
+ return character;\r
+ return 0;\r
+}\r
+\r
+int mikmod_isdigit(char c)\r
+{\r
+ return (c >= '0') && (c <= '9');\r
+}\r
+\r
+\r
+/****************************************************\r
+ * 'Original' MikMod code goes here\r
+ *\r
+ ****************************************************/\r
+\r
+/* Same as malloc, but sets error variable _mm_error when fails */\r
+void* _mm_malloc(size_t size)\r
+{\r
+ void *d;\r
+\r
+ //if(!(d=mikmod_malloc(size))) {\r
+ if(!(d=mikmod_malloc(size))) {\r
+ _mm_errno = MMERR_OUT_OF_MEMORY;\r
+ if(_mm_errorhandler) _mm_errorhandler();\r
+ }\r
+ memset(d, 0, size);\r
+ return d;\r
+}\r
+\r
+/* Same as calloc, but sets error variable _mm_error when fails */\r
+void* _mm_calloc(size_t nitems,size_t size)\r
+{\r
+ void *d;\r
+ \r
+ if(!(d=mikmod_calloc(nitems,size))) {\r
+ _mm_errno = MMERR_OUT_OF_MEMORY;\r
+ if(_mm_errorhandler) _mm_errorhandler();\r
+ }\r
+ return d;\r
+}\r
+\r
+/* ex:set ts=4: */\r