* Fix bug with string included in a list found by Viktor Kojouharov.
authorcedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Thu, 23 Oct 2008 13:12:33 +0000 (13:12 +0000)
committercedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Thu, 23 Oct 2008 13:12:33 +0000 (13:12 +0000)
* Add a test case for that one.

Problem was simple type inlining in complex structure (like list/hash/array) is
just a hack. We are creating a subtype with the data chunk. That work with INT
or SHORT for example, but not with STRING because it's a pointer to a STRING and
not directly the STRING. This result in a double pointer dereferencing where it
shouldn't. In fact STRING is not really like other simple data type. So we
should handle it differently.

Still need to fix Array and Hash.

git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/eet@37024 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/eet_data.c
src/tests/eet_suite.c

index 8f63940..92a93ab 100644 (file)
@@ -1124,7 +1124,7 @@ eet_data_descriptor_element_add(Eet_Data_Descriptor *edd,
     */
    if (group_type > EET_G_UNKNOWN
        && group_type < EET_G_LAST
-       && type != EET_T_UNKNOW
+       && type > EET_T_UNKNOW && type < EET_T_STRING
        && subtype == NULL)
      {
        subtype = calloc(1, sizeof (Eet_Data_Descriptor));
@@ -2555,14 +2555,25 @@ eet_data_get_list(const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_E
    void **ptr;
    void *data_ret;
 
-   EET_ASSERT(!IS_SIMPLE_TYPE(type), return 0);
+   EET_ASSERT(!((type > EET_T_UNKNOW) && (type < EET_T_STRING)), return 0);
 
    ptr = (void **)data;
    list = *ptr;
    data_ret = NULL;
 
-   data_ret = _eet_data_descriptor_decode(ed, ede->subtype, echnk->data, echnk->size, level + 2, dumpfunc, dumpdata);
-   if (!data_ret) return 0;
+   if (ede->type >= EET_T_STRING)
+     {
+       int ret;
+
+       ret = eet_data_get_unknown(ed, edd, ede, echnk, ede->type, EET_G_UNKNOWN,
+                                  &data_ret, level, dumpfunc, dumpdata, p, size);
+       if (!ret) return 0;
+     }
+   else
+     {
+       data_ret = _eet_data_descriptor_decode(ed, ede->subtype, echnk->data, echnk->size, level + 2, dumpfunc, dumpdata);
+       if (!data_ret) return 0;
+     }
 
    list = edd->func.list_append(list, data_ret);
    *ptr = list;
@@ -2832,16 +2843,24 @@ eet_data_put_list(Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_Element
    void *l;
    int size;
 
-   EET_ASSERT(!IS_SIMPLE_TYPE(ede->type), return );
+   EET_ASSERT(!((ede->type > EET_T_UNKNOW) && (ede->type < EET_T_STRING)), return );
 
    l = *((void **)(((char *)data_in)));
    for (; l; l = edd->func.list_next(l))
      {
-       data = _eet_data_descriptor_encode(ed,
-                                          ede->subtype,
-                                          edd->func.list_data(l),
-                                          &size);
-       if (data) eet_data_encode(ed, ds, data, ede->name, size, ede->type, ede->group_type);
+       if (ede->type >= EET_T_STRING)
+         {
+            const char *str = edd->func.list_data(l);
+            eet_data_put_unknown(ed, NULL, ede, ds, &str);
+         }
+       else
+         {
+            data = _eet_data_descriptor_encode(ed,
+                                               ede->subtype,
+                                               edd->func.list_data(l),
+                                               &size);
+            if (data) eet_data_encode(ed, ds, data, ede->name, size, ede->type, ede->group_type);
+         }
      }
 }
 
index 400536a..631fd6b 100644 (file)
@@ -280,6 +280,7 @@ struct _Eet_Test_Ex_Type
    Eina_List *list;
    Eina_Hash *hash;
    Eina_List *ilist;
+   Eina_List *slist;
    Eina_Hash *ihash;
    Eet_Test_Basic_Type sarray1[10];
    unsigned int sarray2[5];
@@ -346,6 +347,9 @@ _eet_build_ex_descriptor(Eet_Data_Descriptor *edd)
    eet_data_descriptor_element_add(edd, "ihash", EET_T_INT, EET_G_HASH,
                                   (char *)(&(etbt.ihash)) - (char *)(&(etbt)),
                                   0, /* 0,  */NULL, NULL);
+   eet_data_descriptor_element_add(edd, "slist", EET_T_STRING, EET_G_LIST,
+                                  (char *)(&(etbt.slist)) - (char *)(&(etbt)),
+                                  0, /* 0,  */NULL, NULL);
 }
 
 static Eet_Test_Ex_Type*
@@ -374,6 +378,7 @@ _eet_test_ex_set(Eet_Test_Ex_Type *res, int offset)
    res->hash = NULL;
    res->ilist = NULL;
    res->ihash = NULL;
+   res->slist = NULL;
 
    res->varray2 = malloc(sizeof (Eet_Test_Basic_Type) * 10);
    res->varray1 = malloc(sizeof (int) * 5);
@@ -490,6 +495,7 @@ START_TEST(eet_test_data_type_encoding_decoding)
    etbt.ilist = eina_list_prepend(etbt.ilist, &i42);
    etbt.ihash = eina_hash_string_superfast_new(NULL);
    eina_hash_add(etbt.ihash, EET_TEST_KEY1, &i7);
+   etbt.slist = eina_list_prepend(NULL, strdup("test"));
 
    eet_test_setup_eddc(&eddc);
    eddc.name = "Eet_Test_Ex_Type";
@@ -510,6 +516,8 @@ START_TEST(eet_test_data_type_encoding_decoding)
    fail_if(_eet_test_ex_check(eina_list_data_get(result->list), 1) != 0);
    fail_if(eina_list_data_get(result->ilist) == NULL);
    fail_if(*((int*)eina_list_data_get(result->ilist)) != 42);
+   fail_if(eina_list_data_get(result->slist) == NULL);
+   fail_if(strcmp(eina_list_data_get(result->slist), "test") != 0);
 
    test = 0;
    eina_hash_foreach(result->hash, func, &test);
@@ -564,6 +572,7 @@ START_TEST(eet_test_data_type_dump_undump)
    eina_hash_add(etbt.ihash, EET_TEST_KEY1, &i7);
    etbt.ihash = eina_hash_string_superfast_new(NULL);
    eina_hash_add(etbt.ihash, EET_TEST_KEY2, &i7);
+   etbt.slist = eina_list_prepend(NULL, strdup("test"));
 
    eet_test_setup_eddc(&eddc);
    eddc.name = "Eet_Test_Ex_Type";
@@ -598,6 +607,8 @@ START_TEST(eet_test_data_type_dump_undump)
    fail_if(_eet_test_ex_check(eina_list_data_get(result->list), 1) != 0);
    fail_if(eina_list_data_get(result->ilist) == NULL);
    fail_if(*((int*)eina_list_data_get(result->ilist)) != 42);
+   fail_if(eina_list_data_get(result->slist) == NULL);
+   fail_if(strcmp(eina_list_data_get(result->slist), "test") != 0);
 
    test = 0;
    eina_hash_foreach(result->hash, func, &test);
@@ -696,6 +707,7 @@ START_TEST(eet_file_data_test)
    eina_hash_add(etbt.ihash, EET_TEST_KEY1, &i7);
    etbt.ihash = eina_hash_string_superfast_new(NULL);
    eina_hash_add(etbt.ihash, EET_TEST_KEY2, &i7);
+   etbt.slist = eina_list_prepend(NULL, strdup("test"));
 
    eet_test_setup_eddc(&eddc);
    eddc.name = "Eet_Test_Ex_Type";
@@ -761,6 +773,8 @@ START_TEST(eet_file_data_test)
    fail_if(_eet_test_ex_check(eina_list_data_get(result->list), 1) != 0);
    fail_if(eina_list_data_get(result->ilist) == NULL);
    fail_if(*((int*)eina_list_data_get(result->ilist)) != 42);
+   fail_if(eina_list_data_get(result->slist) == NULL);
+   fail_if(strcmp(eina_list_data_get(result->slist), "test") != 0);
 
    test = 0;
    eina_hash_foreach(result->hash, func, &test);
@@ -826,6 +840,7 @@ START_TEST(eet_file_data_dump_test)
    eina_hash_add(etbt.ihash, EET_TEST_KEY1, &i7);
    etbt.ihash = eina_hash_string_superfast_new(NULL);
    eina_hash_add(etbt.ihash, EET_TEST_KEY2, &i7);
+   etbt.slist = eina_list_prepend(NULL, strdup("test"));
 
    eet_test_setup_eddc(&eddc);
    eddc.name = "Eet_Test_Ex_Type";
@@ -871,6 +886,8 @@ START_TEST(eet_file_data_dump_test)
    fail_if(_eet_test_ex_check(eina_list_data_get(result->list), 1) != 0);
    fail_if(eina_list_data_get(result->ilist) == NULL);
    fail_if(*((int*)eina_list_data_get(result->ilist)) != 42);
+   fail_if(eina_list_data_get(result->slist) == NULL);
+   fail_if(strcmp(eina_list_data_get(result->slist), "test") != 0);
 
    test = 0;
    eina_hash_foreach(result->hash, func, &test);