Enlightenment CVS committal Author : rbdpngn Project : e17 Module : libs/eet
Dir : e17/libs/eet/src/lib Modified Files: eet_data.c Log Message: Use a pre-allocated buffer on the stack for storing temporary chunks. =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/eet/src/lib/eet_data.c,v retrieving revision 1.30 retrieving revision 1.31 diff -u -3 -r1.30 -r1.31 --- eet_data.c 27 Nov 2005 16:06:55 -0000 1.30 +++ eet_data.c 27 Nov 2005 18:54:02 -0000 1.31 @@ -132,7 +132,7 @@ static int eet_data_get_type(int type, void *src, void *src_end, void *dest); static void *eet_data_put_type(int type, void *src, int *size_ret); -static Eet_Data_Chunk *eet_data_chunk_get(void *src, int size); +static void eet_data_chunk_get(Eet_Data_Chunk *chnk, void *src, int size); static Eet_Data_Chunk *eet_data_chunk_new(void *data, int size, char *name); static void eet_data_chunk_free(Eet_Data_Chunk *chnk); @@ -466,45 +466,39 @@ * */ -static Eet_Data_Chunk * -eet_data_chunk_get(void *src, int size) +static void +eet_data_chunk_get(Eet_Data_Chunk *chnk, void *src, int size) { - Eet_Data_Chunk *chnk; char *s; int ret1, ret2; - if (!src) return NULL; - if (size <= 8) return NULL; + if (!src) return; + if (size <= 8) return; - chnk = calloc(1, sizeof(Eet_Data_Chunk)); - if (!chnk) return NULL; + if (!chnk) return; s = src; if ((s[0] != 'C') || (s[1] != 'H') || (s[2] != 'n') || (s[3] != 'K')) { - free(chnk); - return NULL; + return; } ret1 = eet_data_get_type(EET_T_INT, (void *)(s + 4), (void *)(s + size), &(chnk->size)); if (ret1 <= 0) { - free(chnk); - return NULL; + return; } if ((chnk->size < 0) || ((chnk->size + 8) > size)) { - free(chnk); - return NULL; + return; } ret2 = eet_data_get_type(EET_T_STRING, (void *)(s + 8), (void *)(s + size), &(chnk->name)); if (ret2 <= 0) { - free(chnk); - return NULL; + return; } chnk->data = (char *)src + 4 + ret1 + ret2; chnk->size -= ret2; - return chnk; + return; } static Eet_Data_Chunk * @@ -940,7 +934,7 @@ void *data; char *p; int size; - Eet_Data_Chunk *chnk; + Eet_Data_Chunk chnk; if (words_bigendian == -1) { @@ -956,8 +950,9 @@ _eet_freelist_ref(); _eet_freelist_list_ref(); _eet_freelist_add(data); - chnk = eet_data_chunk_get(data_in, size_in); - if (!chnk) + memset(&chnk, 0, sizeof(Eet_Data_Chunk)); + eet_data_chunk_get(&chnk, data_in, size_in); + if (!chnk.name) { _eet_freelist_unref(); _eet_freelist_list_unref(); @@ -965,38 +960,39 @@ _eet_freelist_list_free(edd); return NULL; } - if (strcmp(chnk->name, edd->name)) + if (strcmp(chnk.name, edd->name)) { - eet_data_chunk_free(chnk); + free(chnk.name); _eet_freelist_unref(); _eet_freelist_list_unref(); _eet_freelist_free(); _eet_freelist_list_free(edd); return NULL; } - p = chnk->data; - size = size_in - (4 + 4 + strlen(chnk->name) + 1); + p = chnk.data; + size = size_in - (4 + 4 + strlen(chnk.name) + 1); if (!edd->elements.hash.buckets) _eet_descriptor_hash_new(edd); while (size > 0) { - Eet_Data_Chunk *echnk; + Eet_Data_Chunk echnk; Eet_Data_Element *ede; /* get next data chunk */ - echnk = eet_data_chunk_get(p, size); - if (!echnk) + memset(&echnk, 0, sizeof(Eet_Data_Chunk)); + eet_data_chunk_get(&echnk, p, size); + if (!echnk.name) { _eet_freelist_unref(); _eet_freelist_list_unref(); _eet_freelist_free(); _eet_freelist_list_free(edd); - eet_data_chunk_free(chnk); + free(chnk.name); return NULL; } /* FIXME: this is a linear search/match - speed up by putting in a * hash lookup */ - ede = _eet_descriptor_hash_find(edd, echnk->name); + ede = _eet_descriptor_hash_find(edd, echnk.name); if (ede) { if (ede->group_type == EET_G_UNKNOWN) @@ -1008,8 +1004,8 @@ (ede->type <= EET_T_STRING)) { ret = eet_data_get_type(ede->type, - echnk->data, - ((char *)echnk->data) + echnk->size, + echnk.data, + ((char *)echnk.data) + echnk.size, ((char *)data) + ede->offset); } else if (ede->subtype) @@ -1017,15 +1013,15 @@ void **ptr; data_ret = eet_data_descriptor_decode(ede->subtype, - echnk->data, - echnk->size); + echnk.data, + echnk.size); if (!data_ret) { _eet_freelist_unref(); _eet_freelist_list_unref(); _eet_freelist_free(); _eet_freelist_list_free(edd); - eet_data_chunk_free(chnk); + free(chnk.name); return NULL; } ptr = (void **)(((char *)data) + ede->offset); @@ -1060,8 +1056,8 @@ { _eet_freelist_add(data_ret); ret = eet_data_get_type(ede->type, - echnk->data, - ((char *)echnk->data) + echnk->size, + echnk.data, + ((char *)echnk.data) + echnk.size, data_ret); if (ret <= 0) { @@ -1069,7 +1065,7 @@ _eet_freelist_list_unref(); _eet_freelist_free(); _eet_freelist_list_free(edd); - eet_data_chunk_free(chnk); + free(chnk.name); return NULL; } } @@ -1079,15 +1075,15 @@ _eet_freelist_list_unref(); _eet_freelist_free(); _eet_freelist_list_free(edd); - eet_data_chunk_free(chnk); + free(chnk.name); return NULL; } } else if (ede->subtype) { data_ret = eet_data_descriptor_decode(ede->subtype, - echnk->data, - echnk->size); + echnk.data, + echnk.size); } if (data_ret) { @@ -1101,7 +1097,7 @@ _eet_freelist_list_unref(); _eet_freelist_free(); _eet_freelist_list_free(edd); - eet_data_chunk_free(chnk); + free(chnk.name); return NULL; } } @@ -1115,11 +1111,11 @@ } } /* advance to next chunk */ - p += (4 + 4 + strlen(echnk->name) + 1 + echnk->size); - size -= (4 + 4 + strlen(echnk->name) + 1 + echnk->size); - eet_data_chunk_free(echnk); + p += (4 + 4 + strlen(echnk.name) + 1 + echnk.size); + size -= (4 + 4 + strlen(echnk.name) + 1 + echnk.size); + free(echnk.name); } - eet_data_chunk_free(chnk); + free(chnk.name); _eet_freelist_unref(); _eet_freelist_list_unref(); _eet_freelist_reset(); ------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Do you grep through log files for problems? Stop! Download the new AJAX search engine that makes searching your log files as easy as surfing the web. DOWNLOAD SPLUNK! http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs