Enlightenment CVS committal

Author  : raster
Project : e17
Module  : libs/eet

Dir     : e17/libs/eet/src/lib


Modified Files:
        Eet.h eet_data.c 


Log Message:


support special strign and alloc methods

===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/eet/src/lib/Eet.h,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -3 -r1.27 -r1.28
--- Eet.h       27 Nov 2005 16:06:55 -0000      1.27
+++ Eet.h       30 Nov 2005 15:36:19 -0000      1.28
@@ -1,6 +1,8 @@
 #ifndef _EET_H
 #define _EET_H
 
+#include <stdlib.h>
+
 #ifdef EAPI
 #undef EAPI
 #endif
@@ -63,11 +65,34 @@
        EET_FILE_MODE_READ_WRITE
      };
 
-   typedef enum _Eet_File_Mode             Eet_File_Mode;
+   typedef enum _Eet_File_Mode               Eet_File_Mode;
 
-   typedef struct _Eet_File                Eet_File;
-   typedef struct _Eet_Data_Descriptor     Eet_Data_Descriptor;
+   typedef struct _Eet_File                  Eet_File;
+   typedef struct _Eet_Data_Descriptor       Eet_Data_Descriptor;
 
+   typedef struct _Eet_Data_Descriptor_Class Eet_Data_Descriptor_Class;
+   
+#define EET_DATA_DESCRIPTOR_CLASS_VERSION 1
+   struct _Eet_Data_Descriptor_Class
+     {
+       int         version;
+       const char *name;
+       int         size;
+       struct {
+          void   *(*mem_alloc) (size_t size);
+          void    (*mem_free) (void *mem);
+          char   *(*str_alloc) (const char *str);
+          void    (*str_free) (const char *str);
+          void   *(*list_next) (void *l);
+          void   *(*list_append) (void *l, void *d);
+          void   *(*list_data) (void *l);
+          void   *(*list_free) (void *l);
+          void    (*hash_foreach) (void *h, int (*func) (void *h, const char 
*k, void *dt, void *fdt), void *fdt);
+          void   *(*hash_add) (void *h, const char *k, void *d);
+          void    (*hash_free) (void *h);
+       } func;
+     };
+   
 /***************************************************************************/
 
    /**
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/eet/src/lib/eet_data.c,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -3 -r1.32 -r1.33
--- eet_data.c  29 Nov 2005 11:32:10 -0000      1.32
+++ eet_data.c  30 Nov 2005 15:36:19 -0000      1.33
@@ -81,6 +81,10 @@
    const char *name;
    int   size;
    struct {
+      void *(*mem_alloc) (size_t size);
+      void  (*mem_free) (void *mem);
+      char *(*str_alloc) (const char *str);
+      void  (*str_free) (const char *str);
       void *(*list_next) (void *l);
       void *(*list_append) (void *l, void *d);
       void *(*list_data) (void *l);
@@ -353,8 +357,7 @@
    p = s;
    len = 0;
    while ((p < (char *)src_end) && (*p != 0)) {len++; p++;}
-   str = malloc(len + 1);
-   if (!str) return -1;
+   str = alloca(len + 1);
    memcpy(str, s, len);
    str[len] = 0;
 
@@ -364,8 +367,7 @@
    sscanf(str, "%a", &tf);
    *d = (float)tf;
    if (prev_locale) setlocale(LC_NUMERIC, prev_locale);
-
-   free(str);
+   
    return len + 1;
 }
 
@@ -402,8 +404,7 @@
    p = s;
    len = 0;
    while ((p < (char *)src_end) && (*p != 0)) {len++; p++;}
-   str = malloc(len + 1);
-   if (!str) return -1;
+   str = alloca(len + 1);
    memcpy(str, s, len);
    str[len] = 0;
 
@@ -414,7 +415,6 @@
    *d = (double)tf;
    if (prev_locale) setlocale(LC_NUMERIC, prev_locale);
 
-   free(str);
    return len + 1;
 }
 
@@ -686,6 +686,30 @@
    return NULL;
 }
 
+static void *
+_eet_mem_alloc(size_t size)
+{
+   return calloc(1, size);
+}
+
+static void
+_eet_mem_free(void *mem)
+{
+   free(mem);
+}
+
+static char *
+_eet_str_alloc(const char *str)
+{
+   return strdup(str);
+}
+
+static void
+_eet_str_free(const char *str)
+{
+   free((char *)str);
+}
+
 /*---*/
 
 Eet_Data_Descriptor *
