From 928765e4858b75765f12336b83c6e4a8ac99ed7c Mon Sep 17 00:00:00 2001 From: cedric Date: Thu, 23 Oct 2008 13:12:33 +0000 Subject: [PATCH] * Fix bug with string included in a list found by Viktor Kojouharov. * 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 | 39 +++++++++++++++++++++++++++++---------- src/tests/eet_suite.c | 17 +++++++++++++++++ 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/src/lib/eet_data.c b/src/lib/eet_data.c index 8f63940..92a93ab 100644 --- a/src/lib/eet_data.c +++ b/src/lib/eet_data.c @@ -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); + } } } diff --git a/src/tests/eet_suite.c b/src/tests/eet_suite.c index 400536a..631fd6b 100644 --- a/src/tests/eet_suite.c +++ b/src/tests/eet_suite.c @@ -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); -- 2.7.4