From 04edb0cbec34d6cf8585fbea1cbd1c2dd8aa9ce2 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Thu, 23 Oct 2008 14:41:04 +0000 Subject: [PATCH] * Fix Hash of String bug. * Add a test case for it. SVN revision: 37029 --- legacy/eet/src/lib/eet_data.c | 59 ++++++++++++++++++++------------ legacy/eet/src/tests/eet_suite.c | 29 +++++++++++++--- 2 files changed, 63 insertions(+), 25 deletions(-) diff --git a/legacy/eet/src/lib/eet_data.c b/legacy/eet/src/lib/eet_data.c index 92a93abfb5..2d60ede8cc 100644 --- a/legacy/eet/src/lib/eet_data.c +++ b/legacy/eet/src/lib/eet_data.c @@ -1400,22 +1400,28 @@ eet_data_descriptor_encode_hash_cb(void *hash __UNUSED__, const char *key, void data = NULL; } - EET_ASSERT(!IS_SIMPLE_TYPE(ede->type), return 1); + EET_ASSERT(!((ede->type > EET_T_UNKNOW) && (ede->type < EET_T_STRING)), return ); /* Store data */ - if (ede->subtype) - data = _eet_data_descriptor_encode(ed, - ede->subtype, - hdata, - &size); - if (data) + if (ede->type >= EET_T_STRING) + eet_data_put_unknown(ed, NULL, ede, ds, &hdata); + else { - echnk = eet_data_chunk_new(data, size, ede->name, ede->type, ede->group_type); - eet_data_chunk_put(ed, echnk, ds); - eet_data_chunk_free(echnk); - free(data); - data = NULL; + if (ede->subtype) + data = _eet_data_descriptor_encode(ed, + ede->subtype, + hdata, + &size); + if (data) + { + echnk = eet_data_chunk_new(data, size, ede->name, ede->type, ede->group_type); + eet_data_chunk_put(ed, echnk, ds); + eet_data_chunk_free(echnk); + free(data); + data = NULL; + } } + return 1; } @@ -2594,7 +2600,7 @@ eet_data_get_hash(const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_E void *data_ret = NULL; int ret = 0; - EET_ASSERT(!IS_SIMPLE_TYPE(type), return 0); + EET_ASSERT(!((type > EET_T_UNKNOW) && (type < EET_T_STRING)), return 0); ptr = (void **)data; hash = *ptr; @@ -2615,14 +2621,25 @@ eet_data_get_hash(const Eet_Dictionary *ed, Eet_Data_Descriptor *edd, Eet_Data_E eet_data_chunk_get(ed, echnk, *p, *size); if (!echnk->name) goto on_error; - data_ret = _eet_data_descriptor_decode(ed, - ede->subtype, - echnk->data, - echnk->size, - level + 2, - dumpfunc, - dumpdata); - if (!data_ret) goto on_error; + if (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) goto on_error; + } hash = edd->func.hash_add(hash, key, data_ret); *ptr = hash; diff --git a/legacy/eet/src/tests/eet_suite.c b/legacy/eet/src/tests/eet_suite.c index 631fd6bf1f..b8d3e32c5d 100644 --- a/legacy/eet/src/tests/eet_suite.c +++ b/legacy/eet/src/tests/eet_suite.c @@ -282,6 +282,7 @@ struct _Eet_Test_Ex_Type Eina_List *ilist; Eina_List *slist; Eina_Hash *ihash; + Eina_Hash *shash; Eet_Test_Basic_Type sarray1[10]; unsigned int sarray2[5]; unsigned int varray1_count; @@ -350,6 +351,9 @@ _eet_build_ex_descriptor(Eet_Data_Descriptor *edd) eet_data_descriptor_element_add(edd, "slist", EET_T_STRING, EET_G_LIST, (char *)(&(etbt.slist)) - (char *)(&(etbt)), 0, /* 0, */NULL, NULL); + eet_data_descriptor_element_add(edd, "shash", EET_T_STRING, EET_G_HASH, + (char *)(&(etbt.shash)) - (char *)(&(etbt)), + 0, /* 0, */NULL, NULL); } static Eet_Test_Ex_Type* @@ -379,6 +383,7 @@ _eet_test_ex_set(Eet_Test_Ex_Type *res, int offset) res->ilist = NULL; res->ihash = NULL; res->slist = NULL; + res->shash = NULL; res->varray2 = malloc(sizeof (Eet_Test_Basic_Type) * 10); res->varray1 = malloc(sizeof (int) * 5); @@ -495,7 +500,9 @@ 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")); + etbt.slist = eina_list_prepend(NULL, "test"); + etbt.shash = eina_hash_string_superfast_new(NULL); + eina_hash_add(etbt.shash, EET_TEST_KEY1, "test"); eet_test_setup_eddc(&eddc); eddc.name = "Eet_Test_Ex_Type"; @@ -518,6 +525,8 @@ START_TEST(eet_test_data_type_encoding_decoding) 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); + fail_if(eina_hash_find(result->shash, EET_TEST_KEY1) == NULL); + fail_if(strcmp(eina_hash_find(result->shash, EET_TEST_KEY1), "test") != 0); test = 0; eina_hash_foreach(result->hash, func, &test); @@ -572,7 +581,9 @@ 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")); + etbt.slist = eina_list_prepend(NULL, "test"); + etbt.shash = eina_hash_string_superfast_new(NULL); + eina_hash_add(etbt.shash, EET_TEST_KEY1, "test"); eet_test_setup_eddc(&eddc); eddc.name = "Eet_Test_Ex_Type"; @@ -609,6 +620,8 @@ START_TEST(eet_test_data_type_dump_undump) 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); + fail_if(eina_hash_find(result->shash, EET_TEST_KEY1) == NULL); + fail_if(strcmp(eina_hash_find(result->shash, EET_TEST_KEY1), "test") != 0); test = 0; eina_hash_foreach(result->hash, func, &test); @@ -707,7 +720,9 @@ 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")); + etbt.slist = eina_list_prepend(NULL, "test"); + etbt.shash = eina_hash_string_superfast_new(NULL); + eina_hash_add(etbt.shash, EET_TEST_KEY1, "test"); eet_test_setup_eddc(&eddc); eddc.name = "Eet_Test_Ex_Type"; @@ -775,6 +790,8 @@ START_TEST(eet_file_data_test) 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); + fail_if(eina_hash_find(result->shash, EET_TEST_KEY1) == NULL); + fail_if(strcmp(eina_hash_find(result->shash, EET_TEST_KEY1), "test") != 0); test = 0; eina_hash_foreach(result->hash, func, &test); @@ -840,7 +857,9 @@ 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")); + etbt.slist = eina_list_prepend(NULL, "test"); + etbt.hash = eina_hash_string_superfast_new(NULL); + eina_hash_add(etbt.shash, EET_TEST_KEY1, "test"); eet_test_setup_eddc(&eddc); eddc.name = "Eet_Test_Ex_Type"; @@ -888,6 +907,8 @@ START_TEST(eet_file_data_dump_test) 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); + fail_if(eina_hash_find(result->shash, EET_TEST_KEY1) == NULL); + fail_if(strcmp(eina_hash_find(result->shash, EET_TEST_KEY1), "test") != 0); test = 0; eina_hash_foreach(result->hash, func, &test);