@@ -710,6 +734,10 @@
    edd = calloc(1, sizeof(Eet_Data_Descriptor));
    edd->name = name;
    edd->size = size;
+   edd->func.mem_alloc = _eet_mem_alloc;
+   edd->func.mem_free = _eet_mem_free;
+   edd->func.str_alloc = _eet_str_alloc;
+   edd->func.str_free = _eet_str_free;
    edd->func.list_next = func_list_next;
    edd->func.list_append = func_list_append;
    edd->func.list_data = func_list_data;
@@ -720,6 +748,39 @@
    return edd;
 }
 
+/* new replcement */
+Eet_Data_Descriptor *
+eet_data_descriptor2_new(Eet_Data_Descriptor_Class *eddc)
+{
+   Eet_Data_Descriptor *edd;
+
+   if (!eddc) return NULL;
+   edd = calloc(1, sizeof(Eet_Data_Descriptor));
+   if (eddc->version < 1) return edd;
+   edd->name = eddc->name;
+   edd->size = eddc->size;
+   edd->func.mem_alloc = _eet_mem_alloc;
+   edd->func.mem_free = _eet_mem_free;
+   edd->func.str_alloc = _eet_str_alloc;
+   edd->func.str_free = _eet_str_free;
+   if (eddc->func.mem_alloc)
+     edd->func.mem_alloc = eddc->func.mem_alloc;
+   if (eddc->func.mem_free)
+     edd->func.mem_free = eddc->func.mem_free;
+   if (eddc->func.str_alloc)
+     edd->func.str_alloc = eddc->func.str_alloc;
+   if (eddc->func.str_free)
+     edd->func.str_free = eddc->func.str_free;
+   edd->func.list_next = eddc->func.list_next;
+   edd->func.list_append = eddc->func.list_append;
+   edd->func.list_data = eddc->func.list_data;
+   edd->func.list_free = eddc->func.list_free;
+   edd->func.hash_foreach = eddc->func.hash_foreach;
+   edd->func.hash_add = eddc->func.hash_add;
+   edd->func.hash_free = eddc->func.hash_free;
+   return edd;
+}
+
 void
 eet_data_descriptor_free(Eet_Data_Descriptor *edd)
 {
@@ -848,13 +909,13 @@
 }
 
 static void
-_eet_freelist_free(void)
+_eet_freelist_free(Eet_Data_Descriptor *edd)
 {
    int i;
 
    if (freelist_ref > 0) return;
    for (i = 0; i < freelist_num; i++)
-     free(freelist[i]);
+     edd->func.mem_free(freelist[i]);
    _eet_freelist_reset();
 }
 
@@ -926,6 +987,56 @@
    freelist_list_ref--;
 }
 
+static int    freelist_str_ref = 0;
+static int    freelist_str_len = 0;
+static int    freelist_str_num = 0;
+static void **freelist_str = NULL;
+
+static void
+_eet_freelist_str_add(void *data)
+{
+   freelist_str_num++;
+   if (freelist_str_num > freelist_str_len)
+     {
+       freelist_str_len += 16;
+       freelist_str = realloc(freelist_str, freelist_str_len * sizeof(void *));
+     }
+   freelist_str[freelist_str_num - 1] = data;
+}
+
+static void
+_eet_freelist_str_reset(void)
+{
+   if (freelist_str_ref > 0) return;
+   freelist_str_len = 0;
+   freelist_str_num = 0;
+   if (freelist_str) free(freelist_str);
+   freelist_str = NULL;
+}
+
+static void
+_eet_freelist_str_free(Eet_Data_Descriptor *edd)
+{
+   int i;
+
+   if (freelist_str_ref > 0) return;
+   for (i = 0; i < freelist_str_num; i++)
+     edd->func.str_free(freelist_str[i]);
+   _eet_freelist_str_reset();
+}
+
+static void
+_eet_freelist_str_ref(void)
+{
+   freelist_str_ref++;
+}
+
+static void
+_eet_freelist_str_unref(void)
+{
+   freelist_str_ref--;
+}
+
 void *
 eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
                           void *data_in,
@@ -945,9 +1056,10 @@
        else words_bigendian = 0;
      }
 
-   data = calloc(1, edd->size);
+   data = edd->func.mem_alloc(edd->size);
    if (!data) return NULL;
    _eet_freelist_ref();
