Add "MikMod for Rockbox 0.1" from 2007-06-29
[mikmod-rockbox.git] / apps / plugins / mikmod / mmio / mmalloc.c
diff --git a/apps/plugins/mikmod/mmio/mmalloc.c b/apps/plugins/mikmod/mmio/mmalloc.c
new file mode 100644 (file)
index 0000000..7f7fdbf
--- /dev/null
@@ -0,0 +1,259 @@
+/*     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
+\r
+size_t mikmod_get_mbuffsize(size_t *buff)\r
+{\r
+       return buff[-1];\r
+}\r
+\r
+\r
+void mikmod_prepare_malloc(char *buff, int bufsize)\r
+{\r
+       mallocbuf = buff;\r
+       mallocbuflen = bufsize;\r
+       mem_offset = 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 + 4 > mallocbuflen)\r
+        return NULL;\r
+\r
+       mem_offset += 4;\r
+\r
+    x = &mallocbuf[mem_offset];\r
+       ((size_t*)x)[-1] = size;\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); /* already done in mikmod_malloc() */\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) < size)\r
+               {\r
+                       memcpy(x, ptr, mikmod_get_mbuffsize(ptr));\r
+               }\r
+               else\r
+               {\r
+                       memcpy(x, ptr, size);\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