Enlightenment CVS committal

Author  : cedric
Project : e17
Module  : libs/eet

Dir     : e17/libs/eet/src/lib


Modified Files:
        eet_data.c 


Log Message:
Fix a bug with list or hash of basic type. They are now silently converted
to an implicit structure with the basic type inside.


===================================================================
RCS file: /cvs/e/e17/libs/eet/src/lib/eet_data.c,v
retrieving revision 1.77
retrieving revision 1.78
diff -u -3 -r1.77 -r1.78
--- eet_data.c  15 May 2008 14:03:09 -0000      1.77
+++ eet_data.c  15 May 2008 14:14:35 -0000      1.78
@@ -79,9 +79,10 @@
 
 struct _Eet_Data_Basic_Type_Decoder
 {
-   int     size;
-   int   (*get) (const Eet_Dictionary *ed, const void *src, const void 
*src_end, void *dest);
-   void *(*put) (Eet_Dictionary *ed, const void *src, int *size_ret);
+   int         size;
+   const char *name;
+   int       (*get) (const Eet_Dictionary *ed, const void *src, const void 
*src_end, void *dest);
+   void     *(*put) (Eet_Dictionary *ed, const void *src, int *size_ret);
 };
 
 struct _Eet_Data_Chunk
@@ -202,18 +203,18 @@
 
 const Eet_Data_Basic_Type_Decoder eet_coder[] =
 {
-     {sizeof(char),      eet_data_get_char,      eet_data_put_char     },
-     {sizeof(short),     eet_data_get_short,     eet_data_put_short    },
-     {sizeof(int),       eet_data_get_int,       eet_data_put_int      },
-     {sizeof(long long), eet_data_get_long_long, eet_data_put_long_long},
-     {sizeof(float),     eet_data_get_float,     eet_data_put_float    },
-     {sizeof(double),    eet_data_get_double,    eet_data_put_double   },
-     {sizeof(char),      eet_data_get_char,      eet_data_put_char     },
-     {sizeof(short),     eet_data_get_short,     eet_data_put_short    },
-     {sizeof(int),       eet_data_get_int,       eet_data_put_int      },
-     {sizeof(long long), eet_data_get_long_long, eet_data_put_long_long},
-     {sizeof(char *),    eet_data_get_string,    eet_data_put_string   },
-     {sizeof(char *),    eet_data_get_istring,   eet_data_put_istring  }
+     {sizeof(char),      "char",               eet_data_get_char,      
eet_data_put_char     },
+     {sizeof(short),     "short",              eet_data_get_short,     
eet_data_put_short    },
+     {sizeof(int),       "int",                eet_data_get_int,       
eet_data_put_int      },
+     {sizeof(long long), "long_long",          eet_data_get_long_long, 
eet_data_put_long_long},
+     {sizeof(float),     "float",              eet_data_get_float,     
eet_data_put_float    },
+     {sizeof(double),    "double",             eet_data_get_double,    
eet_data_put_double   },
+     {sizeof(char),      "uchar",      eet_data_get_char,      
eet_data_put_char     },
+     {sizeof(short),     "ushort",     eet_data_get_short,     
eet_data_put_short    },
+     {sizeof(int),       "uint",       eet_data_get_int,       
eet_data_put_int      },
+     {sizeof(long long), "ulong_long", eet_data_get_long_long, 
eet_data_put_long_long},
+     {sizeof(char *),    "string",             eet_data_get_string,    
eet_data_put_string   },
+     {sizeof(char *),    "inlined_string",     eet_data_get_istring,   
eet_data_put_istring  }
 };
 
 static int words_bigendian = -1;
@@ -1026,14 +1027,37 @@
                                Eet_Data_Descriptor *subtype)
 {
    Eet_Data_Element *ede;
+   Eet_Data_Descriptor *simple_type;
    /* int l1, l2, p1, p2, i;
    char *ps;*/
 
+   /* FIXME: Fail safely when realloc fail. */
    edd->elements.num++;
    edd->elements.set = realloc(edd->elements.set, edd->elements.num * 
sizeof(Eet_Data_Element));
    if (!edd->elements.set) return;
    ede = &(edd->elements.set[edd->elements.num - 1]);
    ede->name = name;
+
+   /*
+    * We do a special case when we do list,hash or whatever group of simple 
type.
+    * Instead of handling it in encode/decode/dump/undump, we create an
+    * implicit structure with only the simple type.
+    */
+   if (group_type > EET_G_UNKNOWN
+       && group_type < EET_G_LAST
+       && type != EET_T_UNKNOW
+       && subtype == NULL)
+     {
+       subtype = calloc(1, sizeof (Eet_Data_Descriptor));
+       if (!subtype) return ;
+       subtype->name = "implicit";
+       subtype->size = eet_coder[type - 1].size;
+       memcpy(&subtype->func, &edd->func, sizeof(subtype->func));
+
+       eet_data_descriptor_element_add(subtype, eet_coder[type - 1].name, type,
+                                       EET_G_UNKNOWN, 0, 0, NULL, NULL);
+       type = EET_T_UNKNOW;
+     }
 
    ede->type = type;
    ede->group_type = group_type;



-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft 
Defy all challenges. Microsoft(R) Visual Studio 2008. 
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to