+   _eet_freelist_str_ref();
    _eet_freelist_list_ref();
    _eet_freelist_add(data);
    memset(&chnk, 0, sizeof(Eet_Data_Chunk));
@@ -955,8 +1067,10 @@
    if (!chnk.name)
      {
        _eet_freelist_unref();
+       _eet_freelist_str_unref();
        _eet_freelist_list_unref();
-       _eet_freelist_free();
+       _eet_freelist_free(edd);
+       _eet_freelist_str_free(edd);
        _eet_freelist_list_free(edd);
        return NULL;
      }
@@ -964,8 +1078,10 @@
      {
        free(chnk.name);
        _eet_freelist_unref();
+       _eet_freelist_str_unref();
        _eet_freelist_list_unref();
-       _eet_freelist_free();
+       _eet_freelist_free(edd);
+       _eet_freelist_str_free(edd);
        _eet_freelist_list_free(edd);
        return NULL;
      }
@@ -983,15 +1099,14 @@
        if (!echnk.name)
          {
             _eet_freelist_unref();
+            _eet_freelist_str_unref();
             _eet_freelist_list_unref();
-            _eet_freelist_free();
+            _eet_freelist_free(edd);
+            _eet_freelist_str_free(edd);
             _eet_freelist_list_free(edd);
             free(chnk.name);
             return NULL;
          }
-       /* FIXME: this is a linear search/match - speed up by putting in a
-        * hash lookup
-        */
        ede = _eet_descriptor_hash_find(edd, echnk.name);
        if (ede)
          {
@@ -1007,6 +1122,19 @@
                                               echnk.data,
                                               ((char *)echnk.data) + 
echnk.size,
                                               ((char *)data) + ede->offset);
+                      if (ede->type == EET_T_STRING)
+                        {
+                           char **str, *str2;
+                           
+                           str = (((char *)data) + ede->offset);
+                           if (*str)
+                             {
+                                str2 = edd->func.str_alloc(*str);
+                                free(*str);
+                                *str = str2;
+                                _eet_freelist_str_add(str2);
+                             }
+                        }
                    }
                  else if (ede->subtype)
                    {
@@ -1018,8 +1146,10 @@
                       if (!data_ret)
                         {
                            _eet_freelist_unref();
+                           _eet_freelist_str_unref();
                            _eet_freelist_list_unref();
-                           _eet_freelist_free();
+                           _eet_freelist_free(edd);
+                           _eet_freelist_str_free(edd);
                            _eet_freelist_list_free(edd);
                            free(chnk.name);
                            return NULL;
@@ -1062,8 +1192,10 @@
                                      if (ret <= 0)
                                        {
                                           _eet_freelist_unref();
+                                          _eet_freelist_str_unref();
                                           _eet_freelist_list_unref();
-                                          _eet_freelist_free();
+                                          _eet_freelist_free(edd);
+                                          _eet_freelist_str_free(edd);
                                           _eet_freelist_list_free(edd);
                                           free(chnk.name);
                                           return NULL;
@@ -1072,8 +1204,10 @@
                                 else
                                   {
                                      _eet_freelist_unref();
+                                     _eet_freelist_str_unref();
                                      _eet_freelist_list_unref();
-                                     _eet_freelist_free();
+                                     _eet_freelist_free(edd);
+                                     _eet_freelist_str_free(edd);
                                      _eet_freelist_list_free(edd);
                                      free(chnk.name);
                                      return NULL;
@@ -1094,8 +1228,10 @@
                            else
                              {
                                 _eet_freelist_unref();
+                                _eet_freelist_str_unref();
                                 _eet_freelist_list_unref();
-                                _eet_freelist_free();
+                                _eet_freelist_free(edd);
+                                _eet_freelist_str_free(edd);
                                 _eet_freelist_list_free(edd);
                                 free(chnk.name);
                                 return NULL;
@@ -1117,8 +1253,10 @@
      }
    free(chnk.name);
    _eet_freelist_unref();
+   _eet_freelist_str_unref();
    _eet_freelist_list_unref();
    _eet_freelist_reset();
+   _eet_freelist_str_reset();
    _eet_freelist_list_reset();
    return data;
 }




-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems?  Stop!  Download the new AJAX search engine that makes
searching your log files as easy as surfing the  web.  DOWNLOAD SPLUNK!
http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to