diff --git a/lib/skin_parser/skin_buffer.c b/lib/skin_parser/skin_buffer.c
index ecfe04b..9aa43ab 100644
--- a/lib/skin_parser/skin_buffer.c
+++ b/lib/skin_parser/skin_buffer.c
@@ -27,16 +27,50 @@
#include "skin_buffer.h"
#ifdef ROCKBOX
+# if (CONFIG_PLATFORM&PLATFORM_HOSTED)
+# define USE_HOST_MALLOC
+# else
+# define USE_ROCKBOX_ALLOC
+# endif
+#endif
+
+#ifdef USE_ROCKBOX_ALLOC
static size_t buf_size;
static unsigned char *buffer_start = NULL;
static unsigned char *buffer_front = NULL;
#endif
+#ifdef USE_HOST_MALLOC
+
+struct malloc_object {
+ void* object;
+ struct malloc_object *next;
+};
+struct malloc_object *first = NULL, *last = NULL;
+
+void skin_free_malloced(void)
+{
+ struct malloc_object *obj = first, this;
+ while (obj)
+ {
+ this = obj;
+ obj = this->next;
+ free(this->object);
+ free(this->next);
+ }
+ first = NULL;
+ last = NULL;
+}
+
+#endif
+
void skin_buffer_init(char* buffer, size_t size)
{
-#if defined(ROCKBOX)
+#ifdef USE_ROCKBOX_ALLOC
buffer_start = buffer_front = buffer;
buf_size = size;
+#elif defined(USE_HOST_MALLOC)
+ skin_free_malloced();
#endif
}
@@ -44,13 +78,22 @@ void skin_buffer_init(char* buffer, size_t size)
void* skin_buffer_alloc(size_t size)
{
void *retval = NULL;
-#ifdef ROCKBOX
+#ifdef USE_ROCKBOX_ALLOC
/* 32-bit aligned */
size = (size + 3) & ~3;
if (size > skin_buffer_freespace())
return NULL;
retval = buffer_front;
buffer_front += size;
+#elif defined(USE_HOST_MALLOC)
+ struct malloc_object *obj = malloc(sizeof (struct malloc_object));
+ obj->object = malloc(size);
+ obj->next = NULL;
+ if (last == NULL)
+ first = last = obj;
+ else
+ last->next = obj;
+ retval = obj->object;
#else
retval = malloc(size);
#endif
@@ -58,7 +101,7 @@ void* skin_buffer_alloc(size_t size)
}
-#ifdef ROCKBOX
+#ifdef USE_ROCKBOX_ALLOC
/* get the number of bytes currently being used */
size_t skin_buffer_usage(void)
{