* Fix Hash of String bug.

* Add a test case for it.



SVN revision: 37029
This commit is contained in:
Cedric BAIL 2008-10-23 14:41:04 +00:00
parent 5c096e9ddb
commit 04edb0cbec
2 changed files with 63 additions and 25 deletions

View File

@ -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;

View File

@ -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);