Enlightenment CVS committal Author : tsauerbeck Project : e17 Module : libs/eet
Dir : e17/libs/eet/src/lib Modified Files: eet_lib.c Log Message: more code cleanup =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/eet/src/lib/eet_lib.c,v retrieving revision 1.55 retrieving revision 1.56 diff -u -3 -r1.55 -r1.56 --- eet_lib.c 29 Nov 2005 11:44:51 -0000 1.55 +++ eet_lib.c 29 Nov 2005 18:49:30 -0000 1.56 @@ -80,6 +80,8 @@ static int eet_string_match(char *s1, char *s2); static int eet_hash_gen(char *key, int hash_size); static void eet_flush(Eet_File *ef); +static Eet_File_Node *find_node_by_name (Eet_File *ef, char *name); +static int read_data_from_disk(Eet_File *ef, Eet_File_Node *efn, void *buf, int len); /* cache. i don't expect this to ever be large, so arrays will do */ static int eet_writers_num = 0; @@ -784,123 +786,85 @@ { void *data = NULL; int size = 0; - int hash; Eet_File_Node *efn; + if (size_ret) *size_ret = 0; + /* check to see its' an eet file pointer */ if ((!ef) || (ef->magic != EET_MAGIC_FILE) || (!name) || ((ef->mode != EET_FILE_MODE_READ) && (ef->mode != EET_FILE_MODE_READ_WRITE))) { - if (size_ret) *size_ret = 0; return NULL; } /* no header, return NULL */ if (!ef->header) return NULL; /* no directory, return NULL */ if (!ef->header->directory) return NULL; - /* get hash bucket this should be in */ - hash = eet_hash_gen(name, ef->header->directory->size); + /* hunt hash bucket */ - for (efn = ef->header->directory->nodes[hash]; efn; efn = efn->next) + efn = find_node_by_name(ef, name); + if (!efn) return NULL; + + /* get size (uncompressed, if compressed at all) */ + size = efn->data_size; + + /* allocate data */ + data = malloc(size); + if (!data) return NULL; + + /* uncompressed data */ + if (efn->compression == 0) { - /* if it matches */ - if (eet_string_match(efn->name, name)) + /* if we alreayd have the data in ram... copy that */ + if (efn->data) + memcpy(data, efn->data, efn->size); + else if (!read_data_from_disk(ef, efn, data, size)) + { + free(data); + return NULL; + } + } + /* compressed data */ + else + { + void *tmp_data; + int free_tmp = 0, compr_size = efn->size; + uLongf dlen; + + /* if we already have the data in ram... copy that */ + if (efn->data) + tmp_data = efn->data; + else { - /* uncompressed data */ - if (efn->compression == 0) + tmp_data = malloc(compr_size); + if (!tmp_data) { - /* get size */ - size = efn->size; - /* allocate data */ - data = malloc(size); - if (data) - { - /* if we alreayd have the data in ram... copy that */ - if (efn->data) - memcpy(data, efn->data, efn->size); - /* or get data from disk */ - else - { - /* seek to data location */ - if (fseek(ef->fp, efn->offset, SEEK_SET) < 0) - { - free(data); - data = NULL; - break; - } - /* read it */ - if (fread(data, size, 1, ef->fp) != 1) - { - free(data); - data = NULL; - break; - } - } - } - break; + free(data); + return NULL; } - /* compressed data */ - else - { - void *tmp_data; - int free_tmp = 0, compr_size = efn->size; - uLongf dlen; - - /* get size uncompressed */ - size = efn->data_size; - /* allocate data */ - data = malloc(size); - if (!data) break; - - /* if we already have the data in ram... copy that */ - if (efn->data) - tmp_data = efn->data; - else - { - tmp_data = malloc(compr_size); - if (!tmp_data) - { - free(data); - data = NULL; - break; - } - - free_tmp = 1; - - /* get data from disk */ - /* seek to data location */ - if (fseek(ef->fp, efn->offset, SEEK_SET) < 0) - { - free(tmp_data); - free(data); - data = NULL; - break; - } - /* read it */ - if (fread(tmp_data, compr_size, 1, ef->fp) != 1) - { - free(tmp_data); - free(data); - data = NULL; - break; - } - } - /* decompress it */ - dlen = size; - if (uncompress((Bytef *)data, &dlen, - tmp_data, (uLongf)compr_size)) - { - free(data); - data = NULL; - } + free_tmp = 1; - if (free_tmp) free(tmp_data); - break; + if (!read_data_from_disk(ef, efn, tmp_data, compr_size)) + { + free(data); + return NULL; } } + + /* decompress it */ + dlen = size; + if (uncompress((Bytef *)data, &dlen, + tmp_data, (uLongf)compr_size)) + { + free(data); + return NULL; + } + + if (free_tmp) free(tmp_data); } + /* fill in return values */ if (size_ret) *size_ret = size; return data; @@ -1147,3 +1111,28 @@ return ret; } + +static Eet_File_Node * +find_node_by_name(Eet_File *ef, char *name) +{ + Eet_File_Node *efn; + int hash; + + /* get hash bucket this should be in */ + hash = eet_hash_gen(name, ef->header->directory->size); + + for (efn = ef->header->directory->nodes[hash]; efn; efn = efn->next) + if (eet_string_match(efn->name, name)) return efn; + + return NULL; +} + +static int +read_data_from_disk(Eet_File *ef, Eet_File_Node *efn, void *buf, int len) +{ + /* seek to data location */ + if (fseek(ef->fp, efn->offset, SEEK_SET) < 0) return 0; + + /* read it */ + return (fread(buf, len, 1, ef->fp) == 1); +} ------------------------------------------------------- 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