Move common error code to the end of the function.

SVN revision: 27482
This commit is contained in:
Sebastian Dransfeld 2006-12-16 22:27:18 +00:00
parent aabc930623
commit 895ddf87be
1 changed files with 17 additions and 74 deletions

View File

@ -1041,27 +1041,8 @@ eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
_eet_freelist_add(data);
memset(&chnk, 0, sizeof(Eet_Data_Chunk));
eet_data_chunk_get(&chnk, data_in, size_in);
if (!chnk.name)
{
_eet_freelist_unref();
_eet_freelist_str_unref();
_eet_freelist_list_unref();
_eet_freelist_free(edd);
_eet_freelist_str_free(edd);
_eet_freelist_list_free(edd);
return NULL;
}
if (strcmp(chnk.name, edd->name))
{
free(chnk.name);
_eet_freelist_unref();
_eet_freelist_str_unref();
_eet_freelist_list_unref();
_eet_freelist_free(edd);
_eet_freelist_str_free(edd);
_eet_freelist_list_free(edd);
return NULL;
}
if (!chnk.name) goto error;
if (strcmp(chnk.name, edd->name)) goto error;
p = chnk.data;
size = size_in - (4 + 4 + strlen(chnk.name) + 1);
if (!edd->elements.hash.buckets) _eet_descriptor_hash_new(edd);
@ -1073,17 +1054,7 @@ eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
/* get next data chunk */
memset(&echnk, 0, sizeof(Eet_Data_Chunk));
eet_data_chunk_get(&echnk, p, size);
if (!echnk.name)
{
_eet_freelist_unref();
_eet_freelist_str_unref();
_eet_freelist_list_unref();
_eet_freelist_free(edd);
_eet_freelist_str_free(edd);
_eet_freelist_list_free(edd);
free(chnk.name);
return NULL;
}
if (!echnk.name) goto error;
ede = _eet_descriptor_hash_find(edd, echnk.name);
if (ede)
{
@ -1120,17 +1091,7 @@ eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
data_ret = eet_data_descriptor_decode(ede->subtype,
echnk.data,
echnk.size);
if (!data_ret)
{
_eet_freelist_unref();
_eet_freelist_str_unref();
_eet_freelist_list_unref();
_eet_freelist_free(edd);
_eet_freelist_str_free(edd);
_eet_freelist_list_free(edd);
free(chnk.name);
return NULL;
}
if (!data_ret) goto error;
ptr = (void **)(((char *)data) + ede->offset);
*ptr = (void *)data_ret;
}
@ -1166,29 +1127,10 @@ eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
echnk.data,
((char *)echnk.data) + echnk.size,
data_ret);
if (ret <= 0)
{
_eet_freelist_unref();
_eet_freelist_str_unref();
_eet_freelist_list_unref();
_eet_freelist_free(edd);
_eet_freelist_str_free(edd);
_eet_freelist_list_free(edd);
free(chnk.name);
return NULL;
}
if (ret <= 0) goto error;
}
else
{
_eet_freelist_unref();
_eet_freelist_str_unref();
_eet_freelist_list_unref();
_eet_freelist_free(edd);
_eet_freelist_str_free(edd);
_eet_freelist_list_free(edd);
free(chnk.name);
return NULL;
}
goto error;
}
else if (ede->subtype)
{
@ -1203,16 +1145,7 @@ eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
_eet_freelist_list_add(ptr);
}
else
{
_eet_freelist_unref();
_eet_freelist_str_unref();
_eet_freelist_list_unref();
_eet_freelist_free(edd);
_eet_freelist_str_free(edd);
_eet_freelist_list_free(edd);
free(chnk.name);
return NULL;
}
goto error;
}
break;
case EET_G_HASH:
@ -1236,6 +1169,16 @@ eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
_eet_freelist_str_reset();
_eet_freelist_list_reset();
return data;
error:
if (chnk.name) free(chnk.name);
_eet_freelist_unref();
_eet_freelist_str_unref();
_eet_freelist_list_unref();
_eet_freelist_free(edd);
_eet_freelist_str_free(edd);
_eet_freelist_list_free(edd);
return NULL;
}
EAPI void *